-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathopenapi.json
More file actions
1 lines (1 loc) · 457 KB
/
Copy pathopenapi.json
File metadata and controls
1 lines (1 loc) · 457 KB
1
{"components": {"schemas": {"ActionBlock": {"description": "Block for actions (instructions, extraction, manual, validation, code_execution, module_import).", "properties": {"file": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Canonical org file name for download_file / play_audio blocks in authored YAML/product payloads", "title": "File"}, "file_uri": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Resolved revyl-file:// URI for download_file / play_audio blocks", "title": "File Uri"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Unique identifier for the block (auto-generated if not provided)", "title": "Id"}, "module": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Canonical module name for module_import blocks in authored YAML/product payloads", "title": "Module"}, "module_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ID of the module to import (for module_import blocks)", "title": "Module Id"}, "script": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Canonical script name for code_execution blocks in authored YAML/product payloads", "title": "Script"}, "script_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Resolved script UUID for code_execution blocks", "title": "Script Id"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Authored step text or legacy payload. Optional for canonical reference blocks such as code_execution.script, module_import.module, download_file.file, and no-parameter manual steps.", "title": "Step Description"}, "step_type": {"anyOf": [{"type": "string"}, {"$ref": "#/components/schemas/StepType"}, {"type": "null"}], "description": "Type of step action (inferred when omitted)", "title": "Step Type"}, "type": {"description": "Must be one of: instructions, extraction, manual, validation, code_execution, module_import", "enum": ["instructions", "extraction", "manual", "validation", "code_execution", "module_import"], "title": "Type", "type": "string"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Name of the variable captured by extraction blocks", "title": "Variable Name"}, "variable_scope": {"anyOf": [{"enum": ["test", "global"], "type": "string"}, {"type": "null"}], "description": "Scope of the variable assigned by extraction or code-execution blocks. 'test' (or omitted) writes to the test-scoped variables table; 'global' writes to a pre-existing, non-secret org-level global variable.", "title": "Variable Scope"}}, "required": ["type"], "title": "ActionBlock", "type": "object"}, "ActionRange": {"description": "A contiguous range of source action indices.", "properties": {"end": {"description": "Inclusive end action_index", "title": "End", "type": "integer"}, "start": {"description": "Inclusive start action_index", "title": "Start", "type": "integer"}}, "required": ["start", "end"], "title": "ActionRange", "type": "object"}, "ActiveDeviceSessionItem": {"description": "Response model for a single active device session.", "properties": {"app_package": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Package"}, "can_cancel": {"default": false, "title": "Can Cancel", "type": "boolean"}, "can_interact": {"default": false, "title": "Can Interact", "type": "boolean"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "exploration_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Exploration Run Id"}, "has_test_execution": {"default": false, "title": "Has Test Execution", "type": "boolean"}, "id": {"title": "Id", "type": "string"}, "idle_timeout_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Idle Timeout Seconds"}, "interaction_disabled_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Interaction Disabled Reason"}, "lane_index": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Lane Index"}, "lane_role": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Lane Role"}, "last_activity_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Last Activity At"}, "org_id": {"title": "Org Id", "type": "string"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "platform": {"title": "Platform", "type": "string"}, "screen_height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Height"}, "screen_width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Width"}, "source": {"title": "Source", "type": "string"}, "source_metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Source Metadata"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"title": "Status", "type": "string"}, "test_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}, "test_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Name"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "user_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Email"}, "user_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Id"}, "whep_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Whep Url"}, "workflow_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["id", "org_id", "source", "platform", "status"], "title": "ActiveDeviceSessionItem", "type": "object"}, "ActiveDeviceSessionsResponse": {"description": "Response model for list of active device sessions.", "properties": {"concurrency_limit": {"default": 1, "title": "Concurrency Limit", "type": "integer"}, "org_id": {"title": "Org Id", "type": "string"}, "sessions": {"items": {"$ref": "#/components/schemas/ActiveDeviceSessionItem"}, "title": "Sessions", "type": "array"}}, "required": ["sessions", "org_id"], "title": "ActiveDeviceSessionsResponse", "type": "object"}, "AllPlatformTargets": {"description": "Device target configs for every supported platform.", "properties": {"platforms": {"additionalProperties": {"$ref": "#/components/schemas/PlatformTargetConfig"}, "description": "Keyed by lowercase platform name", "title": "Platforms", "type": "object"}}, "required": ["platforms"], "title": "AllPlatformTargets", "type": "object"}, "AppCreateRequest": {"description": "Request model for creating an app.", "properties": {"description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional description", "title": "Description"}, "name": {"description": "App name (e.g., 'iOS-Prod', 'Android-Staging')", "title": "Name", "type": "string"}, "platform": {"$ref": "#/components/schemas/AppPlatform", "description": "Platform type: iOS or Android"}}, "required": ["name", "platform"], "title": "AppCreateRequest", "type": "object"}, "AppPlatform": {"description": "Platform types for apps.", "enum": ["iOS", "Android"], "title": "AppPlatform", "type": "string"}, "AppPlatformCounts": {"description": "Per-platform app counts.", "properties": {"android": {"default": 0, "description": "Number of Android apps", "title": "Android", "type": "integer"}, "ios": {"default": 0, "description": "Number of iOS apps", "title": "Ios", "type": "integer"}, "total": {"default": 0, "description": "Total number of apps across all platforms", "title": "Total", "type": "integer"}}, "title": "AppPlatformCounts", "type": "object"}, "AppResponse": {"description": "Response model for an app.", "properties": {"attached_tests": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 0, "title": "Attached Tests"}, "attribution_ready": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Attribution Ready"}, "builds_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Builds Count"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "current_build_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Current Build Id"}, "current_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Version"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "expo_synced": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Expo Synced"}, "has_atlas": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether this app has renderable Atlas content. Populated by app collection endpoints; null when the caller did not request Atlas enrichment.", "title": "Has Atlas"}, "id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Id"}, "latest_build_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Latest Build Id"}, "latest_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Latest Version"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "pinned_tests": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 0, "title": "Pinned Tests"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "recent_executions": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 0, "title": "Recent Executions"}, "rolling_pass_rate": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Rolling Pass Rate"}, "static_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Static Url"}, "system_prompt": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "System Prompt"}, "versions_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 0, "title": "Versions Count"}}, "title": "AppResponse", "type": "object"}, "AsyncStatus": {"enum": ["initialized", "failed", "queued", "running", "completed", "cancelled", "initializing"], "title": "AsyncStatus", "type": "string"}, "AtlasAnnotationAgentKind": {"enum": ["codex", "claude_code", "cursor", "other"], "title": "AtlasAnnotationAgentKind", "type": "string"}, "AtlasAnnotationAnchor": {"description": "Immutable evidence anchor for a thread.\n\n``observation_id`` references an exact observation; observation ids are\nstable across Atlas reprocessing, and genuine evidence deletion cascades\nthe thread away entirely. Coordinates are normalized to ``[0, 1]``\nagainst the original screenshot dimensions captured at creation.", "properties": {"observation_id": {"title": "Observation Id", "type": "string"}, "screenshot_height": {"exclusiveMinimum": 0.0, "title": "Screenshot Height", "type": "integer"}, "screenshot_width": {"exclusiveMinimum": 0.0, "title": "Screenshot Width", "type": "integer"}, "space_version": {"default": 1, "minimum": 1.0, "title": "Space Version", "type": "integer"}, "x": {"maximum": 1.0, "minimum": 0.0, "title": "X", "type": "number"}, "y": {"maximum": 1.0, "minimum": 0.0, "title": "Y", "type": "number"}}, "required": ["observation_id", "x", "y", "screenshot_width", "screenshot_height"], "title": "AtlasAnnotationAnchor", "type": "object"}, "AtlasAnnotationAnchorMoveRequest": {"description": "Reposition a pin within the screenshot it already anchors to.\n\nCoordinates are normalized against the same screenshot the thread was\ncreated on; the observation itself is immutable (a pin never migrates to\ndifferent evidence). Guarded by the same optimistic version as status\ntransitions.", "properties": {"expected_version": {"description": "Thread version the client last observed; the move is rejected with a conflict when the thread moved past it.", "minimum": 1.0, "title": "Expected Version", "type": "integer"}, "x": {"maximum": 1.0, "minimum": 0.0, "title": "X", "type": "number"}, "y": {"maximum": 1.0, "minimum": 0.0, "title": "Y", "type": "number"}}, "required": ["x", "y", "expected_version"], "title": "AtlasAnnotationAnchorMoveRequest", "type": "object"}, "AtlasAnnotationAnchorPreviewRequest": {"properties": {"target": {"maxLength": 1000, "minLength": 1, "title": "Target", "type": "string"}}, "required": ["target"], "title": "AtlasAnnotationAnchorPreviewRequest", "type": "object"}, "AtlasAnnotationAnchorPreviewResponse": {"properties": {"normalized_x": {"maximum": 1.0, "minimum": 0.0, "title": "Normalized X", "type": "number"}, "normalized_y": {"maximum": 1.0, "minimum": 0.0, "title": "Normalized Y", "type": "number"}, "observation_id": {"title": "Observation Id", "type": "string"}, "pixel_x": {"minimum": 0.0, "title": "Pixel X", "type": "integer"}, "pixel_y": {"minimum": 0.0, "title": "Pixel Y", "type": "integer"}, "screenshot_height": {"exclusiveMinimum": 0.0, "title": "Screenshot Height", "type": "integer"}, "screenshot_width": {"exclusiveMinimum": 0.0, "title": "Screenshot Width", "type": "integer"}}, "required": ["observation_id", "pixel_x", "pixel_y", "normalized_x", "normalized_y", "screenshot_width", "screenshot_height"], "title": "AtlasAnnotationAnchorPreviewResponse", "type": "object"}, "AtlasAnnotationAuthor": {"description": "Author identity for authenticated org members.\n\n``user_id`` is the authenticated PropelAuth user id (authorization and\naudit key); ``display_name``/``avatar_url`` are snapshots taken at write\ntime so attribution survives membership changes.", "properties": {"agent_kind": {"anyOf": [{"$ref": "#/components/schemas/AtlasAnnotationAgentKind"}, {"type": "null"}]}, "avatar_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Avatar Url"}, "display_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Display Name"}, "user_id": {"title": "User Id", "type": "string"}}, "required": ["user_id"], "title": "AtlasAnnotationAuthor", "type": "object"}, "AtlasAnnotationComment": {"properties": {"attachments": {"items": {"$ref": "#/components/schemas/AtlasAttachment"}, "title": "Attachments", "type": "array"}, "author": {"$ref": "#/components/schemas/AtlasAnnotationAuthor"}, "body": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Plain-text body; null when the comment is a tombstone.", "title": "Body"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "deleted": {"default": false, "title": "Deleted", "type": "boolean"}, "edited_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Edited At"}, "id": {"title": "Id", "type": "string"}, "thread_id": {"title": "Thread Id", "type": "string"}}, "required": ["id", "thread_id", "author", "created_at"], "title": "AtlasAnnotationComment", "type": "object"}, "AtlasAnnotationCommentEditRequest": {"properties": {"add_attachment_ids": {"items": {"format": "uuid", "type": "string"}, "maxItems": 4, "title": "Add Attachment Ids", "type": "array"}, "body": {"anyOf": [{"maxLength": 10000, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Body"}, "clear_attachments": {"default": false, "title": "Clear Attachments", "type": "boolean"}, "remove_attachment_ids": {"items": {"format": "uuid", "type": "string"}, "maxItems": 4, "title": "Remove Attachment Ids", "type": "array"}}, "title": "AtlasAnnotationCommentEditRequest", "type": "object"}, "AtlasAnnotationCommentResponse": {"properties": {"comment": {"$ref": "#/components/schemas/AtlasAnnotationComment"}, "idempotent_replay": {"default": false, "title": "Idempotent Replay", "type": "boolean"}, "thread_last_activity_at": {"format": "date-time", "title": "Thread Last Activity At", "type": "string"}}, "required": ["comment", "thread_last_activity_at"], "title": "AtlasAnnotationCommentResponse", "type": "object"}, "AtlasAnnotationFeedbackItem": {"properties": {"anchor_x": {"title": "Anchor X", "type": "number"}, "anchor_y": {"title": "Anchor Y", "type": "number"}, "app_id": {"title": "App Id", "type": "string"}, "app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "atlas_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Atlas Url"}, "attachment_count": {"default": 0, "minimum": 0.0, "title": "Attachment Count", "type": "integer"}, "author": {"$ref": "#/components/schemas/AtlasAnnotationAuthor"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "last_activity_at": {"format": "date-time", "title": "Last Activity At", "type": "string"}, "node_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Node Id"}, "observation_id": {"title": "Observation Id", "type": "string"}, "observed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Observed At"}, "origin_surface": {"$ref": "#/components/schemas/AtlasAnnotationOriginSurface"}, "preview_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Preview Text"}, "reply_count": {"default": 0, "title": "Reply Count", "type": "integer"}, "screen_label": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screen Label"}, "screenshot_height": {"title": "Screenshot Height", "type": "integer"}, "screenshot_width": {"title": "Screenshot Width", "type": "integer"}, "source_report_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Report Url"}, "status": {"$ref": "#/components/schemas/AtlasAnnotationStatus"}, "thread_id": {"title": "Thread Id", "type": "string"}, "thumbnail_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Thumbnail Url"}, "version": {"minimum": 1.0, "title": "Version", "type": "integer"}}, "required": ["thread_id", "app_id", "observation_id", "status", "version", "origin_surface", "author", "created_at", "last_activity_at", "anchor_x", "anchor_y", "screenshot_width", "screenshot_height"], "title": "AtlasAnnotationFeedbackItem", "type": "object"}, "AtlasAnnotationFeedbackResponse": {"properties": {"closed_count": {"title": "Closed Count", "type": "integer"}, "items": {"items": {"$ref": "#/components/schemas/AtlasAnnotationFeedbackItem"}, "title": "Items", "type": "array"}, "next_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next Cursor"}, "open_count": {"title": "Open Count", "type": "integer"}}, "required": ["items", "open_count", "closed_count"], "title": "AtlasAnnotationFeedbackResponse", "type": "object"}, "AtlasAnnotationObservationThreadsResponse": {"properties": {"closed_count": {"title": "Closed Count", "type": "integer"}, "observation_id": {"title": "Observation Id", "type": "string"}, "open_count": {"title": "Open Count", "type": "integer"}, "threads": {"items": {"$ref": "#/components/schemas/AtlasAnnotationThread"}, "title": "Threads", "type": "array"}}, "required": ["observation_id", "threads", "open_count", "closed_count"], "title": "AtlasAnnotationObservationThreadsResponse", "type": "object"}, "AtlasAnnotationOriginSurface": {"enum": ["app_atlas", "report_atlas", "revyl_cli"], "title": "AtlasAnnotationOriginSurface", "type": "string"}, "AtlasAnnotationReplyRequest": {"properties": {"attachment_ids": {"items": {"format": "uuid", "type": "string"}, "maxItems": 4, "title": "Attachment Ids", "type": "array"}, "body": {"maxLength": 10000, "minLength": 1, "title": "Body", "type": "string"}, "client_request_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Client-generated UUID making retried submissions idempotent.", "title": "Client Request Id"}}, "required": ["body"], "title": "AtlasAnnotationReplyRequest", "type": "object"}, "AtlasAnnotationStatus": {"enum": ["open", "resolved", "dismissed"], "title": "AtlasAnnotationStatus", "type": "string"}, "AtlasAnnotationStatusChangeRequest": {"properties": {"expected_version": {"description": "Thread version the client last observed; the transition is rejected with a conflict when the thread moved past it.", "minimum": 1.0, "title": "Expected Version", "type": "integer"}}, "required": ["expected_version"], "title": "AtlasAnnotationStatusChangeRequest", "type": "object"}, "AtlasAnnotationThread": {"properties": {"anchor": {"$ref": "#/components/schemas/AtlasAnnotationAnchor"}, "app_id": {"title": "App Id", "type": "string"}, "atlas_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Atlas Url"}, "comment_count": {"default": 0, "title": "Comment Count", "type": "integer"}, "comments": {"items": {"$ref": "#/components/schemas/AtlasAnnotationComment"}, "title": "Comments", "type": "array"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "created_by": {"$ref": "#/components/schemas/AtlasAnnotationAuthor"}, "id": {"title": "Id", "type": "string"}, "last_activity_at": {"format": "date-time", "title": "Last Activity At", "type": "string"}, "node_entity_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Node Entity Id"}, "origin_surface": {"$ref": "#/components/schemas/AtlasAnnotationOriginSurface"}, "reply_count": {"default": 0, "title": "Reply Count", "type": "integer"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "source_report_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Report Url"}, "status": {"$ref": "#/components/schemas/AtlasAnnotationStatus"}, "status_changed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Status Changed At"}, "status_changed_by_user_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status Changed By User Id"}, "version": {"minimum": 1.0, "title": "Version", "type": "integer"}}, "required": ["id", "app_id", "anchor", "origin_surface", "status", "version", "created_by", "created_at", "last_activity_at"], "title": "AtlasAnnotationThread", "type": "object"}, "AtlasAnnotationThreadResponse": {"properties": {"thread": {"$ref": "#/components/schemas/AtlasAnnotationThread"}}, "required": ["thread"], "title": "AtlasAnnotationThreadResponse", "type": "object"}, "AtlasAttachment": {"properties": {"byte_size": {"exclusiveMinimum": 0.0, "title": "Byte Size", "type": "integer"}, "content_type": {"title": "Content Type", "type": "string"}, "filename": {"title": "Filename", "type": "string"}, "height": {"anyOf": [{"exclusiveMinimum": 0.0, "type": "integer"}, {"type": "null"}], "title": "Height"}, "id": {"title": "Id", "type": "string"}, "render_tier": {"$ref": "#/components/schemas/AtlasAttachmentTier"}, "url": {"title": "Url", "type": "string"}, "url_expires_at": {"format": "date-time", "title": "Url Expires At", "type": "string"}, "width": {"anyOf": [{"exclusiveMinimum": 0.0, "type": "integer"}, {"type": "null"}], "title": "Width"}}, "required": ["id", "filename", "content_type", "byte_size", "render_tier", "url", "url_expires_at"], "title": "AtlasAttachment", "type": "object"}, "AtlasAttachmentStatus": {"enum": ["pending", "ready"], "title": "AtlasAttachmentStatus", "type": "string"}, "AtlasAttachmentTier": {"enum": ["image", "video", "pdf", "download"], "title": "AtlasAttachmentTier", "type": "string"}, "AtlasAttachmentUploadRequest": {"properties": {"byte_size": {"exclusiveMinimum": 0.0, "title": "Byte Size", "type": "integer"}, "client_upload_id": {"format": "uuid", "title": "Client Upload Id", "type": "string"}, "content_type": {"maxLength": 255, "minLength": 1, "title": "Content Type", "type": "string"}, "filename": {"maxLength": 255, "minLength": 1, "title": "Filename", "type": "string"}}, "required": ["client_upload_id", "filename", "content_type", "byte_size"], "title": "AtlasAttachmentUploadRequest", "type": "object"}, "AtlasAttachmentUploadResponse": {"properties": {"attachment": {"anyOf": [{"$ref": "#/components/schemas/AtlasAttachment"}, {"type": "null"}]}, "attachment_id": {"title": "Attachment Id", "type": "string"}, "status": {"$ref": "#/components/schemas/AtlasAttachmentStatus"}, "upload_expires_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Upload Expires At"}, "upload_headers": {"additionalProperties": {"type": "string"}, "title": "Upload Headers", "type": "object"}, "upload_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Upload Url"}}, "required": ["attachment_id", "status"], "title": "AtlasAttachmentUploadResponse", "type": "object"}, "AtlasEdgeClipVideo": {"description": "Presigned video for one run, used by the edge-clip player/run switcher.", "properties": {"report_id": {"title": "Report Id", "type": "string"}, "video_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Duration"}, "video_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Video Url"}}, "required": ["report_id"], "title": "AtlasEdgeClipVideo", "type": "object"}, "AtlasEdgeRun": {"description": "A single observed run behind a selected map edge (latest first).\n\nPowers the transition clip in the edge sidebar: the video timestamps bound\nthe source->target delta so the player can loop just that segment.", "properties": {"action_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Description"}, "action_label": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Label"}, "action_target": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Target"}, "action_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Type"}, "execution_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Execution Id"}, "observed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Observed At"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "session_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Id"}, "source_action_index": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Source Action Index"}, "source_step_index": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Source Step Index"}, "source_video_end": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Source Video End"}, "source_video_start": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Source Video Start"}, "target_video_end": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Target Video End"}, "target_video_start": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Target Video Start"}, "test_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, "title": "AtlasEdgeRun", "type": "object"}, "AtlasEdgeRunsResponse": {"properties": {"active_video": {"anyOf": [{"$ref": "#/components/schemas/AtlasEdgeClipVideo"}, {"type": "null"}]}, "app_id": {"title": "App Id", "type": "string"}, "runs": {"items": {"$ref": "#/components/schemas/AtlasEdgeRun"}, "title": "Runs", "type": "array"}}, "required": ["app_id"], "title": "AtlasEdgeRunsResponse", "type": "object"}, "AtlasGroundedAnnotationThreadCreateRequest": {"properties": {"attachment_ids": {"items": {"format": "uuid", "type": "string"}, "maxItems": 4, "title": "Attachment Ids", "type": "array"}, "body": {"maxLength": 10000, "minLength": 1, "title": "Body", "type": "string"}, "client_request_id": {"description": "Client-generated UUID making retried submissions idempotent.", "title": "Client Request Id", "type": "string"}, "target": {"maxLength": 1000, "minLength": 1, "title": "Target", "type": "string"}}, "required": ["target", "body", "client_request_id"], "title": "AtlasGroundedAnnotationThreadCreateRequest", "type": "object"}, "AtlasGroundedAnnotationThreadCreateResponse": {"properties": {"atlas_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Atlas Url"}, "grounding": {"$ref": "#/components/schemas/AtlasAnnotationAnchorPreviewResponse"}, "idempotent_replay": {"default": false, "title": "Idempotent Replay", "type": "boolean"}, "thread": {"$ref": "#/components/schemas/AtlasAnnotationThread"}}, "required": ["thread", "grounding"], "title": "AtlasGroundedAnnotationThreadCreateResponse", "type": "object"}, "AtlasV2GraphResponse": {"properties": {"app_id": {"title": "App Id", "type": "string"}, "attached_tests": {"items": {"additionalProperties": true, "type": "object"}, "title": "Attached Tests", "type": "array"}, "build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}, "curation": {"additionalProperties": true, "title": "Curation", "type": "object"}, "edges": {"items": {"additionalProperties": true, "type": "object"}, "title": "Edges", "type": "array"}, "flows": {"items": {"additionalProperties": true, "type": "object"}, "title": "Flows", "type": "array"}, "nodes": {"items": {"additionalProperties": true, "type": "object"}, "title": "Nodes", "type": "array"}, "projection": {"additionalProperties": true, "title": "Projection", "type": "object"}, "stats": {"additionalProperties": true, "title": "Stats", "type": "object"}, "structure": {"additionalProperties": true, "title": "Structure", "type": "object"}}, "required": ["app_id"], "title": "AtlasV2GraphResponse", "type": "object"}, "AtlasV2IndexApp": {"properties": {"app_id": {"title": "App Id", "type": "string"}, "app_name": {"title": "App Name", "type": "string"}, "details_available": {"default": true, "title": "Details Available", "type": "boolean"}, "jobs": {"anyOf": [{"$ref": "#/components/schemas/AtlasV2IndexJobs"}, {"type": "null"}]}, "latest_build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Latest Build Id"}, "latest_build_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Latest Build Version"}, "olap": {"$ref": "#/components/schemas/AtlasV2IndexOlapStatus"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "preview_nodes": {"anyOf": [{"items": {"$ref": "#/components/schemas/AtlasV2IndexPreviewNode"}, "type": "array"}, {"type": "null"}], "title": "Preview Nodes"}, "stats": {"anyOf": [{"$ref": "#/components/schemas/AtlasV2IndexStats"}, {"type": "null"}]}, "status": {"enum": ["ready", "running", "failed", "empty"], "title": "Status", "type": "string"}, "top_flows": {"anyOf": [{"items": {"$ref": "#/components/schemas/AtlasV2IndexFlow"}, "type": "array"}, {"type": "null"}], "title": "Top Flows"}, "updated_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Updated At"}}, "required": ["app_id", "app_name", "status", "olap"], "title": "AtlasV2IndexApp", "type": "object"}, "AtlasV2IndexFlow": {"properties": {"action_label": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Label"}, "id": {"title": "Id", "type": "string"}, "label": {"title": "Label", "type": "string"}, "node_labels": {"items": {"type": "string"}, "title": "Node Labels", "type": "array"}, "support": {"title": "Support", "type": "integer"}}, "required": ["id", "label", "support"], "title": "AtlasV2IndexFlow", "type": "object"}, "AtlasV2IndexJobs": {"properties": {"failed": {"default": 0, "title": "Failed", "type": "integer"}, "queued": {"default": 0, "title": "Queued", "type": "integer"}, "running": {"default": 0, "title": "Running", "type": "integer"}}, "title": "AtlasV2IndexJobs", "type": "object"}, "AtlasV2IndexOlapStatus": {"properties": {"contract_version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Contract Version"}, "ready": {"default": false, "title": "Ready", "type": "boolean"}, "recomputed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Recomputed At"}, "status": {"default": "none", "enum": ["none", "recomputing", "ready", "stale"], "title": "Status", "type": "string"}}, "title": "AtlasV2IndexOlapStatus", "type": "object"}, "AtlasV2IndexPreviewNode": {"properties": {"entity_id": {"title": "Entity Id", "type": "string"}, "label": {"title": "Label", "type": "string"}, "screenshot_s3_bucket": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot S3 Bucket"}, "screenshot_s3_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot S3 Key"}, "screenshot_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot Url"}, "shot_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Shot Count"}}, "required": ["entity_id", "label"], "title": "AtlasV2IndexPreviewNode", "type": "object"}, "AtlasV2IndexResponse": {"properties": {"apps": {"items": {"$ref": "#/components/schemas/AtlasV2IndexApp"}, "title": "Apps", "type": "array"}, "limit": {"title": "Limit", "type": "integer"}, "offset": {"title": "Offset", "type": "integer"}, "total": {"default": 0, "title": "Total", "type": "integer"}, "uploaded_count": {"default": 0, "title": "Uploaded Count", "type": "integer"}}, "required": ["limit", "offset"], "title": "AtlasV2IndexResponse", "type": "object"}, "AtlasV2IndexStats": {"properties": {"flows": {"default": 0, "title": "Flows", "type": "integer"}, "reports": {"default": 0, "title": "Reports", "type": "integer"}, "screens": {"default": 0, "title": "Screens", "type": "integer"}, "shots": {"default": 0, "title": "Shots", "type": "integer"}, "variants": {"default": 0, "title": "Variants", "type": "integer"}}, "title": "AtlasV2IndexStats", "type": "object"}, "AuthInfo": {"description": "Class that represents authentication information.\nCan be returned from the require_auth dependency.", "properties": {"android_concurrency_limit": {"anyOf": [{"minimum": 1.0, "type": "integer"}, {"type": "null"}], "title": "Android Concurrency Limit"}, "api_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Api Key"}, "billing_exempt": {"default": false, "title": "Billing Exempt", "type": "boolean"}, "concurrency_limit": {"default": 3, "title": "Concurrency Limit", "type": "integer"}, "email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Email"}, "ios_concurrency_limit": {"anyOf": [{"minimum": 1.0, "type": "integer"}, {"type": "null"}], "title": "Ios Concurrency Limit"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "org_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Org Name"}, "permissions": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Permissions"}, "proxy_enabled": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Proxy Enabled"}, "service": {"default": false, "title": "Service", "type": "boolean"}, "user_id": {"title": "User Id", "type": "string"}, "user_role": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Role"}}, "required": ["user_id"], "title": "AuthInfo", "type": "object"}, "AuthoredAuthBypass": {"additionalProperties": false, "description": "Optional launch-variable and deep-link auth bypass.", "properties": {"deep_link": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Deep Link"}, "launch_vars": {"default": [], "items": {"type": "string"}, "title": "Launch Vars", "type": "array"}}, "title": "AuthoredAuthBypass", "type": "object"}, "AuthoredBeforeScript": {"additionalProperties": false, "description": "Optional setup script run before a device session.", "properties": {"script_path": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Script Path"}, "timeout_seconds": {"anyOf": [{"exclusiveMinimum": 0.0, "maximum": 2147483647.0, "type": "integer"}, {"type": "null"}], "title": "Timeout Seconds"}}, "title": "AuthoredBeforeScript", "type": "object"}, "AuthoredBuild": {"additionalProperties": false, "description": "Authored project-level build defaults and named profiles.", "properties": {"caches": {"default": [], "items": {"$ref": "#/components/schemas/ProjectBuildCache"}, "title": "Caches", "type": "array"}, "env": {"additionalProperties": {"type": "string"}, "title": "Env", "type": "object"}, "framework": {"enum": ["ios", "android", "react_native", "expo", "flutter"], "title": "Framework", "type": "string"}, "profiles": {"additionalProperties": {"$ref": "#/components/schemas/AuthoredBuildProfile"}, "title": "Profiles", "type": "object"}, "secrets": {"default": [], "items": {"type": "string"}, "title": "Secrets", "type": "array"}}, "required": ["framework"], "title": "AuthoredBuild", "type": "object"}, "AuthoredBuildProfile": {"additionalProperties": false, "description": "The optional iOS and Android recipes under one customer-authored name.", "properties": {"android": {"anyOf": [{"$ref": "#/components/schemas/AuthoredBuildRecipe"}, {"type": "null"}]}, "ios": {"anyOf": [{"$ref": "#/components/schemas/AuthoredBuildRecipe"}, {"type": "null"}]}}, "title": "AuthoredBuildProfile", "type": "object"}, "AuthoredBuildRecipe": {"additionalProperties": false, "description": "One authored profile/platform recipe before inheritance or defaulting.", "properties": {"app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "App Id"}, "build_commands": {"items": {"type": "string"}, "title": "Build Commands", "type": "array"}, "caches": {"default": [], "items": {"$ref": "#/components/schemas/ProjectBuildCache"}, "title": "Caches", "type": "array"}, "env": {"additionalProperties": {"type": "string"}, "title": "Env", "type": "object"}, "image": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Image"}, "output_path": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Output Path"}, "secrets": {"default": [], "items": {"type": "string"}, "title": "Secrets", "type": "array"}, "setup_commands": {"default": [], "items": {"type": "string"}, "title": "Setup Commands", "type": "array"}, "timeout_seconds": {"anyOf": [{"exclusiveMinimum": 0.0, "maximum": 2147483647.0, "type": "integer"}, {"type": "null"}], "title": "Timeout Seconds"}}, "required": ["build_commands"], "title": "AuthoredBuildRecipe", "type": "object"}, "AuthoredExternalCIAppIds": {"additionalProperties": false, "description": "Platform-to-app expectations for customer CI uploads.", "properties": {"android": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Android"}, "ios": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Ios"}}, "title": "AuthoredExternalCIAppIds", "type": "object"}, "AuthoredExternalCIReviewBuild": {"additionalProperties": false, "description": "A non-runnable expectation satisfied by customer CI uploads.", "properties": {"app_ids": {"$ref": "#/components/schemas/AuthoredExternalCIAppIds"}, "kind": {"const": "ci_upload_to_revyl", "title": "Kind", "type": "string"}}, "required": ["kind", "app_ids"], "title": "AuthoredExternalCIReviewBuild", "type": "object"}, "AuthoredManagedReviewBuild": {"additionalProperties": false, "description": "A Revyl-managed PR build selecting one named profile.", "properties": {"kind": {"const": "revyl", "title": "Kind", "type": "string"}, "profile": {"maxLength": 128, "minLength": 1, "title": "Profile", "type": "string"}}, "required": ["kind", "profile"], "title": "AuthoredManagedReviewBuild", "type": "object"}, "AuthoredPRReview": {"additionalProperties": false, "description": "Authored project-scoped pull-request automation policy.", "properties": {"build": {"discriminator": {"mapping": {"ci_upload_to_revyl": "#/components/schemas/AuthoredExternalCIReviewBuild", "revyl": "#/components/schemas/AuthoredManagedReviewBuild"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/components/schemas/AuthoredManagedReviewBuild"}, {"$ref": "#/components/schemas/AuthoredExternalCIReviewBuild"}], "title": "Build"}, "enabled": {"default": true, "title": "Enabled", "type": "boolean"}, "proof_of_changes": {"anyOf": [{"$ref": "#/components/schemas/AuthoredProofOfChanges"}, {"type": "null"}]}, "review_triggers": {"anyOf": [{"$ref": "#/components/schemas/AuthoredReviewTriggers"}, {"type": "null"}]}, "strict_ci_check": {"anyOf": [{"$ref": "#/components/schemas/AuthoredStrictCICheck"}, {"type": "null"}]}, "workflow_ids": {"default": [], "items": {"format": "uuid", "type": "string"}, "title": "Workflow Ids", "type": "array"}}, "required": ["build"], "title": "AuthoredPRReview", "type": "object"}, "AuthoredProject": {"additionalProperties": false, "description": "Authored stable project identity.", "properties": {"id": {"format": "uuid", "title": "Id", "type": "string"}}, "required": ["id"], "title": "AuthoredProject", "type": "object"}, "AuthoredProofOfChanges": {"additionalProperties": false, "description": "Authored proof-of-changes policy.", "properties": {"always_verify": {"default": [], "items": {"type": "string"}, "title": "Always Verify", "type": "array"}, "enabled": {"default": false, "title": "Enabled", "type": "boolean"}, "harness": {"anyOf": [{"discriminator": {"mapping": {"cursor": "#/components/schemas/CursorProofHarness", "revyl": "#/components/schemas/RevylProofHarness"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/components/schemas/RevylProofHarness"}, {"$ref": "#/components/schemas/CursorProofHarness"}]}, {"type": "null"}], "title": "Harness"}, "system_prompt": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "System Prompt"}}, "title": "AuthoredProofOfChanges", "type": "object"}, "AuthoredReviewTriggers": {"additionalProperties": false, "description": "Authored changed-path, label, and draft review filters.\n\nExplicit ``paths`` globs match repository-root-relative provider paths.\nWhen omitted, repository-bound selection defaults to the project root.", "properties": {"drafts": {"default": false, "title": "Drafts", "type": "boolean"}, "labels": {"default": [], "items": {"type": "string"}, "title": "Labels", "type": "array"}, "paths": {"default": [], "items": {"maxLength": 1024, "minLength": 1, "type": "string"}, "title": "Paths", "type": "array"}}, "title": "AuthoredReviewTriggers", "type": "object"}, "AuthoredRevylConfig": {"additionalProperties": false, "description": "The closed canonical ``.revyl/config.yaml`` shape.", "properties": {"build": {"anyOf": [{"$ref": "#/components/schemas/AuthoredBuild"}, {"type": "null"}]}, "pr_review": {"anyOf": [{"$ref": "#/components/schemas/AuthoredPRReview"}, {"type": "null"}]}, "project": {"$ref": "#/components/schemas/AuthoredProject"}, "session": {"anyOf": [{"$ref": "#/components/schemas/AuthoredSession"}, {"type": "null"}]}}, "required": ["project"], "title": "AuthoredRevylConfig", "type": "object"}, "AuthoredSession": {"additionalProperties": false, "description": "Authored project-wide device-session settings.", "properties": {"auth_bypass": {"anyOf": [{"$ref": "#/components/schemas/AuthoredAuthBypass"}, {"type": "null"}]}, "before_script": {"anyOf": [{"$ref": "#/components/schemas/AuthoredBeforeScript"}, {"type": "null"}]}, "idle_timeout_seconds": {"anyOf": [{"exclusiveMinimum": 0.0, "maximum": 2147483647.0, "type": "integer"}, {"type": "null"}], "title": "Idle Timeout Seconds"}}, "title": "AuthoredSession", "type": "object"}, "AuthoredStrictCICheck": {"additionalProperties": false, "description": "Authored strict build-check behavior.", "properties": {"build": {"title": "Build", "type": "boolean"}}, "required": ["build"], "title": "AuthoredStrictCICheck", "type": "object"}, "BlocksCreationRequest": {"description": "Request model for creating tests from blocks", "properties": {"blocks": {"description": "List of test blocks", "items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "title": "Blocks", "type": "array"}, "metadata": {"additionalProperties": true, "description": "Test metadata", "title": "Metadata", "type": "object"}, "options": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Optional creation options", "title": "Options"}}, "required": ["blocks", "metadata"], "title": "BlocksCreationRequest", "type": "object"}, "BuildArtifact": {"additionalProperties": false, "description": "Artifact produced by a sandbox build.", "properties": {"name": {"maxLength": 128, "minLength": 1, "title": "Name", "type": "string"}, "path": {"maxLength": 1024, "minLength": 1, "title": "Path", "type": "string"}, "type": {"maxLength": 64, "minLength": 1, "title": "Type", "type": "string"}}, "required": ["name", "path", "type"], "title": "BuildArtifact", "type": "object"}, "BuildArtifactRejectionDetail": {"description": "Machine-readable reason a downloaded artifact cannot be imported.", "properties": {"code": {"const": "build_artifact_rejected", "default": "build_artifact_rejected", "title": "Code", "type": "string"}, "message": {"title": "Message", "type": "string"}}, "required": ["message"], "title": "BuildArtifactRejectionDetail", "type": "object"}, "BuildArtifactRejectionResponse": {"description": "HTTP 400 response for an artifact rejected during ingestion.", "properties": {"detail": {"$ref": "#/components/schemas/BuildArtifactRejectionDetail"}}, "required": ["detail"], "title": "BuildArtifactRejectionResponse", "type": "object"}, "BuildCache": {"additionalProperties": false, "description": "Cache archive definition stored on a sandbox build configuration.", "properties": {"key": {"description": "Org-local cache key. The build runner prefixes it with the org ID.", "maxLength": 128, "minLength": 1, "title": "Key", "type": "string"}, "paths": {"description": "Project-relative paths stored in this cache archive.", "items": {"type": "string"}, "minItems": 1, "title": "Paths", "type": "array"}}, "required": ["key", "paths"], "title": "BuildCache", "type": "object"}, "BuildCacheDeleteResponse": {"properties": {"deleted_objects": {"description": "Number of platform variants removed from storage.", "title": "Deleted Objects", "type": "integer"}, "key": {"title": "Key", "type": "string"}}, "required": ["key", "deleted_objects"], "title": "BuildCacheDeleteResponse", "type": "object"}, "BuildCacheListResponse": {"properties": {"caches": {"items": {"$ref": "#/components/schemas/BuildCacheSummary"}, "title": "Caches", "type": "array"}}, "required": ["caches"], "title": "BuildCacheListResponse", "type": "object"}, "BuildCacheSummary": {"description": "One stored build cache object.", "properties": {"key": {"description": "Org-local cache key as written in build configs.", "title": "Key", "type": "string"}, "last_modified": {"format": "date-time", "title": "Last Modified", "type": "string"}, "platform": {"title": "Platform", "type": "string"}, "size_bytes": {"title": "Size Bytes", "type": "integer"}}, "required": ["key", "platform", "size_bytes", "last_modified"], "title": "BuildCacheSummary", "type": "object"}, "BuildCollectionBuildItem": {"properties": {"build": {"$ref": "#/components/schemas/BuildResponse"}, "job": {"anyOf": [{"$ref": "#/components/schemas/RemoteBuildSummary"}, {"type": "null"}]}, "kind": {"const": "build", "title": "Kind", "type": "string"}}, "required": ["kind", "build"], "title": "BuildCollectionBuildItem", "type": "object"}, "BuildCollectionJobItem": {"properties": {"job": {"$ref": "#/components/schemas/RemoteBuildSummary"}, "kind": {"const": "job", "title": "Kind", "type": "string"}}, "required": ["kind", "job"], "title": "BuildCollectionJobItem", "type": "object"}, "BuildConfig": {"additionalProperties": false, "description": "Sandbox build configuration stored by the API and used by build jobs.", "properties": {"app_id": {"format": "uuid", "title": "App Id", "type": "string"}, "artifacts": {"items": {"$ref": "#/components/schemas/BuildArtifact"}, "title": "Artifacts", "type": "array"}, "caches": {"items": {"$ref": "#/components/schemas/BuildCache"}, "title": "Caches", "type": "array"}, "env": {"additionalProperties": {"type": "string"}, "title": "Env", "type": "object"}, "framework": {"anyOf": [{"maxLength": 128, "type": "string"}, {"type": "null"}], "title": "Framework"}, "id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Id"}, "image": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "description": "Optional sandbox build image key.", "title": "Image"}, "is_default": {"default": true, "title": "Is Default", "type": "boolean"}, "name": {"default": "Default", "maxLength": 128, "minLength": 1, "title": "Name", "type": "string"}, "platform": {"default": "ios", "enum": ["ios", "android"], "title": "Platform", "type": "string"}, "secret_refs": {"items": {"type": "string"}, "title": "Secret Refs", "type": "array"}, "source_subdir": {"anyOf": [{"maxLength": 1024, "type": "string"}, {"type": "null"}], "title": "Source Subdir"}, "steps": {"items": {"$ref": "#/components/schemas/BuildStep"}, "title": "Steps", "type": "array"}}, "required": ["app_id"], "title": "BuildConfig", "type": "object"}, "BuildCreateFromUploadRequest": {"description": "Request to create a build from a completed staging upload.", "properties": {"metadata": {"additionalProperties": true, "anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "set_as_current": {"default": false, "description": "Set this build as the app's current version", "title": "Set As Current", "type": "boolean"}, "upload_id": {"description": "Upload session id returned by upload-session", "format": "uuid", "title": "Upload Id", "type": "string"}, "version": {"description": "Version string (must be unique)", "title": "Version", "type": "string"}}, "required": ["upload_id", "version"], "title": "BuildCreateFromUploadRequest", "type": "object"}, "BuildCreateResponse": {"description": "Response model for creating a build with upload URL.", "properties": {"content_type": {"title": "Content Type", "type": "string"}, "upload_expires_at": {"title": "Upload Expires At", "type": "integer"}, "upload_url": {"title": "Upload Url", "type": "string"}, "version": {"title": "Version", "type": "string"}, "version_id": {"format": "uuid", "title": "Version Id", "type": "string"}}, "required": ["version_id", "version", "upload_url", "upload_expires_at", "content_type"], "title": "BuildCreateResponse", "type": "object"}, "BuildFromUrlRequest": {"description": "Request to create a build by ingesting an artifact from a URL (e.g., Expo EAS).", "properties": {"fingerprint_hash": {"anyOf": [{"maxLength": 128, "type": "string"}, {"type": "null"}], "description": "Native dependency fingerprint for compatible artifact reuse", "title": "Fingerprint Hash"}, "from_url": {"description": "Source URL of the artifact to ingest", "title": "From Url", "type": "string"}, "headers": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "description": "Optional HTTP headers to include when fetching the URL", "title": "Headers"}, "metadata": {"additionalProperties": true, "anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "set_as_current": {"default": false, "description": "If True, set this version as the current version for the app", "title": "Set As Current", "type": "boolean"}, "version": {"description": "Version string (must be unique within the app)", "title": "Version", "type": "string"}}, "required": ["from_url", "version"], "title": "BuildFromUrlRequest", "type": "object"}, "BuildMultipartUploadCompletedPart": {"description": "A part S3 already holds for an in-progress multipart upload.", "properties": {"etag": {"description": "ETag S3 returned when the part was stored", "title": "Etag", "type": "string"}, "part_number": {"description": "1-indexed S3 part number", "minimum": 1.0, "title": "Part Number", "type": "integer"}, "size": {"description": "Size in bytes of the stored part", "minimum": 0.0, "title": "Size", "type": "integer"}}, "required": ["part_number", "etag", "size"], "title": "BuildMultipartUploadCompletedPart", "type": "object"}, "BuildMultipartUploadPartURL": {"description": "A presigned URL for uploading one part of a multipart upload.", "properties": {"part_number": {"description": "1-indexed S3 part number", "minimum": 1.0, "title": "Part Number", "type": "integer"}, "upload_url": {"description": "Presigned upload_part URL", "title": "Upload Url", "type": "string"}}, "required": ["part_number", "upload_url"], "title": "BuildMultipartUploadPartURL", "type": "object"}, "BuildMultipartUploadResumeRequest": {"description": "Request to resume an interrupted multipart upload.\n\nThe client persists the start response and replays the identifying fields\nhere; the server reconstructs the same staging key, asks S3 which parts it\nalready holds, and re-presigns fresh URLs for the remaining parts.", "properties": {"file_name": {"description": "Name of the file being uploaded", "title": "File Name", "type": "string"}, "file_size": {"description": "Total artifact size in bytes; must match the original start", "exclusiveMinimum": 0.0, "title": "File Size", "type": "integer"}, "s3_upload_id": {"description": "Native S3 UploadId from multipart-upload/start", "title": "S3 Upload Id", "type": "string"}, "upload_id": {"description": "Staging upload session id from multipart-upload/start", "format": "uuid", "title": "Upload Id", "type": "string"}, "version": {"description": "Version string (must still be unclaimed)", "title": "Version", "type": "string"}}, "required": ["upload_id", "s3_upload_id", "version", "file_name", "file_size"], "title": "BuildMultipartUploadResumeRequest", "type": "object"}, "BuildMultipartUploadResumeResponse": {"description": "Response that lets a client finish an interrupted multipart upload.\n\nparts re-presigns every part (URLs from the original start may have\nexpired); uploaded_parts tells the client which of those to skip and\ncarries the ETags it needs to assemble the object at complete_url.", "properties": {"abort_url": {"description": "Presigned S3 AbortMultipartUpload URL", "title": "Abort Url", "type": "string"}, "complete_url": {"description": "Presigned S3 CompleteMultipartUpload URL", "title": "Complete Url", "type": "string"}, "part_size": {"description": "Size in bytes of every part except the last", "title": "Part Size", "type": "integer"}, "parts": {"description": "Freshly presigned upload_part URL for every part", "items": {"$ref": "#/components/schemas/BuildMultipartUploadPartURL"}, "title": "Parts", "type": "array"}, "s3_upload_id": {"title": "S3 Upload Id", "type": "string"}, "upload_expires_at": {"description": "Unix timestamp after which the presigned URLs expire", "title": "Upload Expires At", "type": "integer"}, "upload_id": {"format": "uuid", "title": "Upload Id", "type": "string"}, "uploaded_parts": {"description": "Parts S3 already holds; skip these and reuse their ETags", "items": {"$ref": "#/components/schemas/BuildMultipartUploadCompletedPart"}, "title": "Uploaded Parts", "type": "array"}}, "required": ["upload_id", "s3_upload_id", "part_size", "upload_expires_at", "parts", "complete_url", "abort_url"], "title": "BuildMultipartUploadResumeResponse", "type": "object"}, "BuildMultipartUploadStartRequest": {"description": "Request to start an S3 multipart upload for a large build artifact.", "properties": {"file_name": {"description": "Name of the file to upload", "title": "File Name", "type": "string"}, "file_size": {"description": "Total artifact size in bytes; the server rejects sizes above its maximum supported artifact size", "exclusiveMinimum": 0.0, "title": "File Size", "type": "integer"}, "version": {"description": "Version string (must be unique)", "title": "Version", "type": "string"}}, "required": ["version", "file_name", "file_size"], "title": "BuildMultipartUploadStartRequest", "type": "object"}, "BuildMultipartUploadStartResponse": {"description": "Response with everything a client needs to upload parts directly to S3.\n\nLike upload-session, no build row exists yet: the client uploads the\nparts, assembles them by POSTing the part ETags to complete_url, then\ncreates the build via POST /{app_id}/builds with upload_id. Unfinished\nmultipart uploads are aborted by the bucket lifecycle rule and abandoned\nstaging objects are swept server-side; abort_url is a courtesy for\nprompt cleanup.", "properties": {"abort_url": {"description": "Presigned S3 AbortMultipartUpload URL", "title": "Abort Url", "type": "string"}, "complete_url": {"description": "Presigned S3 CompleteMultipartUpload URL", "title": "Complete Url", "type": "string"}, "part_size": {"description": "Size in bytes of every part except the last", "title": "Part Size", "type": "integer"}, "parts": {"items": {"$ref": "#/components/schemas/BuildMultipartUploadPartURL"}, "title": "Parts", "type": "array"}, "s3_upload_id": {"description": "Native S3 multipart UploadId. Already embedded in every presigned URL above; surfaced explicitly so a client can persist it and resume an interrupted upload via the multipart-upload/resume route.", "title": "S3 Upload Id", "type": "string"}, "upload_expires_at": {"description": "Unix timestamp after which the presigned URLs expire", "title": "Upload Expires At", "type": "integer"}, "upload_id": {"description": "Staging upload session id, passed to POST /{app_id}/builds", "format": "uuid", "title": "Upload Id", "type": "string"}}, "required": ["upload_id", "s3_upload_id", "part_size", "upload_expires_at", "parts", "complete_url", "abort_url"], "title": "BuildMultipartUploadStartResponse", "type": "object"}, "BuildResponse": {"description": "Response model for a build (specific artifact/version of an app).", "properties": {"app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "App Id"}, "artifact_kind": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Artifact Kind"}, "artifact_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Artifact Url"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Id"}, "metadata": {"additionalProperties": true, "title": "Metadata", "type": "object"}, "owner": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Owner"}, "package_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Package Name"}, "uploaded_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Uploaded At"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Version"}, "was_reused": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Was Reused"}}, "title": "BuildResponse", "type": "object"}, "BuildRunnerStatus": {"description": "Response for the build runner availability pre-flight check.\n\nAttributes:\n available: Whether at least one build runner is online for the org.\n runner_count: Number of active build runners matching the org.\n ``-1`` indicates Hatchet availability is unknown.", "properties": {"available": {"title": "Available", "type": "boolean"}, "runner_count": {"title": "Runner Count", "type": "integer"}, "unavailable_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Unavailable Reason"}}, "required": ["available", "runner_count"], "title": "BuildRunnerStatus", "type": "object"}, "BuildStep": {"additionalProperties": false, "description": "One step executed by a sandbox build runner.", "properties": {"command": {"anyOf": [{"maxLength": 8192, "type": "string"}, {"type": "null"}], "title": "Command"}, "name": {"anyOf": [{"maxLength": 128, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Name"}, "secret_env": {"description": "Names of build secrets exported into this step's environment, in addition to the configuration-level secret_refs.", "items": {"type": "string"}, "title": "Secret Env", "type": "array"}, "type": {"enum": ["checkout", "run"], "title": "Type", "type": "string"}}, "required": ["type"], "title": "BuildStep", "type": "object"}, "BuildUploadCompleteRequest": {"description": "Request to mark upload as complete.", "properties": {"metadata": {"additionalProperties": true, "anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "package_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Package name", "title": "Package Name"}, "set_as_current": {"default": false, "description": "Set this build as the app's current version", "title": "Set As Current", "type": "boolean"}, "version_id": {"format": "uuid", "title": "Version Id", "type": "string"}}, "required": ["version_id"], "title": "BuildUploadCompleteRequest", "type": "object"}, "BuildUploadSessionRequest": {"description": "Request to open a staging upload session for a new build artifact.", "properties": {"file_name": {"description": "Name of the file to upload", "title": "File Name", "type": "string"}, "version": {"description": "Version string (must be unique)", "title": "Version", "type": "string"}}, "required": ["version", "file_name"], "title": "BuildUploadSessionRequest", "type": "object"}, "BuildUploadSessionResponse": {"description": "Response with a presigned URL targeting the staging area.\n\nNo build row exists yet; the build is created by POST /{app_id}/builds\nafter the artifact is uploaded and validated. Abandoned staging objects\nare swept server-side when a later session for the same app starts.", "properties": {"content_type": {"title": "Content Type", "type": "string"}, "upload_expires_at": {"title": "Upload Expires At", "type": "integer"}, "upload_id": {"format": "uuid", "title": "Upload Id", "type": "string"}, "upload_url": {"title": "Upload Url", "type": "string"}}, "required": ["upload_id", "upload_url", "upload_expires_at", "content_type"], "title": "BuildUploadSessionResponse", "type": "object"}, "BulkSyncTagsRequest": {"description": "Request to bulk sync tags for multiple tests.", "properties": {"tags_to_add": {"default": [], "items": {"type": "string"}, "title": "Tags To Add", "type": "array"}, "tags_to_remove": {"default": [], "items": {"type": "string"}, "title": "Tags To Remove", "type": "array"}, "test_ids": {"items": {"type": "string"}, "title": "Test Ids", "type": "array"}}, "required": ["test_ids"], "title": "BulkSyncTagsRequest", "type": "object"}, "BulkSyncTagsResponse": {"description": "Response from bulk sync operation.", "properties": {"error_count": {"title": "Error Count", "type": "integer"}, "results": {"items": {"$ref": "#/components/schemas/BulkSyncTagsResultItem"}, "title": "Results", "type": "array"}, "success_count": {"title": "Success Count", "type": "integer"}}, "required": ["results", "success_count", "error_count"], "title": "BulkSyncTagsResponse", "type": "object"}, "BulkSyncTagsResultItem": {"description": "Result item for a single test in bulk sync.", "properties": {"error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "success": {"title": "Success", "type": "boolean"}, "test_id": {"title": "Test Id", "type": "string"}}, "required": ["test_id", "success"], "title": "BulkSyncTagsResultItem", "type": "object"}, "CLIClientSource": {"description": "Bounded launcher that started a CLI device-authorization login.", "enum": ["cursor_plugin"], "title": "CLIClientSource", "type": "string"}, "CLIDeviceAuthorizationState": {"description": "Lifecycle of one CLI device authorization.", "enum": ["pending", "approved", "denied"], "title": "CLIDeviceAuthorizationState", "type": "string"}, "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", "enum": ["none", "full_rerun"], "title": "CacheRetryMode", "type": "string"}, "CancelTestResponse": {"description": "Response model for test cancellation.", "properties": {"message": {"title": "Message", "type": "string"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "success": {"title": "Success", "type": "boolean"}, "task_id": {"title": "Task Id", "type": "string"}}, "required": ["success", "message", "task_id"], "title": "CancelTestResponse", "type": "object"}, "CheckVariableExistsResponse": {"description": "Response for check variable exists endpoint.", "properties": {"exists": {"description": "Whether the variable exists", "title": "Exists", "type": "boolean"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Name of the variable", "title": "Variable Name"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Value of the variable", "title": "Variable Value"}}, "required": ["exists"], "title": "CheckVariableExistsResponse", "type": "object"}, "ChildTaskReportInfo": {"properties": {"completed_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Completed At"}, "current_step": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Step"}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "execution_time_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Execution Time Seconds"}, "is_shared": {"default": false, "title": "Is Shared", "type": "boolean"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "progress": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Progress"}, "share_token": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Share Token"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "steps_completed": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Steps Completed"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "task_id": {"title": "Task Id", "type": "string"}, "test_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}, "test_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Name"}, "total_steps": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Total Steps"}}, "required": ["task_id"], "title": "ChildTaskReportInfo", "type": "object"}, "CleanupLevel": {"description": "Cleanup intensity level for AVD state reset between test runs.", "enum": ["none", "thorough", "deep_clean"], "title": "CleanupLevel", "type": "string"}, "CloudAgentConversationAttributionSummary": {"properties": {"cloud_agent_provider_key": {"$ref": "#/components/schemas/CloudAgentProviderKey"}, "conversation_id": {"format": "uuid", "title": "Conversation Id", "type": "string"}, "launch": {"anyOf": [{"$ref": "#/components/schemas/CursorCloudAgentConversationAttributionLaunch"}, {"type": "null"}]}, "provider_conversation_id": {"anyOf": [{"maxLength": 255, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Provider Conversation Id"}, "provider_conversation_url": {"anyOf": [{"maxLength": 2048, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Provider Conversation Url"}, "recorded_user": {"$ref": "#/components/schemas/CloudAgentConversationRecordedUser"}}, "required": ["conversation_id", "recorded_user", "cloud_agent_provider_key"], "title": "CloudAgentConversationAttributionSummary", "type": "object"}, "CloudAgentConversationLaunchSubmissionStatus": {"description": "Once-only result of submitting the founding launch to its provider.", "enum": ["not_attempted", "dispatching", "accepted", "rejected", "unconfirmed"], "title": "CloudAgentConversationLaunchSubmissionStatus", "type": "string"}, "CloudAgentConversationOrigin": {"description": "Bounded origin of a cloud-agent conversation.", "enum": ["revyl_atlas_screen", "revyl_test_report", "revyl_test_report_atlas_screen", "revyl_device_session", "revyl_device_session_atlas_screen", "external_provider"], "title": "CloudAgentConversationOrigin", "type": "string"}, "CloudAgentConversationRecordedUser": {"properties": {"user_id": {"format": "uuid", "title": "User Id", "type": "string"}}, "required": ["user_id"], "title": "CloudAgentConversationRecordedUser", "type": "object"}, "CloudAgentConversationRelatedResourceMatchType": {"description": "Why a resource appears in a conversation-scoped related-resource read.", "enum": ["direct", "child_test_execution", "child_workflow_execution"], "title": "CloudAgentConversationRelatedResourceMatchType", "type": "string"}, "CloudAgentProviderKey": {"description": "Immutable provider identity for one cloud-agent conversation.", "enum": ["cursor_cloud"], "title": "CloudAgentProviderKey", "type": "string"}, "CodeExecutionScript": {"description": "Full script model with database fields.", "properties": {"code": {"description": "Script code content", "title": "Code", "type": "string"}, "created_at": {"description": "Creation timestamp", "format": "date-time", "title": "Created At", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Script description", "title": "Description"}, "id": {"description": "Script ID", "format": "uuid", "title": "Id", "type": "string"}, "name": {"description": "Script name", "title": "Name", "type": "string"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Organization ID", "title": "Org Id"}, "runtime": {"description": "Runtime language", "enum": ["python", "javascript", "typescript", "bash"], "title": "Runtime", "type": "string"}, "updated_at": {"description": "Last update timestamp", "format": "date-time", "title": "Updated At", "type": "string"}, "user_id": {"description": "User ID who owns the script", "format": "uuid", "title": "User Id", "type": "string"}}, "required": ["name", "code", "runtime", "id", "user_id", "created_at", "updated_at"], "title": "CodeExecutionScript", "type": "object"}, "CodeExecutionScriptCreate": {"description": "Model for creating a new script.", "properties": {"code": {"description": "Script code content", "title": "Code", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Script description", "title": "Description"}, "name": {"description": "Script name", "title": "Name", "type": "string"}, "runtime": {"description": "Runtime language", "enum": ["python", "javascript", "typescript", "bash"], "title": "Runtime", "type": "string"}}, "required": ["name", "code", "runtime"], "title": "CodeExecutionScriptCreate", "type": "object"}, "CodeExecutionScriptListResponse": {"description": "Response model for listing scripts.", "properties": {"count": {"description": "Total count of scripts", "title": "Count", "type": "integer"}, "scripts": {"description": "List of scripts", "items": {"$ref": "#/components/schemas/CodeExecutionScript"}, "title": "Scripts", "type": "array"}}, "required": ["scripts", "count"], "title": "CodeExecutionScriptListResponse", "type": "object"}, "CodeExecutionScriptUpdate": {"description": "Model for updating an existing script.", "properties": {"code": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Script code content", "title": "Code"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Script description", "title": "Description"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Script name", "title": "Name"}, "runtime": {"anyOf": [{"enum": ["python", "javascript", "typescript", "bash"], "type": "string"}, {"type": "null"}], "description": "Runtime language", "title": "Runtime"}}, "title": "CodeExecutionScriptUpdate", "type": "object"}, "CompileJobProgress": {"description": "Progress metadata returned by the status endpoint.", "properties": {"completed_chunk_indices": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "description": "Which specific chunk indices have completed", "title": "Completed Chunk Indices"}, "completed_chunks": {"default": 0, "title": "Completed Chunks", "type": "integer"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Human-readable progress note", "title": "Message"}, "stage": {"$ref": "#/components/schemas/CompileJobStatus", "default": "queued", "description": "Current stage of the pipeline"}, "total_chunks": {"default": 0, "title": "Total Chunks", "type": "integer"}}, "title": "CompileJobProgress", "type": "object"}, "CompileJobStatus": {"description": "Lifecycle states for a recording compile job.", "enum": ["queued", "preparing", "summarizing", "merging", "formatting", "completed", "failed"], "title": "CompileJobStatus", "type": "string"}, "CompileRecordingRequest": {"description": "Request body for POST /recordings/compile.", "properties": {"interval_end": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "End action index (inclusive)", "title": "Interval End"}, "interval_end_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "End time in seconds from recording start", "title": "Interval End Time"}, "interval_start": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Start action index (inclusive)", "title": "Interval Start"}, "interval_start_time": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Start time in seconds from recording start", "title": "Interval Start Time"}, "source_id": {"description": "session_id or report_id depending on source_type", "title": "Source Id", "type": "string"}, "source_type": {"$ref": "#/components/schemas/CompileSourceType", "description": "recording or session"}, "user_feedback": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional user instructions for how to adjust compilation (e.g. 'more validations', 'less verbose')", "title": "User Feedback"}}, "required": ["source_type", "source_id"], "title": "CompileRecordingRequest", "type": "object"}, "CompileRecordingStartResponse": {"description": "Response from POST /recordings/compile.", "properties": {"job_id": {"description": "UUID of the compile job", "title": "Job Id", "type": "string"}, "status": {"default": "queued", "title": "Status", "type": "string"}}, "required": ["job_id"], "title": "CompileRecordingStartResponse", "type": "object"}, "CompileRecordingStatusResponse": {"description": "Response from GET /recordings/compile/{job_id}.", "properties": {"error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "job_id": {"title": "Job Id", "type": "string"}, "progress": {"anyOf": [{"$ref": "#/components/schemas/CompileJobProgress"}, {"type": "null"}]}, "result": {"anyOf": [{"$ref": "#/components/schemas/CompileResult"}, {"type": "null"}]}, "status": {"title": "Status", "type": "string"}}, "required": ["job_id", "status"], "title": "CompileRecordingStatusResponse", "type": "object"}, "CompileResult": {"description": "Final output of a compile job, stored on the job row.", "properties": {"blocks": {"description": "Editor Block[] dicts ready for the frontend", "items": {"additionalProperties": true, "type": "object"}, "title": "Blocks", "type": "array"}, "compiled_steps": {"description": "Ordered intent steps", "items": {"$ref": "#/components/schemas/CompiledIntentStep"}, "title": "Compiled Steps", "type": "array"}, "suggested_title": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Short LLM-generated title with a 4-hex suffix for uniqueness", "title": "Suggested Title"}, "total_actions_compiled": {"default": 0, "title": "Total Actions Compiled", "type": "integer"}, "total_chunks_processed": {"default": 0, "title": "Total Chunks Processed", "type": "integer"}, "warnings": {"description": "Any quality or ambiguity warnings from compilation", "items": {"type": "string"}, "title": "Warnings", "type": "array"}, "yaml": {"default": "", "description": "YAML string of the compiled test blocks", "title": "Yaml", "type": "string"}}, "title": "CompileResult", "type": "object"}, "CompileSourceType": {"description": "How the compile was triggered.", "enum": ["recording", "session"], "title": "CompileSourceType", "type": "string"}, "CompiledIntentStep": {"description": "One natural-language test step produced by the final merge pass.", "properties": {"confidence": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Model confidence 0-1 if available", "title": "Confidence"}, "manual_subtype": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "For manual steps: go_home, open_app, kill_app, back, set_location, set_orientation, set_appearance, set_font_size, wait, navigate", "title": "Manual Subtype"}, "source_action_ranges": {"description": "Which raw actions this step covers", "items": {"$ref": "#/components/schemas/ActionRange"}, "title": "Source Action Ranges", "type": "array"}, "step_description": {"description": "Natural language instruction an agent can follow to reproduce the action", "title": "Step Description", "type": "string"}, "step_type": {"description": "instruction, validation, or manual", "title": "Step Type", "type": "string"}}, "required": ["step_type", "step_description"], "title": "CompiledIntentStep", "type": "object"}, "ConfigurationAuthority": {"description": "Server-derived owner of the current project configuration.", "enum": ["manual", "git_default_branch"], "title": "ConfigurationAuthority", "type": "string"}, "CreateCLIDeviceAuthorizationRequest": {"description": "Request from an unauthenticated CLI to start browser approval.", "properties": {"client_instance_id": {"anyOf": [{"maxLength": 128, "pattern": "^(?:[A-Za-z0-9][A-Za-z0-9._:\\-]*)?$", "type": "string"}, {"type": "null"}], "description": "Stable per-install CLI identifier used to rotate only this device's key.", "title": "Client Instance Id"}, "client_source": {"anyOf": [{"$ref": "#/components/schemas/CLIClientSource"}, {"type": "null"}], "description": "Bounded launcher that started this login. Omitted for ordinary CLI."}, "device_label": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Human-readable device label shown on the approval page.", "title": "Device Label"}}, "title": "CreateCLIDeviceAuthorizationRequest", "type": "object"}, "CreateCLIDeviceAuthorizationResponse": {"description": "Pending authorization handed back to the CLI that started it.", "properties": {"device_code": {"description": "Secret the CLI presents to redeem the credential. Never displayed or logged.", "maxLength": 128, "minLength": 32, "title": "Device Code", "type": "string"}, "expires_in": {"description": "Seconds until this authorization expires and must be restarted.", "title": "Expires In", "type": "integer"}, "interval": {"description": "Minimum seconds the CLI should wait between credential polls.", "title": "Interval", "type": "integer"}, "user_code": {"description": "Short code shown to the user so they can confirm they are approving their own login.", "pattern": "^[ABCDEFGHJKMNPQRSTVWXYZ23456789abcdefghjkmnpqrstvwxyz23456789]{4}-[ABCDEFGHJKMNPQRSTVWXYZ23456789abcdefghjkmnpqrstvwxyz23456789]{4}$", "title": "User Code", "type": "string"}, "verification_uri": {"description": "Approval page to open when the complete URL cannot be used.", "title": "Verification Uri", "type": "string"}, "verification_uri_complete": {"description": "Approval page with the user code embedded, so one click covers the whole flow.", "title": "Verification Uri Complete", "type": "string"}}, "required": ["device_code", "user_code", "verification_uri", "verification_uri_complete", "expires_in", "interval"], "title": "CreateCLIDeviceAuthorizationResponse", "type": "object"}, "CreateModuleRequest": {"description": "Request model for creating a new module", "properties": {"blocks": {"description": "Array of block objects", "items": {"$ref": "#/components/schemas/ModuleBlock"}, "title": "Blocks", "type": "array"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional description", "title": "Description"}, "name": {"description": "Name of the module", "minLength": 1, "title": "Name", "type": "string"}}, "required": ["name", "blocks"], "title": "CreateModuleRequest", "type": "object"}, "CreateTagRequest": {"description": "Request to create a tag.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "#6B7280", "title": "Color"}, "name": {"title": "Name", "type": "string"}}, "required": ["name"], "title": "CreateTagRequest", "type": "object"}, "CreateWorkflowResponse": {"properties": {"data": {"$ref": "#/components/schemas/WorkflowsBaseSchema", "description": "Created or updated workflow record"}}, "required": ["data"], "title": "CreateWorkflowResponse", "type": "object"}, "CreditConversion": {"properties": {"credits_per_unit": {"title": "Credits Per Unit", "type": "number"}, "feature_id": {"title": "Feature Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["feature_id", "name", "credits_per_unit"], "title": "CreditConversion", "type": "object"}, "CursorCloudAgentConversationAttributionLaunch": {"description": "Launch facts displayed with an ordinary related-resource attribution.", "properties": {"conversation_origin": {"$ref": "#/components/schemas/CloudAgentConversationOrigin"}, "launch_connection_type": {"$ref": "#/components/schemas/CursorConnectionType"}, "launch_submission_status": {"$ref": "#/components/schemas/CloudAgentConversationLaunchSubmissionStatus"}}, "required": ["launch_connection_type", "conversation_origin", "launch_submission_status"], "title": "CursorCloudAgentConversationAttributionLaunch", "type": "object"}, "CursorConnectionType": {"enum": ["personal", "organization_default"], "title": "CursorConnectionType", "type": "string"}, "CursorProofHarness": {"additionalProperties": false, "description": "A Cursor cloud agent launched against the pull request.\n\nAttributes:\n kind: Discriminator selecting this harness.\n model_id: Cursor model to pin. ``None`` (the default) omits the model\n from the provider request so Cursor applies the account default,\n which also removes any dependency on model-catalog availability.", "properties": {"kind": {"const": "cursor", "title": "Kind", "type": "string"}, "model_id": {"anyOf": [{"maxLength": 255, "minLength": 1, "type": "string"}, {"type": "null"}], "title": "Model Id"}}, "required": ["kind"], "title": "CursorProofHarness", "type": "object"}, "DOMMetadata": {"additionalProperties": true, "properties": {"a11y_data": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "A11Y Data"}, "code_input": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Code Input"}, "file_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "File Url"}, "input_selector": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Input Selector"}, "selector": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Selector"}, "validation_text": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Validation Text"}, "validation_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Validation Type"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Name"}, "wait_time": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Wait Time"}}, "title": "DOMMetadata", "type": "object"}, "DashboardMetrics": {"description": "Model representing dashboard metrics with week-over-week comparisons.", "properties": {"analytics_degraded": {"default": false, "description": "Whether the eventual-consistency analytics lane was unavailable for this response. When true, execution aggregates and week-over-week comparisons (test_runs, tests_failing_*, avg_test_duration*, success/failure_run_count, workflow_run_count, *_wow) are placeholders rather than measurements, while onboarding, trial, billing, and Atlas facts remain current. Clients must render those analytics as unavailable instead of zero.", "title": "Analytics Degraded", "type": "boolean"}, "atlas_generation_running": {"default": false, "description": "Whether an Atlas exploration run is currently queued/running. Drives the 'map is building' onboarding state and defers session-based activation while generating.", "title": "Atlas Generation Running", "type": "boolean"}, "avg_test_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Average test execution duration in seconds", "title": "Avg Test Duration"}, "avg_test_duration_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in average duration (positive = increase)", "title": "Avg Test Duration Wow"}, "checklist_app_uploaded": {"default": false, "description": "Whether the user has uploaded an app (checklist step 1).", "title": "Checklist App Uploaded", "type": "boolean"}, "checklist_session_started": {"default": false, "description": "Whether the user has started a device session (checklist step 2).", "title": "Checklist Session Started", "type": "boolean"}, "checklist_test_created": {"default": false, "description": "Whether the user has created a test (checklist step 3).", "title": "Checklist Test Created", "type": "boolean"}, "connected_integrations": {"description": "List of connected integration IDs (e.g. 'github', 'slack', 'expo'). Used for bonus session nudges.", "items": {"type": "string"}, "title": "Connected Integrations", "type": "array"}, "dashboard_state": {"default": "mature", "description": "Dashboard view state: onboarding (checklist incomplete), intermediate (checklist done but no active plan), mature (fully active)", "enum": ["onboarding", "intermediate", "mature"], "title": "Dashboard State", "type": "string"}, "failure_run_count": {"default": 0, "description": "Total number of failed test execution runs.", "title": "Failure Run Count", "type": "integer"}, "has_atlas_map": {"default": false, "description": "Whether the org has a renderable Atlas map (any exploration run with atlas_status completed/partial). Own-milestone fact for the atlas onboarding lens.", "title": "Has Atlas Map", "type": "boolean"}, "has_payment_method": {"default": false, "description": "Whether the org has a payment method on file in Autumn/Stripe. When true, intermediate state shows upgrade CTA; when false, shows add-card CTA with bonus-session unlock.", "title": "Has Payment Method", "type": "boolean"}, "org_has_apps": {"default": false, "description": "Whether the org has any user-uploaded apps (controls whether 'upload app' step is shown).", "title": "Org Has Apps", "type": "boolean"}, "success_run_count": {"default": 0, "description": "Total number of completed (passed) test execution runs.", "title": "Success Run Count", "type": "integer"}, "test_runs": {"description": "Total number of test executions", "title": "Test Runs", "type": "integer"}, "test_runs_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in test runs (positive = increase)", "title": "Test Runs Wow"}, "tests_failing_count": {"description": "Raw number of tests currently failing", "title": "Tests Failing Count", "type": "integer"}, "tests_failing_count_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in failing tests count (positive = increase)", "title": "Tests Failing Count Wow"}, "tests_failing_percent": {"description": "Percentage of tests currently failing", "title": "Tests Failing Percent", "type": "number"}, "tests_failing_percent_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage point change in failing tests percentage (positive = increase)", "title": "Tests Failing Percent Wow"}, "total_tests": {"description": "Total number of tests", "title": "Total Tests", "type": "integer"}, "total_tests_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in total tests (positive = increase)", "title": "Total Tests Wow"}, "total_workflows": {"description": "Total number of workflows", "title": "Total Workflows", "type": "integer"}, "total_workflows_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in total workflows (positive = increase)", "title": "Total Workflows Wow"}, "trial_card_bonus_seconds": {"default": 0, "description": "Trial seconds granted for putting a card on file (CARD_BONUS_SECONDS). Static config value so the frontend can state the concrete reward in add-card CTAs.", "title": "Trial Card Bonus Seconds", "type": "integer"}, "trial_integration_bonus_seconds": {"default": 0, "description": "Trial seconds granted per connected integration (INTEGRATION_BONUS_SECONDS). Static config value so integration CTAs can state the concrete reward.", "title": "Trial Integration Bonus Seconds", "type": "integer"}, "trial_sessions_earned": {"default": 0, "description": "Free trial session limit earned through checklist completion (includes card-on-file bonus when applicable)", "title": "Trial Sessions Earned", "type": "integer"}, "trial_sessions_used": {"default": 0, "description": "Number of trial sessions already consumed by the org.", "title": "Trial Sessions Used", "type": "integer"}, "workflow_run_count": {"default": 0, "description": "Total workflow executions for the org (controls workflow slot visibility)", "title": "Workflow Run Count", "type": "integer"}}, "required": ["total_tests", "test_runs", "tests_failing_percent", "tests_failing_count", "avg_test_duration", "total_workflows"], "title": "DashboardMetrics", "type": "object"}, "DeleteAppResponse": {"description": "Response after deleting an app.", "properties": {"detached_tests": {"default": 0, "description": "Number of tests that were detached from this app", "title": "Detached Tests", "type": "integer"}, "message": {"title": "Message", "type": "string"}}, "required": ["message"], "title": "DeleteAppResponse", "type": "object"}, "DeleteModuleResponse": {"description": "Response model for delete operations", "properties": {"message": {"title": "Message", "type": "string"}}, "required": ["message"], "title": "DeleteModuleResponse", "type": "object"}, "DeleteWorkflowResponse": {"properties": {"data": {"$ref": "#/components/schemas/WorkflowsBaseSchema", "description": "Deleted workflow record"}, "message": {"description": "Status message", "title": "Message", "type": "string"}}, "required": ["data", "message"], "title": "DeleteWorkflowResponse", "type": "object"}, "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.", "properties": {"cleanup_level": {"$ref": "#/components/schemas/CleanupLevel", "default": "thorough", "description": "Level of cleanup to perform (default: THOROUGH for maximum cleanup)"}, "clear_app_data": {"default": true, "description": "Clear app data and cache via pm clear", "title": "Clear App Data", "type": "boolean"}, "clear_browser_data": {"default": true, "description": "Clear browsing data (history, cookies, cache) from all browsers", "title": "Clear Browser Data", "type": "boolean"}, "clear_clipboard": {"default": true, "description": "Clear clipboard contents", "title": "Clear Clipboard", "type": "boolean"}, "clear_downloads": {"default": true, "description": "Clear /sdcard/Download folder", "title": "Clear Downloads", "type": "boolean"}, "clear_notifications": {"default": true, "description": "Clear all pending notifications from previous test sessions", "title": "Clear Notifications", "type": "boolean"}, "clear_recent_apps": {"default": false, "description": "Clear recent apps list (requires root access, restarts framework). Expensive (~15-30s), broken on Play Store images. Auto-enabled for DEEP_CLEAN.", "title": "Clear Recent Apps", "type": "boolean"}, "clear_shared_storage": {"default": true, "description": "Clear Pictures, DCIM, Movies, Music, Documents folders", "title": "Clear Shared Storage", "type": "boolean"}, "custom_paths_to_clear": {"description": "Additional paths to clear on device", "items": {"type": "string"}, "title": "Custom Paths To Clear", "type": "array"}, "kill_background_apps": {"default": true, "description": "Kill all background applications", "title": "Kill Background Apps", "type": "boolean"}, "reset_system_ui": {"default": false, "description": "Reset SystemUI state including wallpaper to defaults. Expensive (~2-3s). Auto-enabled for DEEP_CLEAN.", "title": "Reset System Ui", "type": "boolean"}, "revoke_permissions": {"default": true, "description": "Revoke runtime permissions granted during test", "title": "Revoke Permissions", "type": "boolean"}, "uninstall_new_apps": {"default": true, "description": "Uninstall apps that were installed during the test session", "title": "Uninstall New Apps", "type": "boolean"}}, "title": "DeviceCleanupConfig", "type": "object"}, "DeviceLogsDownloadResponse": {"description": "Response model for device logs download URL.", "properties": {"compressed": {"title": "Compressed", "type": "boolean"}, "download_url": {"title": "Download Url", "type": "string"}, "file_size_bytes": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "File Size Bytes"}, "filename": {"title": "Filename", "type": "string"}, "partial": {"default": false, "title": "Partial", "type": "boolean"}}, "required": ["download_url", "filename", "compressed"], "title": "DeviceLogsDownloadResponse", "type": "object"}, "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.", "properties": {"device_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Device type/model (e.g., 'iPhone 16', 'Pixel 7')", "title": "Device Type"}, "height": {"description": "Device screen height in logical pixels", "title": "Height", "type": "integer"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Platform name ('ios' or 'android')", "title": "Platform"}, "runtime": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Device runtime version (e.g., 'iOS 18.5', 'Android 34')", "title": "Runtime"}, "width": {"description": "Device screen width in logical pixels", "title": "Width", "type": "integer"}}, "required": ["width", "height"], "title": "DeviceMetadata", "type": "object"}, "DevicePair": {"description": "A device model + runtime combination.", "properties": {"model": {"description": "Device model name (e.g. 'iPhone 16')", "title": "Model", "type": "string"}, "runtime": {"description": "OS runtime version (e.g. 'iOS 18.5')", "title": "Runtime", "type": "string"}}, "required": ["model", "runtime"], "title": "DevicePair", "type": "object"}, "DeviceSessionDetailItem": {"description": "Detailed device session payload for the canonical session viewer.", "properties": {"action_count": {"default": 0, "title": "Action Count", "type": "integer"}, "app_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}, "app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}, "build_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Version"}, "can_cancel": {"default": false, "title": "Can Cancel", "type": "boolean"}, "can_interact": {"default": false, "title": "Can Interact", "type": "boolean"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "duration_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration Seconds"}, "ended_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Ended At"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "has_test_execution": {"default": false, "title": "Has Test Execution", "type": "boolean"}, "has_video": {"default": false, "title": "Has Video", "type": "boolean"}, "id": {"title": "Id", "type": "string"}, "interaction_disabled_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Interaction Disabled Reason"}, "org_id": {"title": "Org Id", "type": "string"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "screen_height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Height"}, "screen_width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Width"}, "source": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source"}, "source_metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Source Metadata"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"title": "Status", "type": "string"}, "step_count": {"default": 0, "title": "Step Count", "type": "integer"}, "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"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "user_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Email"}, "user_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Id"}, "whep_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Whep Url"}, "workflow_execution_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}, "workflow_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Name"}, "workflow_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["id", "org_id", "status"], "title": "DeviceSessionDetailItem", "type": "object"}, "DiscountItem": {"description": "A reward/discount applied to the customer (from Autumn `rewards.discounts`).", "properties": {"code": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Code"}, "currency": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Currency"}, "discount_value": {"title": "Discount Value", "type": "number"}, "duration_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Duration Type"}, "duration_value": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Duration Value"}, "end": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "End"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}, "start": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Start"}, "type": {"title": "Type", "type": "string"}}, "required": ["id", "name", "type", "discount_value"], "title": "DiscountItem", "type": "object"}, "DuplicateTestRequest": {"description": "Request model for duplicating a test.", "properties": {"copy_cookies": {"default": true, "description": "Whether to copy cookies from the original test", "title": "Copy Cookies", "type": "boolean"}, "copy_variables": {"default": true, "description": "Whether to copy custom variables from the original test", "title": "Copy Variables", "type": "boolean"}, "new_app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "App ID to assign to the duplicated test. If not provided, keeps original app (or clears if cross-platform).", "title": "New App Id"}, "new_name": {"description": "Name for the duplicated test", "title": "New Name", "type": "string"}, "target_platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Target platform for cross-platform duplication (ios or android). If not provided, keeps original platform.", "title": "Target Platform"}, "test_id": {"description": "ID of the test to duplicate", "format": "uuid", "title": "Test Id", "type": "string"}}, "required": ["test_id", "new_name"], "title": "DuplicateTestRequest", "type": "object"}, "DuplicateTestResponse": {"description": "Response model for test duplication.", "properties": {"cookies_copied": {"default": 0, "description": "Number of cookies copied (if applicable)", "title": "Cookies Copied", "type": "integer"}, "message": {"description": "Success or error message", "title": "Message", "type": "string"}, "name": {"description": "Name of the duplicated test", "title": "Name", "type": "string"}, "platform": {"description": "Platform of the duplicated test (android/ios)", "title": "Platform", "type": "string"}, "steps_count": {"default": 0, "description": "Number of steps/tasks in the duplicated test", "title": "Steps Count", "type": "integer"}, "success": {"description": "Whether the duplication was successful", "title": "Success", "type": "boolean"}, "tags_copied": {"default": 0, "description": "Number of tags copied", "title": "Tags Copied", "type": "integer"}, "test_id": {"description": "ID of the newly created test", "format": "uuid", "title": "Test Id", "type": "string"}, "variables_copied": {"default": 0, "description": "Number of custom variables copied", "title": "Variables Copied", "type": "integer"}}, "required": ["success", "test_id", "name", "platform", "message"], "title": "DuplicateTestResponse", "type": "object"}, "EntitlementItem": {"properties": {"balance": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Balance"}, "conversions": {"default": [], "items": {"$ref": "#/components/schemas/CreditConversion"}, "title": "Conversions", "type": "array"}, "feature_id": {"title": "Feature Id", "type": "string"}, "granted": {"default": 0, "title": "Granted", "type": "number"}, "name": {"title": "Name", "type": "string"}, "overage_price": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Overage Price"}, "overage_price_label": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Overage Price Label"}, "unit": {"title": "Unit", "type": "string"}, "unlimited": {"default": false, "title": "Unlimited", "type": "boolean"}, "usage": {"default": 0, "title": "Usage", "type": "number"}}, "required": ["feature_id", "name", "unit"], "title": "EntitlementItem", "type": "object"}, "ExecuteTestAsyncAPIResponse": {"description": "Response for async test execution start.", "properties": {"id": {"description": "Execution ID", "format": "uuid", "title": "Id", "type": "string"}, "message": {"title": "Message", "type": "string"}, "session_id": {"description": "Idempotent device-session start ID", "format": "uuid", "title": "Session Id", "type": "string"}, "status": {"$ref": "#/components/schemas/AsyncStatus"}, "task_id": {"description": "Alias for id, for backwards compatibility with older clients.", "readOnly": true, "title": "Task Id", "type": "string"}}, "required": ["status", "message", "id", "session_id", "task_id"], "title": "ExecuteTestAsyncAPIResponse", "type": "object"}, "ExecuteWorkflowAsyncAPIResponse": {"description": "Response for async workflow execution start.", "properties": {"id": {"description": "Execution ID", "format": "uuid", "title": "Id", "type": "string"}, "message": {"title": "Message", "type": "string"}, "status": {"$ref": "#/components/schemas/AsyncStatus"}, "task_id": {"description": "Alias for id, for backwards compatibility with older clients.", "readOnly": true, "title": "Task Id", "type": "string"}}, "required": ["status", "message", "id", "task_id"], "title": "ExecuteWorkflowAsyncAPIResponse", "type": "object"}, "ExecutionModeConfig": {"description": "Configuration for execution modes and features.", "properties": {"cleanup_config": {"anyOf": [{"$ref": "#/components/schemas/DeviceCleanupConfig"}, {"type": "null"}], "description": "Configuration for AVD cleanup between test runs"}, "enable_planning": {"default": false, "description": "Enable planning for complex steps", "title": "Enable Planning", "type": "boolean"}, "enable_reflection": {"default": true, "description": "Enable reflection on failed steps", "title": "Enable Reflection", "type": "boolean"}, "grounder_type": {"anyOf": [{"$ref": "#/components/schemas/GrounderType"}, {"type": "null"}], "default": "moondream3"}, "initial_locale": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Initial device locale identifier, for example 'en_US' or 'fr_FR'", "title": "Initial Locale"}, "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"}], "description": "Initial device orientation: 'portrait' or 'landscape'", "title": "Initial Orientation"}, "network_capture": {"default": true, "description": "Attach an in-process TLS-capture agent to the (debuggable) app under test to record decrypted HTTP traffic. On by default (no-op/graceful on non-debuggable apps or attach failure); set False to disable as a per-run kill switch.", "title": "Network Capture", "type": "boolean"}, "reflection_retries": {"default": 1, "description": "Number of reflection retry attempts", "title": "Reflection Retries", "type": "integer"}, "retries": {"default": 1, "description": "Number of retry attempts", "title": "Retries", "type": "integer"}, "skip_app_install": {"default": false, "description": "Skip app installation during test execution", "title": "Skip App Install", "type": "boolean"}}, "title": "ExecutionModeConfig", "type": "object"}, "ExplorationCancelResponse": {"properties": {"execution_status": {"title": "Execution Status", "type": "string"}, "hatchet_cancelled": {"title": "Hatchet Cancelled", "type": "boolean"}, "run_id": {"title": "Run Id", "type": "string"}}, "required": ["run_id", "execution_status", "hatchet_cancelled"], "title": "ExplorationCancelResponse", "type": "object"}, "ExplorationLaneConfig": {"properties": {"auth_instructions": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Auth Instructions"}, "lane_index": {"title": "Lane Index", "type": "integer"}, "role": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Role"}, "seed_instructions": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Seed Instructions"}}, "required": ["lane_index"], "title": "ExplorationLaneConfig", "type": "object"}, "ExplorationLaunchRequest": {"properties": {"auth_instructions": {"anyOf": [{"maxLength": 4000, "type": "string"}, {"type": "null"}], "title": "Auth Instructions"}, "build_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Build Id"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "env_vars": {"additionalProperties": {"type": "string"}, "title": "Env Vars", "type": "object"}, "idle_timeout_seconds": {"anyOf": [{"maximum": 7200.0, "minimum": 60.0, "type": "integer"}, {"type": "null"}], "default": 900, "title": "Idle Timeout Seconds"}, "lane_count": {"default": 3, "maximum": 100.0, "minimum": 1.0, "title": "Lane Count", "type": "integer"}, "lanes": {"items": {"$ref": "#/components/schemas/ExplorationLaneConfig"}, "title": "Lanes", "type": "array"}, "launch_env_var_ids": {"items": {"format": "uuid", "type": "string"}, "title": "Launch Env Var Ids", "type": "array"}, "max_duration_seconds": {"default": 1800, "maximum": 7200.0, "minimum": 60.0, "title": "Max Duration Seconds", "type": "integer"}, "max_turns": {"anyOf": [{"maximum": 50.0, "minimum": 1.0, "type": "integer"}, {"type": "null"}], "title": "Max Turns"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "platform": {"default": "ios", "title": "Platform", "type": "string"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}]}, "seed_instructions": {"anyOf": [{"maxLength": 4000, "type": "string"}, {"type": "null"}], "title": "Seed Instructions"}, "swarm_strategy": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "balanced", "description": "Swarm allocation strategy; roles are derived programmatically.", "title": "Swarm Strategy"}}, "title": "ExplorationLaunchRequest", "type": "object"}, "ExplorationLaunchResponse": {"properties": {"report_url": {"title": "Report Url", "type": "string"}, "run": {"$ref": "#/components/schemas/ExplorationRunResponse"}}, "required": ["run", "report_url"], "title": "ExplorationLaunchResponse", "type": "object"}, "ExplorationRunReportChild": {"description": "A single exploration lane shaped as a run-report child card.", "properties": {"app_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}, "app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "lane_index": {"title": "Lane Index", "type": "integer"}, "lane_label": {"title": "Lane Label", "type": "string"}, "lane_role": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Lane Role"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "session_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Id"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "step_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Step Count"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "task_id": {"title": "Task Id", "type": "string"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "whep_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Whep Url"}, "workflow_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["task_id", "lane_index", "lane_label"], "title": "ExplorationRunReportChild", "type": "object"}, "ExplorationRunReportResponse": {"properties": {"app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "app_platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Platform"}, "children": {"items": {"$ref": "#/components/schemas/ExplorationRunReportChild"}, "title": "Children", "type": "array"}, "completed_children": {"default": 0, "title": "Completed Children", "type": "integer"}, "progress": {"default": 0.0, "title": "Progress", "type": "number"}, "run": {"$ref": "#/components/schemas/ExplorationRunResponse"}, "total_children": {"default": 0, "title": "Total Children", "type": "integer"}}, "required": ["run"], "title": "ExplorationRunReportResponse", "type": "object"}, "ExplorationRunResponse": {"properties": {"app_id": {"title": "App Id", "type": "string"}, "atlas_status": {"title": "Atlas Status", "type": "string"}, "build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "config": {"additionalProperties": true, "title": "Config", "type": "object"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "customer_status": {"title": "Customer Status", "type": "string"}, "execution_status": {"title": "Execution Status", "type": "string"}, "findings": {"items": {"additionalProperties": true, "type": "object"}, "title": "Findings", "type": "array"}, "id": {"title": "Id", "type": "string"}, "mode": {"title": "Mode", "type": "string"}, "sessions": {"items": {"$ref": "#/components/schemas/ExplorationSessionResponse"}, "title": "Sessions", "type": "array"}, "summary": {"additionalProperties": true, "title": "Summary", "type": "object"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "updated_at": {"format": "date-time", "title": "Updated At", "type": "string"}}, "required": ["id", "app_id", "mode", "execution_status", "atlas_status", "customer_status", "created_at", "updated_at"], "title": "ExplorationRunResponse", "type": "object"}, "ExplorationSessionConfig": {"description": "Per-device-session exploration contract passed from API to worker.", "properties": {"atlas_context": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Atlas Context"}, "auth_instructions": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Auth Instructions"}, "initial_instruction": {"title": "Initial Instruction", "type": "string"}, "lane_index": {"maximum": 99.0, "minimum": 0.0, "title": "Lane Index", "type": "integer"}, "lane_role": {"title": "Lane Role", "type": "string"}, "max_duration_seconds": {"default": 1800, "maximum": 7200.0, "minimum": 60.0, "title": "Max Duration Seconds", "type": "integer"}, "max_turns": {"anyOf": [{"maximum": 50.0, "minimum": 1.0, "type": "integer"}, {"type": "null"}], "title": "Max Turns"}, "mode": {"const": "atlas_coverage", "default": "atlas_coverage", "title": "Mode", "type": "string"}, "run_id": {"format": "uuid", "title": "Run Id", "type": "string"}, "run_session_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Run Session Id"}, "seed_instructions": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Seed Instructions"}}, "required": ["run_id", "lane_index", "lane_role", "initial_instruction"], "title": "ExplorationSessionConfig", "type": "object"}, "ExplorationSessionResponse": {"properties": {"atlas_layer_job_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Atlas Layer Job Id"}, "id": {"title": "Id", "type": "string"}, "lane_index": {"title": "Lane Index", "type": "integer"}, "lane_role": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Lane Role"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "session_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Id"}, "session_status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Status"}, "summary": {"additionalProperties": true, "title": "Summary", "type": "object"}, "workflow_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["id", "lane_index"], "title": "ExplorationSessionResponse", "type": "object"}, "ExtractBuildPackageIdResponse": {"description": "Response model for extracting package ID for a build.", "properties": {"error": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Error message if extraction failed", "title": "Error"}, "package_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Extracted bundle ID (iOS) or package name (Android)", "title": "Package Id"}}, "title": "ExtractBuildPackageIdResponse", "type": "object"}, "FallbackTrigger": {"description": "When to trigger cache fallback.\n\n- FINAL_FAIL: Only trigger fallback if overall test fails", "enum": ["final_fail"], "title": "FallbackTrigger", "type": "string"}, "GenerateWorkflowShareableLinkRequest": {"properties": {"expiration_hours": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Expiration Hours"}, "include_child_tests": {"default": false, "title": "Include Child Tests", "type": "boolean"}, "origin": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "https://app.revyl.ai", "title": "Origin"}, "workflow_task_id": {"title": "Workflow Task Id", "type": "string"}}, "required": ["workflow_task_id"], "title": "GenerateWorkflowShareableLinkRequest", "type": "object"}, "GenerateWorkflowShareableLinkResponse": {"properties": {"child_links_created": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Child Links Created"}, "shareable_link": {"title": "Shareable Link", "type": "string"}}, "required": ["shareable_link"], "title": "GenerateWorkflowShareableLinkResponse", "type": "object"}, "GetWorkflowsWithLastStatusResponse": {"properties": {"count": {"description": "Number of workflows in this page", "title": "Count", "type": "integer"}, "data": {"description": "List of workflows with last execution status", "items": {"$ref": "#/components/schemas/WorkflowWithLastStatus"}, "title": "Data", "type": "array"}, "failing_workflows_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in failing workflows (positive = increase)", "title": "Failing Workflows Wow"}, "has_more": {"default": false, "description": "Whether more workflows exist beyond this page", "title": "Has More", "type": "boolean"}, "limit": {"default": 100, "description": "Limit used for this page", "title": "Limit", "type": "integer"}, "not_run_workflows_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in not run workflows (positive = increase)", "title": "Not Run Workflows Wow"}, "offset": {"default": 0, "description": "Offset used for this page", "title": "Offset", "type": "integer"}, "passing_workflows_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in passing workflows (positive = increase)", "title": "Passing Workflows Wow"}, "total_count": {"default": 0, "description": "Total number of workflows across all pages", "title": "Total Count", "type": "integer"}, "total_workflows_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in total workflows (positive = increase)", "title": "Total Workflows Wow"}}, "required": ["data", "count"], "title": "GetWorkflowsWithLastStatusResponse", "type": "object"}, "GitDefaultBranchConfigurationSource": {"additionalProperties": false, "description": "Accepted default-branch source commit evidence.", "properties": {"kind": {"const": "git_default_branch", "title": "Kind", "type": "string"}, "resolved_config_commit_sha": {"pattern": "^([0-9a-f]{40}|[0-9a-f]{64})$", "title": "Resolved Config Commit Sha", "type": "string"}}, "required": ["kind", "resolved_config_commit_sha"], "title": "GitDefaultBranchConfigurationSource", "type": "object"}, "GitHubInstallUrlResponse": {"properties": {"install_url": {"title": "Install Url", "type": "string"}, "state_token": {"title": "State Token", "type": "string"}}, "required": ["state_token", "install_url"], "title": "GitHubInstallUrlResponse", "type": "object"}, "GlobalVariableCreate": {"description": "Request model for creating a global variable.", "properties": {"description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Description of the variable", "title": "Description"}, "is_secret": {"default": false, "description": "Whether the value should be encrypted and masked", "title": "Is Secret", "type": "boolean"}, "variable_name": {"description": "Name of the variable", "title": "Variable Name", "type": "string"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Value of the variable", "title": "Variable Value"}}, "required": ["variable_name"], "title": "GlobalVariableCreate", "type": "object"}, "GlobalVariableResponse": {"description": "Response model for single global variable operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"$ref": "#/components/schemas/GlobalVariableRow", "description": "Global variable record"}}, "required": ["message", "result"], "title": "GlobalVariableResponse", "type": "object"}, "GlobalVariableRow": {"description": "Row model for a global variable.", "properties": {"created_at": {"description": "Creation timestamp", "format": "date-time", "title": "Created At", "type": "string"}, "created_by": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User who created it", "title": "Created By"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Description", "title": "Description"}, "has_secret_value": {"default": false, "description": "Whether an encrypted value is stored for this variable", "title": "Has Secret Value", "type": "boolean"}, "id": {"description": "Unique identifier", "format": "uuid", "title": "Id", "type": "string"}, "is_secret": {"default": false, "description": "Whether the value is encrypted and masked", "title": "Is Secret", "type": "boolean"}, "org_id": {"description": "Organization ID", "format": "uuid", "title": "Org Id", "type": "string"}, "updated_at": {"description": "Last update timestamp", "format": "date-time", "title": "Updated At", "type": "string"}, "variable_name": {"description": "Name of the variable", "title": "Variable Name", "type": "string"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Value", "title": "Variable Value"}}, "required": ["id", "org_id", "variable_name", "created_at", "updated_at"], "title": "GlobalVariableRow", "type": "object"}, "GlobalVariableUpdate": {"description": "Request model for updating a global variable.", "properties": {"description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New description", "title": "Description"}, "is_secret": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "New secret flag", "title": "Is Secret"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New name", "title": "Variable Name"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New value", "title": "Variable Value"}}, "title": "GlobalVariableUpdate", "type": "object"}, "GlobalVariablesResponse": {"description": "Response model for global variable list operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"description": "List of global variable records", "items": {"$ref": "#/components/schemas/GlobalVariableRow"}, "title": "Result", "type": "array"}}, "required": ["message", "result"], "title": "GlobalVariablesResponse", "type": "object"}, "GroundRequest": {"properties": {"grounder_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Grounder model override", "title": "Grounder Type"}, "height": {"description": "Screenshot height in pixels", "exclusiveMinimum": 0.0, "title": "Height", "type": "integer"}, "image_base64": {"description": "Base64-encoded screenshot image (PNG or JPEG)", "title": "Image Base64", "type": "string"}, "platform": {"default": "android", "description": "Device platform", "title": "Platform", "type": "string"}, "session_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Device session ID for cost tracking", "title": "Session Id"}, "target": {"description": "Natural language description of the element to locate", "maxLength": 1000, "minLength": 1, "title": "Target", "type": "string"}, "width": {"description": "Screenshot width in pixels", "exclusiveMinimum": 0.0, "title": "Width", "type": "integer"}}, "required": ["target", "image_base64", "width", "height"], "title": "GroundRequest", "type": "object"}, "GroundResponse": {"properties": {"error": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Error message if failed", "title": "Error"}, "found": {"default": false, "description": "Whether the element was located", "title": "Found", "type": "boolean"}, "x": {"default": 0, "description": "Absolute X pixel coordinate", "title": "X", "type": "integer"}, "y": {"default": 0, "description": "Absolute Y pixel coordinate", "title": "Y", "type": "integer"}}, "title": "GroundResponse", "type": "object"}, "GrounderType": {"description": "Grounder configuration that determines the grounding model.\n\n- MOONDREAM/MOONDREAM3/MOONDREAM_CUSTOM/MODAL_CUSTOM: Two-step grounding\n- AUTO: Use GROUNDER_TYPE env var to determine grounder\n- NULL: Skip grounding (for testing/debugging)", "enum": ["moondream", "moondream3", "moondream_custom", "modal-custom", "auto", "null"], "title": "GrounderType", "type": "string"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "title": "Detail", "type": "array"}}, "title": "HTTPValidationError", "type": "object"}, "HotReloadRelayCreateRequest": {"properties": {"platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "provider": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Provider"}}, "title": "HotReloadRelayCreateRequest", "type": "object"}, "HotReloadRelayHeartbeatResponse": {"properties": {"active": {"title": "Active", "type": "boolean"}, "expires_at": {"title": "Expires At", "type": "string"}, "relay_id": {"title": "Relay Id", "type": "string"}}, "required": ["relay_id", "expires_at", "active"], "title": "HotReloadRelayHeartbeatResponse", "type": "object"}, "HotReloadRelayResponse": {"properties": {"connect_token": {"title": "Connect Token", "type": "string"}, "connect_url": {"title": "Connect Url", "type": "string"}, "expires_at": {"title": "Expires At", "type": "string"}, "public_url": {"title": "Public Url", "type": "string"}, "relay_id": {"title": "Relay Id", "type": "string"}, "transport": {"const": "relay", "default": "relay", "title": "Transport", "type": "string"}}, "required": ["relay_id", "public_url", "connect_url", "connect_token", "expires_at"], "title": "HotReloadRelayResponse", "type": "object"}, "HotReloadRelayRevokeResponse": {"properties": {"relay_id": {"title": "Relay Id", "type": "string"}, "revoked": {"title": "Revoked", "type": "boolean"}}, "required": ["relay_id", "revoked"], "title": "HotReloadRelayRevokeResponse", "type": "object"}, "IfBlock": {"description": "Block for conditional logic.", "properties": {"condition": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Condition to evaluate (alternative to 'step_description')", "title": "Condition"}, "elseChildren": {"description": "Blocks to execute if condition is false", "items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "title": "Elsechildren", "type": "array"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Unique identifier for the block (auto-generated if not provided)", "title": "Id"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Condition to evaluate (alternative to 'condition')", "title": "Step Description"}, "thenChildren": {"description": "Blocks to execute if condition is true", "items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "title": "Thenchildren", "type": "array"}, "type": {"const": "if", "title": "Type", "type": "string"}}, "required": ["type"], "title": "IfBlock", "type": "object"}, "IosStoreKitConfigRef": {"description": "Explicit iOS StoreKit Testing config choice for one scope.", "properties": {"content_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Content Type"}, "created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "file_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "File Id"}, "file_size": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "File Size"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Filename"}, "id": {"format": "uuid", "title": "Id", "type": "string"}, "mode": {"enum": ["file", "disabled"], "title": "Mode", "type": "string"}, "org_id": {"format": "uuid", "title": "Org Id", "type": "string"}, "scope_id": {"format": "uuid", "title": "Scope Id", "type": "string"}, "scope_type": {"enum": ["app", "build", "test"], "title": "Scope Type", "type": "string"}, "updated_at": {"format": "date-time", "title": "Updated At", "type": "string"}}, "required": ["id", "org_id", "scope_type", "scope_id", "mode", "created_at", "updated_at"], "title": "IosStoreKitConfigRef", "type": "object"}, "IosStoreKitConfigRefResponse": {"description": "Response for a single iOS StoreKit config ref mutation/read.", "properties": {"message": {"title": "Message", "type": "string"}, "result": {"anyOf": [{"$ref": "#/components/schemas/IosStoreKitConfigRef"}, {"type": "null"}]}}, "required": ["message"], "title": "IosStoreKitConfigRefResponse", "type": "object"}, "IosStoreKitConfigRefUpsertRequest": {"description": "Create or replace an explicit iOS StoreKit config choice.", "properties": {"file_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "File Id"}, "mode": {"enum": ["file", "disabled"], "title": "Mode", "type": "string"}, "scope_id": {"format": "uuid", "title": "Scope Id", "type": "string"}, "scope_type": {"enum": ["app", "build", "test"], "title": "Scope Type", "type": "string"}}, "required": ["scope_type", "scope_id", "mode"], "title": "IosStoreKitConfigRefUpsertRequest", "type": "object"}, "IosStoreKitConfigSnapshot": {"description": "Resolved iOS StoreKit config snapshot carried to worker launch.", "properties": {"available": {"default": true, "title": "Available", "type": "boolean"}, "content_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Content Type"}, "enabled": {"default": false, "title": "Enabled", "type": "boolean"}, "error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "file_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "File Id"}, "file_size": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "File Size"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Filename"}, "mode": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Mode"}, "scope_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Scope Id"}, "scope_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Scope Type"}, "source": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source"}}, "title": "IosStoreKitConfigSnapshot", "type": "object"}, "LLMConfig": {"description": "Configuration for LLM models used in different stages.", "properties": {"planning_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "LLM model for planning, defaults to primary_model if not set", "title": "Planning Model"}, "primary_model": {"default": "gemini/gemini-3.7-flash", "description": "Primary LLM model for step execution", "title": "Primary Model", "type": "string"}, "reflection_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "LLM model for reflection, defaults to primary_model if not set", "title": "Reflection Model"}}, "title": "LLMConfig", "type": "object"}, "LaunchConfigurationKind": {"description": "Stored app-launch configuration payload type.", "enum": ["key_value", "ios_arguments"], "title": "LaunchConfigurationKind", "type": "string"}, "LaunchEnvVarErrorCode": {"description": "Stable failure categories for resolving stored launch variables.", "enum": ["launch_variable_invalid", "launch_variable_service_unavailable", "launch_variable_service_error"], "title": "LaunchEnvVarErrorCode", "type": "string"}, "LaunchEnvVarErrorDetail": {"description": "Safe, actionable context for a launch-variable resolution failure.", "properties": {"code": {"$ref": "#/components/schemas/LaunchEnvVarErrorCode"}, "launch_env_var_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Launch Env Var Id"}, "launch_env_var_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Launch Env Var Key"}, "message": {"title": "Message", "type": "string"}, "retryable": {"title": "Retryable", "type": "boolean"}}, "required": ["code", "message", "retryable"], "title": "LaunchEnvVarErrorDetail", "type": "object"}, "LaunchEnvVarSnapshotEntry": {"description": "Sanitized immutable launch-variable fact stored on a device session.", "properties": {"arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Arguments"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Id"}, "is_secret": {"default": true, "title": "Is Secret", "type": "boolean"}, "key": {"title": "Key", "type": "string"}, "kind": {"$ref": "#/components/schemas/LaunchConfigurationKind", "default": "key_value"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Value"}}, "required": ["key"], "title": "LaunchEnvVarSnapshotEntry", "type": "object"}, "LocationConfig": {"description": "GPS location configuration for simulator/emulator.", "properties": {"latitude": {"description": "GPS latitude coordinate (-90 to 90)", "maximum": 90.0, "minimum": -90.0, "title": "Latitude", "type": "number"}, "longitude": {"description": "GPS longitude coordinate (-180 to 180)", "maximum": 180.0, "minimum": -180.0, "title": "Longitude", "type": "number"}}, "required": ["latitude", "longitude"], "title": "LocationConfig", "type": "object"}, "ManualConfigurationSource": {"additionalProperties": false, "description": "Accepted manual writer evidence.", "properties": {"kind": {"const": "manual", "title": "Kind", "type": "string"}}, "required": ["kind"], "title": "ManualConfigurationSource", "type": "object"}, "MobileTarget": {"description": "Persisted device target for a test (from ``test_mobile_targets``).\n\n``AUTO/AUTO`` represents \"follow the platform default at runtime\".", "properties": {"device_model": {"title": "Device Model", "type": "string"}, "os_version": {"title": "Os Version", "type": "string"}}, "required": ["device_model", "os_version"], "title": "MobileTarget", "type": "object"}, "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.", "properties": {"children": {"anyOf": [{"items": {"$ref": "#/components/schemas/ModuleBlock"}, "type": "array"}, {"type": "null"}], "title": "Children"}, "condition": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Condition"}, "elseChildren": {"anyOf": [{"items": {"$ref": "#/components/schemas/ModuleBlock"}, "type": "array"}, {"type": "null"}], "title": "Elsechildren"}, "file": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "File"}, "file_uri": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "File Uri"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Block ID (auto-generated if not provided)", "title": "Id"}, "module": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Module"}, "module_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Module Id"}, "script": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Script"}, "script_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Script Id"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Step Description"}, "step_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Step Type"}, "thenChildren": {"anyOf": [{"items": {"$ref": "#/components/schemas/ModuleBlock"}, "type": "array"}, {"type": "null"}], "title": "Thenchildren"}, "type": {"title": "Type", "type": "string"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Name"}, "variable_scope": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Scope"}}, "required": ["type"], "title": "ModuleBlock", "type": "object"}, "ModuleResponse": {"description": "Response model for a single module", "properties": {"blocks": {"items": {}, "title": "Blocks", "type": "array"}, "created_at": {"title": "Created At", "type": "string"}, "created_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created By"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "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"}, "name": {"title": "Name", "type": "string"}, "org_id": {"title": "Org Id", "type": "string"}, "updated_at": {"title": "Updated At", "type": "string"}, "version": {"default": 1, "title": "Version", "type": "integer"}}, "required": ["id", "org_id", "name", "blocks", "created_at", "updated_at"], "title": "ModuleResponse", "type": "object"}, "ModuleRestoreVersionRequest": {"description": "Request to restore a module to a previous version", "properties": {"version": {"description": "Version number to restore", "title": "Version", "type": "integer"}}, "required": ["version"], "title": "ModuleRestoreVersionRequest", "type": "object"}, "ModuleRestoreVersionResponse": {"description": "Response after restoring a module version", "properties": {"message": {"title": "Message", "type": "string"}, "new_version": {"title": "New Version", "type": "integer"}, "restored_from": {"title": "Restored From", "type": "integer"}, "result": {"$ref": "#/components/schemas/ModuleResponse"}}, "required": ["message", "result", "new_version", "restored_from"], "title": "ModuleRestoreVersionResponse", "type": "object"}, "ModuleSingleResponse": {"description": "Response model for single module operations", "properties": {"message": {"title": "Message", "type": "string"}, "result": {"$ref": "#/components/schemas/ModuleResponse"}}, "required": ["message", "result"], "title": "ModuleSingleResponse", "type": "object"}, "ModuleUsageResponse": {"description": "Response model for module usage lookup", "properties": {"tests": {"items": {"$ref": "#/components/schemas/ModuleUsageTestItem"}, "title": "Tests", "type": "array"}, "total": {"title": "Total", "type": "integer"}}, "required": ["tests", "total"], "title": "ModuleUsageResponse", "type": "object"}, "ModuleUsageTestItem": {"description": "A test that uses a specific module", "properties": {"id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "ModuleUsageTestItem", "type": "object"}, "ModuleVersionInfo": {"description": "A single version history entry", "properties": {"blocks": {"items": {}, "title": "Blocks", "type": "array"}, "created_at": {"title": "Created At", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "modified_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Modified By"}, "modified_by_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Modified By Email"}, "module_id": {"title": "Module Id", "type": "string"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "version": {"title": "Version", "type": "integer"}}, "required": ["id", "module_id", "version", "blocks", "created_at"], "title": "ModuleVersionInfo", "type": "object"}, "ModuleVersionListResponse": {"description": "Response for listing module versions", "properties": {"total": {"title": "Total", "type": "integer"}, "versions": {"items": {"$ref": "#/components/schemas/ModuleVersionInfo"}, "title": "Versions", "type": "array"}}, "required": ["versions", "total"], "title": "ModuleVersionListResponse", "type": "object"}, "ModulesListResponse": {"description": "Response model for listing modules", "properties": {"message": {"title": "Message", "type": "string"}, "result": {"items": {"$ref": "#/components/schemas/ModuleResponse"}, "title": "Result", "type": "array"}}, "required": ["message", "result"], "title": "ModulesListResponse", "type": "object"}, "OrgFile": {"description": "Full org file model with database fields.", "properties": {"content_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "MIME content type", "title": "Content Type"}, "created_at": {"description": "Upload timestamp", "format": "date-time", "title": "Created At", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "File description", "title": "Description"}, "file_size": {"description": "File size in bytes", "title": "File Size", "type": "integer"}, "filename": {"description": "Display name", "title": "Filename", "type": "string"}, "id": {"description": "File ID", "format": "uuid", "title": "Id", "type": "string"}, "org_id": {"description": "Organization ID", "format": "uuid", "title": "Org Id", "type": "string"}, "status": {"default": "ready", "description": "Upload status: 'pending' or 'ready'", "title": "Status", "type": "string"}, "updated_at": {"description": "Last update timestamp", "format": "date-time", "title": "Updated At", "type": "string"}, "user_id": {"description": "User ID who uploaded the file", "format": "uuid", "title": "User Id", "type": "string"}}, "required": ["id", "org_id", "user_id", "filename", "file_size", "created_at", "updated_at"], "title": "OrgFile", "type": "object"}, "OrgFileCompleteUploadRequest": {"description": "Request body for confirming a file upload completed successfully.", "properties": {"content_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New content type (for replace flow)", "title": "Content Type"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New description (for replace flow)", "title": "Description"}, "file_size": {"anyOf": [{"minimum": 1.0, "type": "integer"}, {"type": "null"}], "description": "New file size in bytes (for replace flow)", "title": "File Size"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New display name (for replace flow)", "title": "Filename"}, "s3_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New S3 key (required for replace flow)", "title": "S3 Key"}}, "title": "OrgFileCompleteUploadRequest", "type": "object"}, "OrgFileDownloadUrlResponse": {"description": "Response model for file download URL.", "properties": {"expires_in": {"description": "URL expiry in seconds", "title": "Expires In", "type": "integer"}, "filename": {"description": "Original filename", "title": "Filename", "type": "string"}, "url": {"description": "Presigned download URL", "title": "Url", "type": "string"}}, "required": ["url", "filename", "expires_in"], "title": "OrgFileDownloadUrlResponse", "type": "object"}, "OrgFileListResponse": {"description": "Response model for listing org files.", "properties": {"count": {"description": "Total count of files", "title": "Count", "type": "integer"}, "files": {"description": "List of files", "items": {"$ref": "#/components/schemas/OrgFile"}, "title": "Files", "type": "array"}}, "required": ["files", "count"], "title": "OrgFileListResponse", "type": "object"}, "OrgFileUpdate": {"description": "Model for updating an org file.", "properties": {"description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Description", "title": "Description"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Display name", "title": "Filename"}}, "title": "OrgFileUpdate", "type": "object"}, "OrgFileUploadRequest": {"description": "Request model for generating a presigned upload URL.", "properties": {"content_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "MIME content type", "title": "Content Type"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "File description", "title": "Description"}, "display_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Display name (defaults to filename)", "title": "Display Name"}, "file_size": {"description": "File size in bytes (used for size validation)", "minimum": 1.0, "title": "File Size", "type": "integer"}, "filename": {"description": "Original filename (used for extension validation)", "title": "Filename", "type": "string"}}, "required": ["filename", "file_size"], "title": "OrgFileUploadRequest", "type": "object"}, "OrgFileUploadResponse": {"description": "Response model for presigned upload URL.", "properties": {"content_type": {"description": "Content-Type to use in the PUT request", "title": "Content Type", "type": "string"}, "expires_in": {"description": "URL expiry in seconds", "title": "Expires In", "type": "integer"}, "file": {"$ref": "#/components/schemas/OrgFile", "description": "Created file record"}, "s3_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "S3 object key (used by client in confirm step for replace flow)", "title": "S3 Key"}, "upload_url": {"description": "Presigned S3 PUT URL", "title": "Upload Url", "type": "string"}}, "required": ["file", "upload_url", "expires_in", "content_type"], "title": "OrgFileUploadResponse", "type": "object"}, "OrgInstallation": {"properties": {"created_at": {"format": "date-time", "title": "Created At", "type": "string"}, "gh_installation_owner_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Gh Installation Owner Id"}, "id": {"format": "uuid", "title": "Id", "type": "string"}, "installation_id": {"title": "Installation Id", "type": "integer"}, "propel_org_id": {"title": "Propel Org Id", "type": "string"}, "status": {"title": "Status", "type": "string"}, "verified_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Verified At"}}, "required": ["id", "propel_org_id", "installation_id", "status", "created_at"], "title": "OrgInstallation", "type": "object"}, "OrgLaunchEnvVarCreate": {"description": "Request model for creating an org launch configuration.", "properties": {"arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Exact ordered tokens for an iOS argument set", "title": "Arguments"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Description of the variable", "title": "Description"}, "is_secret": {"default": true, "description": "Whether the value is encrypted and hidden on reads. Omission defaults to true for compatibility with legacy clients.", "title": "Is Secret", "type": "boolean"}, "key": {"description": "Launch variable key", "title": "Key", "type": "string"}, "kind": {"$ref": "#/components/schemas/LaunchConfigurationKind", "default": "key_value", "description": "Configuration payload type; omission preserves legacy key-value behavior"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Launch variable value", "title": "Value"}}, "required": ["key"], "title": "OrgLaunchEnvVarCreate", "type": "object"}, "OrgLaunchEnvVarDeleteResponse": {"description": "Response model for org launch environment variable deletion.", "properties": {"detached_test_count": {"description": "Number of tests detached during deletion", "title": "Detached Test Count", "type": "integer"}, "message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"$ref": "#/components/schemas/OrgLaunchEnvVarRow", "description": "Org launch environment variable"}}, "required": ["message", "result", "detached_test_count"], "title": "OrgLaunchEnvVarDeleteResponse", "type": "object"}, "OrgLaunchEnvVarResponse": {"description": "Response model for single org launch environment variable operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"$ref": "#/components/schemas/OrgLaunchEnvVarRow", "description": "Org launch environment variable"}}, "required": ["message", "result"], "title": "OrgLaunchEnvVarResponse", "type": "object"}, "OrgLaunchEnvVarRow": {"description": "Row model for an org launch configuration.", "properties": {"arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Ordered tokens for a non-secret iOS argument set. Secret argument sets are write-only and always returned as null.", "title": "Arguments"}, "attached_test_count": {"default": 0, "description": "Number of tests currently attached to this launch variable", "title": "Attached Test Count", "type": "integer"}, "created_at": {"description": "Creation timestamp", "format": "date-time", "title": "Created At", "type": "string"}, "created_by": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User who created it", "title": "Created By"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Description", "title": "Description"}, "has_value": {"default": true, "description": "Whether a value is stored for this variable", "title": "Has Value", "type": "boolean"}, "id": {"description": "Unique identifier", "format": "uuid", "title": "Id", "type": "string"}, "is_secret": {"default": true, "description": "Whether the stored value is encrypted and hidden on reads", "title": "Is Secret", "type": "boolean"}, "key": {"description": "Launch variable key", "title": "Key", "type": "string"}, "kind": {"$ref": "#/components/schemas/LaunchConfigurationKind", "default": "key_value", "description": "Configuration payload type"}, "org_id": {"description": "Organization ID", "format": "uuid", "title": "Org Id", "type": "string"}, "updated_at": {"description": "Last update timestamp", "format": "date-time", "title": "Updated At", "type": "string"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Plaintext value for non-secret launch variables. Secret values are write-only and always returned as null.", "title": "Value"}}, "required": ["id", "org_id", "key", "created_at", "updated_at"], "title": "OrgLaunchEnvVarRow", "type": "object"}, "OrgLaunchEnvVarUpdate": {"description": "Request model for updating an org launch environment variable.", "properties": {"arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Replacement exact ordered iOS argument tokens", "title": "Arguments"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Updated description", "title": "Description"}, "is_secret": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Updated secrecy state; omission preserves the current state", "title": "Is Secret"}, "key": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Updated launch variable key", "title": "Key"}, "kind": {"anyOf": [{"$ref": "#/components/schemas/LaunchConfigurationKind"}, {"type": "null"}], "description": "Updated configuration payload type"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Updated launch variable value", "title": "Value"}}, "title": "OrgLaunchEnvVarUpdate", "type": "object"}, "OrgLaunchEnvVarsResponse": {"description": "Response model for org launch environment variable list operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"description": "List of org launch environment variables", "items": {"$ref": "#/components/schemas/OrgLaunchEnvVarRow"}, "title": "Result", "type": "array"}}, "required": ["message", "result"], "title": "OrgLaunchEnvVarsResponse", "type": "object"}, "OrgRepository": {"properties": {"installation_id": {"title": "Installation Id", "type": "integer"}, "owner": {"title": "Owner", "type": "string"}, "repo": {"title": "Repo", "type": "string"}}, "required": ["owner", "repo", "installation_id"], "title": "OrgRepository", "type": "object"}, "OrganizationRepositoriesResponse": {"properties": {"github_integration_enabled": {"title": "Github Integration Enabled", "type": "boolean"}, "has_access": {"title": "Has Access", "type": "boolean"}, "installation": {"anyOf": [{"$ref": "#/components/schemas/OrgInstallation"}, {"type": "null"}]}, "repositories": {"items": {"$ref": "#/components/schemas/OrgRepository"}, "title": "Repositories", "type": "array"}}, "required": ["repositories", "installation", "has_access", "github_integration_enabled"], "title": "OrganizationRepositoriesResponse", "type": "object"}, "PaginatedAppsResponse": {"description": "Paginated response for apps.", "properties": {"has_next": {"description": "Whether there is a next page", "title": "Has Next", "type": "boolean"}, "has_previous": {"description": "Whether there is a previous page", "title": "Has Previous", "type": "boolean"}, "items": {"description": "List of apps for the current page", "items": {"$ref": "#/components/schemas/AppResponse"}, "title": "Items", "type": "array"}, "page": {"description": "Current page number (1-indexed)", "title": "Page", "type": "integer"}, "page_size": {"description": "Number of items per page", "title": "Page Size", "type": "integer"}, "platform_counts": {"anyOf": [{"$ref": "#/components/schemas/AppPlatformCounts"}, {"type": "null"}], "description": "Unfiltered per-platform counts"}, "total": {"description": "Total number of apps", "title": "Total", "type": "integer"}, "total_pages": {"description": "Total number of pages", "title": "Total Pages", "type": "integer"}}, "required": ["total", "page", "page_size", "total_pages", "has_next", "has_previous"], "title": "PaginatedAppsResponse", "type": "object"}, "PaginatedBuildsResponse": {"description": "Paginated response for builds.", "properties": {"has_next": {"description": "Whether there is a next page", "title": "Has Next", "type": "boolean"}, "has_previous": {"description": "Whether there is a previous page", "title": "Has Previous", "type": "boolean"}, "items": {"description": "List of builds for the current page", "items": {"$ref": "#/components/schemas/BuildResponse"}, "title": "Items", "type": "array"}, "page": {"description": "Current page number (1-indexed)", "title": "Page", "type": "integer"}, "page_size": {"description": "Number of items per page", "title": "Page Size", "type": "integer"}, "total": {"description": "Total number of builds", "title": "Total", "type": "integer"}, "total_pages": {"description": "Total number of pages", "title": "Total Pages", "type": "integer"}}, "required": ["total", "page", "page_size", "total_pages", "has_next", "has_previous"], "title": "PaginatedBuildsResponse", "type": "object"}, "PaginatedBuildsWithJobsResponse": {"description": "Paginated response for the Builds tab when build jobs are included.", "properties": {"has_next": {"description": "Whether there is a next page", "title": "Has Next", "type": "boolean"}, "has_previous": {"description": "Whether there is a previous page", "title": "Has Previous", "type": "boolean"}, "items": {"description": "Build artifacts and build jobs for the current page", "items": {"anyOf": [{"$ref": "#/components/schemas/BuildCollectionBuildItem"}, {"$ref": "#/components/schemas/BuildCollectionJobItem"}]}, "title": "Items", "type": "array"}, "page": {"description": "Current page number (1-indexed)", "title": "Page", "type": "integer"}, "page_size": {"description": "Number of items per page", "title": "Page Size", "type": "integer"}, "total": {"description": "Total number of build collection items", "title": "Total", "type": "integer"}, "total_pages": {"description": "Total number of pages", "title": "Total Pages", "type": "integer"}}, "required": ["total", "page", "page_size", "total_pages", "has_next", "has_previous"], "title": "PaginatedBuildsWithJobsResponse", "type": "object"}, "PlanInfo": {"properties": {"billing_exempt": {"default": false, "title": "Billing Exempt", "type": "boolean"}, "billing_period": {"default": "monthly", "enum": ["monthly", "yearly"], "title": "Billing Period", "type": "string"}, "cancels_at": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Cancels At"}, "discounts": {"default": [], "items": {"$ref": "#/components/schemas/DiscountItem"}, "title": "Discounts", "type": "array"}, "display_name": {"title": "Display Name", "type": "string"}, "entitlements": {"default": [], "items": {"$ref": "#/components/schemas/EntitlementItem"}, "title": "Entitlements", "type": "array"}, "free_credit_label": {"title": "Free Credit Label", "type": "string"}, "monthly_base": {"title": "Monthly Base", "type": "number"}, "period_end": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Period End"}, "period_start": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Period Start"}, "plan": {"title": "Plan", "type": "string"}, "plan_status": {"default": "active", "title": "Plan Status", "type": "string"}, "scheduled_billing_period": {"anyOf": [{"enum": ["monthly", "yearly"], "type": "string"}, {"type": "null"}], "title": "Scheduled Billing Period"}, "scheduled_plan": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Scheduled Plan"}}, "required": ["plan", "display_name", "monthly_base", "free_credit_label"], "title": "PlanInfo", "type": "object"}, "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.", "properties": {"app_id": {"description": "App UUID", "format": "uuid", "title": "App Id", "type": "string"}, "pinned_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional pinned version string", "title": "Pinned Version"}}, "required": ["app_id"], "title": "PlatformApp", "type": "object"}, "PlatformTargetConfig": {"description": "Available targets and default pair for a single platform.", "properties": {"available_models": {"description": "Device models selectable by users", "items": {"type": "string"}, "title": "Available Models", "type": "array"}, "available_runtimes": {"description": "OS runtimes that workers have installed", "items": {"type": "string"}, "title": "Available Runtimes", "type": "array"}, "compatible_runtimes": {"additionalProperties": {"items": {"type": "string"}, "type": "array"}, "description": "Model -> list of runtimes it can run. Models not listed are assumed to support all available_runtimes.", "title": "Compatible Runtimes", "type": "object"}, "default_pair": {"$ref": "#/components/schemas/DevicePair", "description": "Default device+runtime used for warm pool and frontend auto-selection"}}, "required": ["default_pair", "available_runtimes", "available_models"], "title": "PlatformTargetConfig", "type": "object"}, "PrReviewConfigSummary": {"description": "Compact, serializable summary of a parsed ``pr_review`` config.\n\nUsed for the settings-page banner and the PR comment. Persisted into\n``scm_review_configs.metadata`` via ``model_dump(mode=\"json\")``.", "properties": {"builds": {"items": {"$ref": "#/components/schemas/PrReviewConfigSummaryBuild"}, "title": "Builds", "type": "array"}, "checks": {"items": {"type": "string"}, "title": "Checks", "type": "array"}, "enabled": {"default": true, "title": "Enabled", "type": "boolean"}, "preset": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Preset"}, "preview_link": {"default": true, "title": "Preview Link", "type": "boolean"}, "project_root": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Project Root"}, "proof_harness_kind": {"$ref": "#/components/schemas/ProofHarnessKind", "default": "revyl"}, "proof_of_changes": {"default": false, "title": "Proof Of Changes", "type": "boolean"}, "strict_build_checks": {"default": true, "title": "Strict Build Checks", "type": "boolean"}, "workflows": {"items": {"type": "string"}, "title": "Workflows", "type": "array"}}, "title": "PrReviewConfigSummary", "type": "object"}, "PrReviewConfigSummaryBuild": {"description": "One enabled preview build in a config summary.", "properties": {"app": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App"}, "framework": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Framework"}, "image": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Image"}, "platform": {"title": "Platform", "type": "string"}, "use_existing_ci": {"default": false, "title": "Use Existing Ci", "type": "boolean"}}, "required": ["platform"], "title": "PrReviewConfigSummaryBuild", "type": "object"}, "ProjectBuildCache": {"additionalProperties": false, "description": "Canonical build-cache meaning shared by configuration contracts.", "properties": {"key": {"maxLength": 128, "minLength": 1, "title": "Key", "type": "string"}, "paths": {"items": {"type": "string"}, "minItems": 1, "title": "Paths", "type": "array"}}, "required": ["key", "paths"], "title": "ProjectBuildCache", "type": "object"}, "ProjectConfigurationAbsentPrecondition": {"additionalProperties": false, "description": "A writer explicitly observed that no project aggregate exists.", "properties": {"state": {"const": "absent", "title": "State", "type": "string"}}, "required": ["state"], "title": "ProjectConfigurationAbsentPrecondition", "type": "object"}, "ProjectConfigurationErrorResponse": {"additionalProperties": false, "description": "Stable public failure identity without customer-authored values.", "properties": {"code": {"maxLength": 120, "minLength": 1, "title": "Code", "type": "string"}, "message": {"maxLength": 240, "minLength": 1, "title": "Message", "type": "string"}}, "required": ["code", "message"], "title": "ProjectConfigurationErrorResponse", "type": "object"}, "ProjectConfigurationForbiddenDetail": {"additionalProperties": false, "description": "Current authenticated authorization rejection detail.", "properties": {"error": {"maxLength": 120, "minLength": 1, "title": "Error", "type": "string"}, "message": {"maxLength": 240, "minLength": 1, "title": "Message", "type": "string"}}, "required": ["error", "message"], "title": "ProjectConfigurationForbiddenDetail", "type": "object"}, "ProjectConfigurationForbiddenResponse": {"additionalProperties": false, "description": "FastAPI HTTPException envelope used by authorization dependencies.", "properties": {"detail": {"$ref": "#/components/schemas/ProjectConfigurationForbiddenDetail"}}, "required": ["detail"], "title": "ProjectConfigurationForbiddenResponse", "type": "object"}, "ProjectConfigurationPresentPrecondition": {"additionalProperties": false, "description": "A writer observed one exact opaque project aggregate revision.", "properties": {"project_configuration_hash": {"pattern": "^[0-9a-f]{64}$", "title": "Project Configuration Hash", "type": "string"}, "state": {"const": "present", "title": "State", "type": "string"}}, "required": ["state", "project_configuration_hash"], "title": "ProjectConfigurationPresentPrecondition", "type": "object"}, "ProjectConfigurationReadRequest": {"additionalProperties": false, "description": "Repository binding required before returning a project configuration.", "properties": {"locator": {"$ref": "#/components/schemas/ProjectConfigurationRepositoryLocator"}}, "required": ["locator"], "title": "ProjectConfigurationReadRequest", "type": "object"}, "ProjectConfigurationReadResponse": {"additionalProperties": false, "description": "Explicit absent or present state for one verified repository root.", "properties": {"resource": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationResource"}, {"type": "null"}]}, "state": {"enum": ["absent", "present"], "title": "State", "type": "string"}}, "required": ["state"], "title": "ProjectConfigurationReadResponse", "type": "object"}, "ProjectConfigurationReplaceRequest": {"additionalProperties": false, "description": "Complete caller-directed replacement guarded by the observed state.", "properties": {"configuration": {"$ref": "#/components/schemas/AuthoredRevylConfig"}, "force": {"default": false, "description": "Allow this replacement while preserving existing default-branch configuration authority", "title": "Force", "type": "boolean"}, "locator": {"$ref": "#/components/schemas/ProjectConfigurationRepositoryLocator"}, "precondition": {"discriminator": {"mapping": {"absent": "#/components/schemas/ProjectConfigurationAbsentPrecondition", "present": "#/components/schemas/ProjectConfigurationPresentPrecondition"}, "propertyName": "state"}, "oneOf": [{"$ref": "#/components/schemas/ProjectConfigurationAbsentPrecondition"}, {"$ref": "#/components/schemas/ProjectConfigurationPresentPrecondition"}], "title": "Precondition"}}, "required": ["locator", "configuration", "precondition"], "title": "ProjectConfigurationReplaceRequest", "type": "object"}, "ProjectConfigurationReplaceResponse": {"additionalProperties": false, "description": "Applied or idempotently unchanged canonical aggregate.", "properties": {"outcome": {"enum": ["applied", "unchanged"], "title": "Outcome", "type": "string"}, "resource": {"$ref": "#/components/schemas/ProjectConfigurationResource"}}, "required": ["outcome", "resource"], "title": "ProjectConfigurationReplaceResponse", "type": "object"}, "ProjectConfigurationRepositoryLocator": {"additionalProperties": false, "description": "Untrusted public locator for a repository-relative project root.", "properties": {"namespace": {"maxLength": 255, "minLength": 1, "title": "Namespace", "type": "string"}, "provider": {"const": "github", "title": "Provider", "type": "string"}, "repository_name": {"maxLength": 255, "minLength": 1, "title": "Repository Name", "type": "string"}, "repository_relative_project_root": {"maxLength": 1024, "minLength": 1, "title": "Repository Relative Project Root", "type": "string"}}, "required": ["provider", "namespace", "repository_name", "repository_relative_project_root"], "title": "ProjectConfigurationRepositoryLocator", "type": "object"}, "ProjectConfigurationRequestValidationErrorResponse": {"additionalProperties": false, "description": "Project-route validation response without customer-authored values.", "properties": {"errors": {"items": {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationIssue"}, "title": "Errors", "type": "array"}, "message": {"const": "Validation error", "title": "Message", "type": "string"}}, "required": ["message", "errors"], "title": "ProjectConfigurationRequestValidationErrorResponse", "type": "object"}, "ProjectConfigurationRequestValidationIssue": {"additionalProperties": false, "description": "Sanitized request-validation issue without customer input values.", "properties": {"field": {"maxLength": 240, "title": "Field", "type": "string"}, "message": {"maxLength": 200, "title": "Message", "type": "string"}, "type": {"maxLength": 120, "title": "Type", "type": "string"}}, "required": ["field", "message", "type"], "title": "ProjectConfigurationRequestValidationIssue", "type": "object"}, "ProjectConfigurationResource": {"additionalProperties": false, "description": "Canonical public representation of one persisted project aggregate.", "properties": {"authority": {"$ref": "#/components/schemas/ConfigurationAuthority"}, "configuration": {"$ref": "#/components/schemas/AuthoredRevylConfig"}, "namespace": {"maxLength": 255, "minLength": 1, "title": "Namespace", "type": "string"}, "project_configuration_hash": {"pattern": "^[0-9a-f]{64}$", "title": "Project Configuration Hash", "type": "string"}, "provider": {"const": "github", "title": "Provider", "type": "string"}, "repository_name": {"maxLength": 255, "minLength": 1, "title": "Repository Name", "type": "string"}, "repository_relative_config_path": {"maxLength": 1200, "minLength": 1, "title": "Repository Relative Config Path", "type": "string"}, "repository_relative_project_root": {"maxLength": 1024, "minLength": 1, "title": "Repository Relative Project Root", "type": "string"}, "source": {"discriminator": {"mapping": {"git_default_branch": "#/components/schemas/GitDefaultBranchConfigurationSource", "manual": "#/components/schemas/ManualConfigurationSource"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/components/schemas/ManualConfigurationSource"}, {"$ref": "#/components/schemas/GitDefaultBranchConfigurationSource"}], "title": "Source"}}, "required": ["configuration", "authority", "source", "provider", "namespace", "repository_name", "repository_relative_project_root", "repository_relative_config_path", "project_configuration_hash"], "title": "ProjectConfigurationResource", "type": "object"}, "ProjectConfigurationValidateRequest": {"additionalProperties": false, "description": "Candidate configuration and repository binding to validate without writing.", "properties": {"configuration": {"$ref": "#/components/schemas/AuthoredRevylConfig"}, "locator": {"$ref": "#/components/schemas/ProjectConfigurationRepositoryLocator"}}, "required": ["locator", "configuration"], "title": "ProjectConfigurationValidateRequest", "type": "object"}, "ProjectConfigurationValidateResponse": {"additionalProperties": false, "description": "Successful validation plus the current server state observed by the caller.", "properties": {"candidate_project_configuration_hash": {"pattern": "^[0-9a-f]{64}$", "title": "Candidate Project Configuration Hash", "type": "string"}, "current": {"$ref": "#/components/schemas/ProjectConfigurationReadResponse"}, "status": {"const": "valid", "title": "Status", "type": "string"}}, "required": ["status", "candidate_project_configuration_hash", "current"], "title": "ProjectConfigurationValidateResponse", "type": "object"}, "ProjectCursorProofAuthorizationResponse": {"additionalProperties": false, "description": "Current server-owned Cursor proof authorization state.", "properties": {"authorized": {"title": "Authorized", "type": "boolean"}, "authorized_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Authorized At"}, "project_id": {"format": "uuid", "title": "Project Id", "type": "string"}, "repository": {"$ref": "#/components/schemas/ProjectCursorProofRepository"}, "required": {"title": "Required", "type": "boolean"}}, "required": ["project_id", "required", "authorized", "repository"], "title": "ProjectCursorProofAuthorizationResponse", "type": "object"}, "ProjectCursorProofRepository": {"additionalProperties": false, "description": "Safe canonical repository display for one project.", "properties": {"namespace": {"maxLength": 255, "minLength": 1, "title": "Namespace", "type": "string"}, "provider": {"const": "github", "title": "Provider", "type": "string"}, "repository_name": {"maxLength": 255, "minLength": 1, "title": "Repository Name", "type": "string"}, "repository_relative_project_root": {"maxLength": 1024, "minLength": 1, "title": "Repository Relative Project Root", "type": "string"}}, "required": ["provider", "namespace", "repository_name", "repository_relative_project_root"], "title": "ProjectCursorProofRepository", "type": "object"}, "ProofHarnessKind": {"description": "Closed set of agents that can run a proof of changes.", "enum": ["revyl", "cursor"], "title": "ProofHarnessKind", "type": "string"}, "RedeemCLIDeviceCredentialRequest": {"description": "Poll from the CLI holding the device code.", "properties": {"device_code": {"description": "Secret issued when the authorization was created.", "maxLength": 128, "minLength": 32, "title": "Device Code", "type": "string"}}, "required": ["device_code"], "title": "RedeemCLIDeviceCredentialRequest", "type": "object"}, "RedeemCLIDeviceCredentialResponse": {"description": "Credential poll result.\n\nThe credential fields are populated exactly once, on the first poll that\nobserves an approval; every later poll for the same device code fails.", "properties": {"api_key_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "PropelAuth-assigned key ID, present only on the redeeming poll.", "title": "Api Key Id"}, "api_key_token": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Minted CLI credential, present only on the redeeming poll.", "title": "Api Key Token"}, "email": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Email of the approving user, present only on the redeeming poll.", "title": "Email"}, "org_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Organization the credential belongs to, present only on the redeeming poll.", "title": "Org Id"}, "state": {"$ref": "#/components/schemas/CLIDeviceAuthorizationState", "description": "Lifecycle state observed by this poll."}, "user_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Approving user's ID, present only on the redeeming poll.", "title": "User Id"}}, "required": ["state"], "title": "RedeemCLIDeviceCredentialResponse", "type": "object"}, "RemoteBuildArchiveSource": {"additionalProperties": false, "description": "Archive source previously uploaded through the remote upload-url endpoint.", "properties": {"key": {"description": "S3 source archive key returned by upload-url.", "title": "Key", "type": "string"}, "type": {"const": "archive", "title": "Type", "type": "string"}}, "required": ["type", "key"], "title": "RemoteBuildArchiveSource", "type": "object"}, "RemoteBuildGitSource": {"additionalProperties": false, "description": "Git source checked out by the remote build runner.", "properties": {"lfs": {"default": false, "title": "Lfs", "type": "boolean"}, "patch_key": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Patch Key"}, "ref": {"anyOf": [{"maxLength": 255, "type": "string"}, {"type": "null"}], "title": "Ref"}, "repo_url": {"maxLength": 2048, "title": "Repo Url", "type": "string"}, "type": {"const": "git", "title": "Type", "type": "string"}}, "required": ["type", "repo_url"], "title": "RemoteBuildGitSource", "type": "object"}, "RemoteBuildLogEvent": {"properties": {"id": {"title": "Id", "type": "string"}, "level": {"default": "info", "title": "Level", "type": "string"}, "message": {"title": "Message", "type": "string"}, "step_index": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Step Index"}, "ts": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Ts"}}, "required": ["id", "message"], "title": "RemoteBuildLogEvent", "type": "object"}, "RemoteBuildLogsResponse": {"properties": {"events": {"items": {"$ref": "#/components/schemas/RemoteBuildLogEvent"}, "title": "Events", "type": "array"}, "has_more_before": {"default": false, "title": "Has More Before", "type": "boolean"}, "next_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next Cursor"}, "previous_cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Previous Cursor"}}, "title": "RemoteBuildLogsResponse", "type": "object"}, "RemoteBuildPhaseTiming": {"description": "Duration metadata for one remote-build phase.", "properties": {"completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "duration_ms": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Duration Ms"}, "metadata": {"additionalProperties": true, "title": "Metadata", "type": "object"}, "phase": {"title": "Phase", "type": "string"}, "started_at": {"format": "date-time", "title": "Started At", "type": "string"}}, "required": ["phase", "started_at"], "title": "RemoteBuildPhaseTiming", "type": "object"}, "RemoteBuildRequest": {"additionalProperties": false, "description": "Request body to trigger a remote build.", "properties": {"build_definition_hash": {"anyOf": [{"pattern": "^[0-9a-f]{64}$", "type": "string"}, {"type": "null"}], "description": "Canonical hash of the resolved build recipe, when available.", "title": "Build Definition Hash"}, "clean_build": {"default": false, "title": "Clean Build", "type": "boolean"}, "config": {"$ref": "#/components/schemas/BuildConfig"}, "image": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "description": "Optional sandbox build image key. Defaults to latest.", "title": "Image"}, "set_as_current": {"default": true, "title": "Set As Current", "type": "boolean"}, "source": {"discriminator": {"mapping": {"archive": "#/components/schemas/RemoteBuildArchiveSource", "git": "#/components/schemas/RemoteBuildGitSource"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/components/schemas/RemoteBuildArchiveSource"}, {"$ref": "#/components/schemas/RemoteBuildGitSource"}], "title": "Source"}, "timeout_seconds": {"anyOf": [{"maximum": 14400.0, "minimum": 60.0, "type": "integer"}, {"type": "null"}], "description": "Server-enforced build timeout in seconds. Clamped to the platform maximum; defaults to 60 minutes when omitted.", "title": "Timeout Seconds"}, "version": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "description": "Version string. Auto-generated when omitted.", "title": "Version"}}, "required": ["source", "config"], "title": "RemoteBuildRequest", "type": "object"}, "RemoteBuildSourceUploadRequest": {"description": "Request body for obtaining a presigned URL to upload source code.\n\nAttributes:\n app_id: UUID of the target app.\n filename: Original filename of the source archive.\n file_size: Size of the archive in bytes. Optional \u2014 the S3\n presigned POST ``content-length-range`` condition enforces the\n size limit at upload time regardless of this value.", "properties": {"app_id": {"format": "uuid", "title": "App Id", "type": "string"}, "file_size": {"anyOf": [{"exclusiveMinimum": 0.0, "maximum": 524288000.0, "type": "integer"}, {"type": "null"}], "description": "Archive size in bytes (max 500 MB). Optional client-side hint.", "title": "File Size"}, "filename": {"default": "source.tar.gz", "pattern": "^[a-zA-Z0-9._\\-]{1,255}$", "title": "Filename", "type": "string"}}, "required": ["app_id"], "title": "RemoteBuildSourceUploadRequest", "type": "object"}, "RemoteBuildSourceUploadResponse": {"description": "Response containing the presigned POST URL and form fields for S3 upload.\n\nAttributes:\n upload_url: Presigned POST URL for multipart-form upload to S3.\n upload_fields: Form fields that must be included in the POST request.\n source_key: S3 object key where the source will be stored.\n expires_in: Number of seconds until the presigned URL expires.\n max_size_bytes: Maximum allowed archive size in bytes.", "properties": {"expires_in": {"title": "Expires In", "type": "integer"}, "max_size_bytes": {"title": "Max Size Bytes", "type": "integer"}, "source_key": {"title": "Source Key", "type": "string"}, "upload_fields": {"additionalProperties": {"type": "string"}, "description": "Form fields for the presigned POST (include in multipart request).", "title": "Upload Fields", "type": "object"}, "upload_url": {"title": "Upload Url", "type": "string"}}, "required": ["upload_url", "source_key", "expires_in", "max_size_bytes"], "title": "RemoteBuildSourceUploadResponse", "type": "object"}, "RemoteBuildStatusResponse": {"description": "Status payload returned when polling a remote build.\n\nAttributes:\n status: Current public build status.\n version_id: UUID of the created build version on success.\n version: Version string of the created build.\n error: Error message when the build has failed.\n phase: Detailed failure/status phase when available.\n suggested_fix: Suggested next action when available.\n candidate_artifacts: Candidate output artifacts when discovery failed.\n artifact_type: Artifact type created by the build.\n package_id: Bundle/package identifier extracted from the artifact.\n app_id: UUID of the app built.\n platform: Build platform.\n created_at: ISO timestamp when the build job was created.\n started_at: ISO timestamp when the build started executing.\n completed_at: ISO timestamp when the build finished.\n duration_ms: Build duration in milliseconds when known.\n phase_timings: Per-phase build timings when emitted by the worker.\n timeout_seconds: Server-enforced build timeout in seconds when known.", "properties": {"app_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}, "artifact_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Artifact Type"}, "candidate_artifacts": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Candidate Artifacts"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "duration_ms": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Duration Ms"}, "error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "package_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Package Id"}, "phase": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Phase"}, "phase_timings": {"anyOf": [{"items": {"$ref": "#/components/schemas/RemoteBuildPhaseTiming"}, "type": "array"}, {"type": "null"}], "title": "Phase Timings"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"title": "Status", "type": "string"}, "suggested_fix": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Suggested Fix"}, "timeout_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Timeout Seconds"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Version"}, "version_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Version Id"}}, "required": ["status"], "title": "RemoteBuildStatusResponse", "type": "object"}, "RemoteBuildSummary": {"description": "Compact summary of a single remote build job for list views.\n\nAttributes:\n build_job_id: Unique identifier of the build job (used to poll status).\n status: Normalized public status (``pending`` / ``building`` /\n ``success`` / ``failed`` / ``cancelled``).\n version: Version string of the build.\n platform: Build platform.\n phase: Detailed status/failure phase when available.\n build_id: UUID of the produced build version on success, when known.\n created_at: ISO timestamp when the build job was created.\n started_at: ISO timestamp when the build started executing.\n completed_at: ISO timestamp when the build finished.\n duration_ms: Build duration in milliseconds when known.\n is_active: Whether the build is still queued or running.", "properties": {"build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}, "build_job_id": {"title": "Build Job Id", "type": "string"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "duration_ms": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Duration Ms"}, "is_active": {"default": false, "title": "Is Active", "type": "boolean"}, "phase": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Phase"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"title": "Status", "type": "string"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Version"}}, "required": ["build_job_id", "status"], "title": "RemoteBuildSummary", "type": "object"}, "RemoteBuildTriggerResponse": {"description": "Response returned immediately after a build is enqueued.\n\nAttributes:\n build_job_id: Unique identifier used to poll build status.\n status: Initial public status (usually ``pending``).", "properties": {"build_job_id": {"title": "Build Job Id", "type": "string"}, "status": {"default": "pending", "title": "Status", "type": "string"}}, "required": ["build_job_id"], "title": "RemoteBuildTriggerResponse", "type": "object"}, "ReplaceTestLaunchEnvVarRefsRequest": {"description": "Request model for replacing launch variable attachments on a test.", "properties": {"env_var_ids": {"description": "Ordered list of org launch variable IDs to attach to the test", "items": {"type": "string"}, "title": "Env Var Ids", "type": "array"}, "test_id": {"description": "Test ID", "title": "Test Id", "type": "string"}}, "required": ["test_id"], "title": "ReplaceTestLaunchEnvVarRefsRequest", "type": "object"}, "ReportContextActionResponse": {"description": "High-context action payload for CLI/agent report consumption.", "properties": {"action_index": {"title": "Action Index", "type": "integer"}, "action_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Type"}, "agent_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Agent Description"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Id"}, "is_terminal": {"default": false, "title": "Is Terminal", "type": "boolean"}, "llm_call": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Llm Call"}, "llm_call_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Llm Call Id"}, "reasoning": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reasoning"}, "reflection_decision": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reflection Decision"}, "reflection_llm_call": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Reflection Llm Call"}, "reflection_llm_call_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reflection Llm Call Id"}, "reflection_reasoning": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reflection Reasoning"}, "reflection_suggestion": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Reflection Suggestion"}, "screenshot_after_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot After Url"}, "screenshot_before_clean_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot Before Clean Url"}, "screenshot_before_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Screenshot Before Url"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "step_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Step Id"}, "type_data": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Type Data"}, "video_timestamp_end": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Timestamp End"}, "video_timestamp_start": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Timestamp Start"}}, "required": ["action_index"], "title": "ReportContextActionResponse", "type": "object"}, "ReportContextResponse": {"description": "Canonical high-context report payload for CLI JSON consumption.", "properties": {"app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "build_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Version"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "device_metadata": {"anyOf": [{"$ref": "#/components/schemas/DeviceMetadata"}, {"type": "null"}]}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "device_state_partial": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Device State Partial"}, "device_state_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device State Url"}, "duration_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration Seconds"}, "effective_failed_steps": {"default": 0, "title": "Effective Failed Steps", "type": "integer"}, "effective_passed_steps": {"default": 0, "title": "Effective Passed Steps", "type": "integer"}, "effective_pending_steps": {"default": 0, "title": "Effective Pending Steps", "type": "integer"}, "effective_running_steps": {"default": 0, "title": "Effective Running Steps", "type": "integer"}, "effective_warning_steps": {"default": 0, "title": "Effective Warning Steps", "type": "integer"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "error_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Type"}, "execution_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Execution Id"}, "failed_steps": {"default": 0, "title": "Failed Steps", "type": "integer"}, "hardware_metrics_partial": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Hardware Metrics Partial"}, "hardware_metrics_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Hardware Metrics Url"}, "id": {"title": "Id", "type": "string"}, "launch_env_var_ids": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Launch Env Var Ids"}, "launch_env_var_keys": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Launch Env Var Keys"}, "launch_env_var_snapshot": {"anyOf": [{"items": {"$ref": "#/components/schemas/LaunchEnvVarSnapshotEntry"}, "type": "array"}, {"type": "null"}], "title": "Launch Env Var Snapshot"}, "locale": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Locale"}, "network_requests_partial": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Network Requests Partial"}, "network_requests_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Network Requests Url"}, "org_id": {"title": "Org Id", "type": "string"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "passed_steps": {"default": 0, "title": "Passed Steps", "type": "integer"}, "perfetto_trace_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Perfetto Trace Url"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "report_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Url"}, "screen_height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Height"}, "screen_width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Screen Width"}, "session_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Id"}, "session_status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Session Status"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "steps": {"anyOf": [{"items": {"$ref": "#/components/schemas/ReportContextStepResponse"}, "type": "array"}, {"type": "null"}], "title": "Steps"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "system_prompt": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "System Prompt"}, "test_goal_summary": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Goal Summary"}, "test_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}, "test_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Name"}, "test_version_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Version Id"}, "test_version_number": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Test Version Number"}, "tldr": {"anyOf": [{"$ref": "#/components/schemas/TLDROutput"}, {"type": "null"}]}, "total_steps": {"default": 0, "title": "Total Steps", "type": "integer"}, "total_validations": {"default": 0, "title": "Total Validations", "type": "integer"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "updated_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Updated At"}, "validations_passed": {"default": 0, "title": "Validations Passed", "type": "integer"}, "video_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Video Url"}, "warning_steps": {"default": 0, "title": "Warning Steps", "type": "integer"}, "whep_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Whep Url"}, "workflow_execution_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}}, "required": ["id", "org_id"], "title": "ReportContextResponse", "type": "object"}, "ReportContextStepResponse": {"description": "High-context step payload for CLI/agent report consumption.", "properties": {"actions": {"default": [], "items": {"$ref": "#/components/schemas/ReportContextActionResponse"}, "title": "Actions", "type": "array"}, "completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "effective_status": {"default": "pending", "title": "Effective Status", "type": "string"}, "effective_status_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Effective Status Reason"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "execution_order": {"title": "Execution Order", "type": "integer"}, "id": {"title": "Id", "type": "string"}, "llm_call": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Llm Call"}, "llm_call_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Llm Call Id"}, "node_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Node Id"}, "parent_step_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Parent Step Id"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report 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"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "status_reason": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status Reason"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Step Description"}, "step_type": {"title": "Step Type", "type": "string"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "type_data": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Type Data"}, "validation_reasoning": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Validation Reasoning"}, "validation_result": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Validation Result"}, "video_timestamp_end": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Timestamp End"}, "video_timestamp_start": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Timestamp Start"}}, "required": ["id", "execution_order", "step_type"], "title": "ReportContextStepResponse", "type": "object"}, "RepositoryProjectCatalogItem": {"additionalProperties": false, "description": "Stable project locator needed to select its canonical aggregate.", "properties": {"project_id": {"format": "uuid", "title": "Project Id", "type": "string"}, "repository_relative_config_path": {"maxLength": 1200, "minLength": 1, "title": "Repository Relative Config Path", "type": "string"}, "repository_relative_project_root": {"maxLength": 1024, "minLength": 1, "title": "Repository Relative Project Root", "type": "string"}}, "required": ["project_id", "repository_relative_project_root", "repository_relative_config_path"], "title": "RepositoryProjectCatalogItem", "type": "object"}, "RepositoryProjectCatalogQuery": {"additionalProperties": false, "description": "Repository identity whose canonical projects a caller may discover.", "properties": {"namespace": {"maxLength": 255, "minLength": 1, "title": "Namespace", "type": "string"}, "provider": {"const": "github", "title": "Provider", "type": "string"}, "repository_name": {"maxLength": 255, "minLength": 1, "title": "Repository Name", "type": "string"}}, "required": ["provider", "namespace", "repository_name"], "title": "RepositoryProjectCatalogQuery", "type": "object"}, "RepositoryProjectCatalogRepository": {"additionalProperties": false, "description": "Canonical provider display identity for one verified repository.", "properties": {"namespace": {"maxLength": 255, "minLength": 1, "title": "Namespace", "type": "string"}, "provider": {"const": "github", "title": "Provider", "type": "string"}, "report_mode": {"enum": ["pr_comment", "pr_description"], "title": "Report Mode", "type": "string"}, "repository_name": {"maxLength": 255, "minLength": 1, "title": "Repository Name", "type": "string"}}, "required": ["provider", "namespace", "repository_name", "report_mode"], "title": "RepositoryProjectCatalogRepository", "type": "object"}, "RepositoryProjectCatalogResponse": {"additionalProperties": false, "description": "Complete bounded canonical project set for a verified repository.", "properties": {"projects": {"items": {"$ref": "#/components/schemas/RepositoryProjectCatalogItem"}, "maxItems": 1024, "title": "Projects", "type": "array"}, "repository": {"$ref": "#/components/schemas/RepositoryProjectCatalogRepository"}}, "required": ["repository", "projects"], "title": "RepositoryProjectCatalogResponse", "type": "object"}, "ResolvedBuild": {"description": "Normalized representation of a resolved build artifact.", "properties": {"artifact_kind": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Artifact Kind"}, "artifact_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Artifact Url"}, "build_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Name"}, "build_var_id": {"format": "uuid", "title": "Build Var Id", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "download_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Download Url"}, "metadata": {"additionalProperties": true, "title": "Metadata", "type": "object"}, "package_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Package Name"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "static_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Static Url"}, "system_prompt": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "System Prompt"}, "uploaded_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Uploaded At"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Version"}, "version_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Version Id"}}, "required": ["build_var_id"], "title": "ResolvedBuild", "type": "object"}, "RevokeCLIApiKeyRequest": {"description": "Request to revoke a browser-issued CLI API key.", "properties": {"api_key_id": {"description": "The PropelAuth-assigned API key ID to revoke.", "title": "Api Key Id", "type": "string"}}, "required": ["api_key_id"], "title": "RevokeCLIApiKeyRequest", "type": "object"}, "RevokeCLIApiKeyResponse": {"description": "Response from revoking a browser-issued CLI API key.", "properties": {"message": {"description": "Human-readable status message.", "title": "Message", "type": "string"}, "success": {"description": "Whether the CLI API key was revoked.", "title": "Success", "type": "boolean"}}, "required": ["success", "message"], "title": "RevokeCLIApiKeyResponse", "type": "object"}, "RevylProofHarness": {"additionalProperties": false, "description": "Revyl's own step agent driving a device session (the default).", "properties": {"kind": {"const": "revyl", "title": "Kind", "type": "string"}}, "required": ["kind"], "title": "RevylProofHarness", "type": "object"}, "ScmActions": {"properties": {"adaptive_system_prompt": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Adaptive System Prompt"}, "adaptive_validation": {"default": false, "title": "Adaptive Validation", "type": "boolean"}, "curated_workflows": {"items": {"type": "string"}, "title": "Curated Workflows", "type": "array"}, "natural_language_assertions": {"items": {"type": "string"}, "title": "Natural Language Assertions", "type": "array"}, "preview_link": {"default": true, "title": "Preview Link", "type": "boolean"}, "project_root": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Optional checkout-relative directory containing `.revyl/config.yaml` for Cursor proof runs (e.g. `ios`).", "title": "Project Root"}, "proof_harness": {"description": "Which agent runs the proof of changes.", "discriminator": {"mapping": {"cursor": "#/components/schemas/CursorProofHarness", "revyl": "#/components/schemas/RevylProofHarness"}, "propertyName": "kind"}, "oneOf": [{"$ref": "#/components/schemas/RevylProofHarness"}, {"$ref": "#/components/schemas/CursorProofHarness"}], "title": "Proof Harness"}, "strict_build_checks": {"default": true, "title": "Strict Build Checks", "type": "boolean"}}, "title": "ScmActions", "type": "object"}, "ScmBuildTargetResponse": {"properties": {"app_id": {"format": "uuid", "title": "App Id", "type": "string"}, "build_configuration": {"$ref": "#/components/schemas/BuildConfig"}, "build_configuration_id": {"format": "uuid", "title": "Build Configuration Id", "type": "string"}, "enabled": {"default": true, "title": "Enabled", "type": "boolean"}, "framework": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Framework"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "platform": {"enum": ["ios", "android"], "title": "Platform", "type": "string"}, "source_subdir": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Subdir"}, "use_existing_ci": {"default": false, "title": "Use Existing Ci", "type": "boolean"}}, "required": ["build_configuration_id", "app_id", "platform", "build_configuration"], "title": "ScmBuildTargetResponse", "type": "object"}, "ScmConfigFileStateResponse": {"description": "Detection state of the committed ``.revyl/config.yaml`` for a repo.\n\nAttributes:\n status: ``managed`` (file applied), ``error`` (file present but\n unusable), or ``none`` (UI-managed; no usable file).\n config_file_path: The detected file path, if any.\n commit_sha: The detected file blob sha, if any.\n html_url: A link to the file on the provider, if any.\n error: An actionable error message, if any.\n summary: Compact summary of the applied config, if managed.\n synced_at: ISO timestamp of the last reconcile, if any.", "properties": {"commit_sha": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Commit Sha"}, "config_file_path": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Config File Path"}, "error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "html_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Html Url"}, "status": {"title": "Status", "type": "string"}, "summary": {"anyOf": [{"$ref": "#/components/schemas/PrReviewConfigSummary"}, {"type": "null"}]}, "synced_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Synced At"}}, "required": ["status"], "title": "ScmConfigFileStateResponse", "type": "object"}, "ScmConfigResponse": {"properties": {"actions": {"$ref": "#/components/schemas/ScmActions"}, "build_targets": {"items": {"$ref": "#/components/schemas/ScmBuildTargetResponse"}, "title": "Build Targets", "type": "array"}, "config_file_state": {"anyOf": [{"$ref": "#/components/schemas/ScmConfigFileStateResponse"}, {"type": "null"}], "description": "Committed config-as-code state for this repository, if known."}, "enabled": {"title": "Enabled", "type": "boolean"}, "github_installation_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "deprecated": true, "description": "Deprecated: use installation_id. Kept on the wire for released revyl-cli binaries; removal requires a CLI deprecation window.", "title": "Github Installation Id"}, "github_repository_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Github Repository Id"}, "id": {"format": "uuid", "title": "Id", "type": "string"}, "installation_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Provider-native installation id (neutral twin of the github_* fields).", "title": "Installation Id"}, "label_filters": {"items": {"type": "string"}, "title": "Label Filters", "type": "array"}, "last_synced_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Last Synced At"}, "namespace": {"title": "Namespace", "type": "string"}, "path_filters": {"items": {"type": "string"}, "title": "Path Filters", "type": "array"}, "preset": {"title": "Preset", "type": "string"}, "profiles": {"$ref": "#/components/schemas/ScmProfiles"}, "project": {"title": "Project", "type": "string"}, "proof_launch": {"anyOf": [{"$ref": "#/components/schemas/ScmProofLaunchAuthority"}, {"type": "null"}], "description": "Who authorized unattended Cursor proof launches for this repository, when present."}, "provider": {"title": "Provider", "type": "string"}, "repo_full_name": {"title": "Repo Full Name", "type": "string"}, "skip_drafts": {"title": "Skip Drafts", "type": "boolean"}}, "required": ["id", "provider", "namespace", "project", "repo_full_name", "enabled", "preset", "skip_drafts", "path_filters", "label_filters", "actions", "profiles", "build_targets"], "title": "ScmConfigResponse", "type": "object"}, "ScmConfigsResponse": {"properties": {"configs": {"items": {"$ref": "#/components/schemas/ScmConfigResponse"}, "title": "Configs", "type": "array"}, "github_integration_enabled": {"deprecated": true, "description": "Deprecated: use integration_enabled. Kept on the wire for released revyl-cli binaries; removal requires a CLI deprecation window.", "title": "Github Integration Enabled", "type": "boolean"}, "has_access": {"title": "Has Access", "type": "boolean"}, "integration_enabled": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Whether the requested provider's integration is enabled.", "title": "Integration Enabled"}}, "required": ["has_access", "github_integration_enabled", "configs"], "title": "ScmConfigsResponse", "type": "object"}, "ScmPlatformProfile": {"properties": {"device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "enabled": {"default": false, "title": "Enabled", "type": "boolean"}, "idle_timeout_seconds": {"anyOf": [{"maximum": 7200.0, "minimum": 60.0, "type": "integer"}, {"type": "null"}], "title": "Idle Timeout Seconds"}, "launch_env_var_ids": {"items": {"format": "uuid", "type": "string"}, "title": "Launch Env Var Ids", "type": "array"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "workflow_ids": {"items": {"type": "string"}, "title": "Workflow Ids", "type": "array"}}, "title": "ScmPlatformProfile", "type": "object"}, "ScmProfiles": {"properties": {"android": {"$ref": "#/components/schemas/ScmPlatformProfile"}, "ios": {"$ref": "#/components/schemas/ScmPlatformProfile"}}, "title": "ScmProfiles", "type": "object"}, "ScmProofLaunchAuthority": {"description": "Whose authority an unattended proof launch acts under.\n\nLives in ``metadata`` rather than ``actions`` for two reasons. ``actions``\nfeeds ``config_policy_hash``, and proof runs are keyed on that hash, so an\nidentity there would fork a fresh run every time a different admin saved\nsettings. ``metadata`` is also written with a preserving ``||`` merge, so a\nconfig-as-code sync cannot silently drop the stored authority.\n\nAttributes:\n user_id: The human principal stamped server-side from the authenticated\n caller. A client-supplied value is always discarded, since a caller\n must not be able to nominate somebody else's authority.\n authorized_at: When the setting was saved, so an operator can tell a\n stale authorization from a never-authorized repository.", "properties": {"authorized_at": {"title": "Authorized At", "type": "string"}, "user_id": {"format": "uuid", "title": "User Id", "type": "string"}}, "required": ["user_id", "authorized_at"], "title": "ScmProofLaunchAuthority", "type": "object"}, "ScriptUsageModuleItem": {"description": "A module that uses a specific script as a step, and is itself used by\nat least one test", "properties": {"id": {"format": "uuid", "title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "ScriptUsageModuleItem", "type": "object"}, "ScriptUsageResponse": {"description": "Response model for script usage lookup", "properties": {"modules": {"items": {"$ref": "#/components/schemas/ScriptUsageModuleItem"}, "title": "Modules", "type": "array"}, "tests": {"items": {"$ref": "#/components/schemas/ScriptUsageTestItem"}, "title": "Tests", "type": "array"}, "total": {"title": "Total", "type": "integer"}}, "required": ["tests", "modules", "total"], "title": "ScriptUsageResponse", "type": "object"}, "ScriptUsageTestItem": {"description": "A test that uses a specific script directly as a step", "properties": {"id": {"format": "uuid", "title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "ScriptUsageTestItem", "type": "object"}, "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.", "properties": {"content_type": {"default": "application/zip", "title": "Content Type", "type": "string"}, "file_size": {"exclusiveMinimum": 0.0, "maximum": 104857600.0, "title": "File Size", "type": "integer"}}, "required": ["file_size"], "title": "SessionArtifactUploadRequest", "type": "object"}, "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.", "properties": {"download_url": {"title": "Download Url", "type": "string"}, "expires_in": {"title": "Expires In", "type": "integer"}, "s3_key": {"title": "S3 Key", "type": "string"}, "upload_url": {"title": "Upload Url", "type": "string"}}, "required": ["upload_url", "download_url", "s3_key", "expires_in"], "title": "SessionArtifactUploadResponse", "type": "object"}, "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 \u2192 STARTING \u2192 RUNNING \u2192 STOPPING \u2192 COMPLETED/FAILED/TIMEOUT/CANCELLED\n \u2198 VERIFYING \u2192 STOPPING\n \u2198 VALIDATING \u2192 COMPLETED/FAILED", "enum": ["queued", "starting", "running", "verifying", "stopping", "validating", "completed", "failed", "cancelled", "timeout"], "title": "SessionStatus", "type": "string"}, "ShareableReportBySessionModel": {"description": "Request model for generating a shareable report link by session_id.", "properties": {"expiration_hours": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Hours until the link expires. None means never (100 years).", "title": "Expiration Hours"}, "origin": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "https://app.revyl.ai", "description": "Origin URL for constructing the shareable link", "title": "Origin"}, "session_id": {"description": "Device session UUID", "format": "uuid", "title": "Session Id", "type": "string"}}, "required": ["session_id"], "title": "ShareableReportBySessionModel", "type": "object"}, "ShareableReportByTaskModel": {"properties": {"expiration_hours": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Expiration Hours"}, "origin": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "https://app.revyl.ai", "title": "Origin"}, "task_id": {"title": "Task Id", "type": "string"}}, "required": ["task_id"], "title": "ShareableReportByTaskModel", "type": "object"}, "ShareableReportResponse": {"description": "Response model for generate_shareable_report_link endpoint.", "example": {"shareable_link": "https://app.revyl.ai/tests/report?token=uuid-token-here"}, "properties": {"shareable_link": {"description": "Generated shareable link for the report", "title": "Shareable Link", "type": "string"}}, "required": ["shareable_link"], "title": "ShareableReportResponse", "type": "object"}, "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.", "properties": {"app_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}, "app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}, "platform": {"title": "Platform", "type": "string"}, "tags": {"default": [], "items": {"$ref": "#/components/schemas/SimpleTestTagItem"}, "title": "Tags", "type": "array"}}, "required": ["id", "name", "platform"], "title": "SimpleTestItem", "type": "object"}, "SimpleTestListResponse": {"description": "Response model for simple test list endpoint.", "properties": {"count": {"title": "Count", "type": "integer"}, "tests": {"items": {"$ref": "#/components/schemas/SimpleTestItem"}, "title": "Tests", "type": "array"}}, "required": ["tests", "count"], "title": "SimpleTestListResponse", "type": "object"}, "SimpleTestTagItem": {"description": "Lightweight tag reference attached to a SimpleTestItem.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Color"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "SimpleTestTagItem", "type": "object"}, "StartDeviceInfo": {"properties": {"app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "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 \u2014 use `app_package`.", "title": "App Id"}, "app_link": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Link"}, "app_package": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Package"}, "app_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Url"}, "backend_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Backend Url"}, "build_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "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`.", "title": "Build Id"}, "device_local": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Device Local"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "device_runner_id": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "description": "Optional worker DEVICE_ID label to require for direct device sessions.", "title": "Device Runner Id"}, "env_vars": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "title": "Env Vars"}, "exploration_config": {"anyOf": [{"$ref": "#/components/schemas/ExplorationSessionConfig"}, {"type": "null"}], "description": "Optional reusable exploration-run context. When present, the worker can run an exploratory session instead of a static test."}, "idle_timeout_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Idle Timeout Seconds"}, "is_simulation": {"default": false, "title": "Is Simulation", "type": "boolean"}, "launch_arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Explicit iOS app arguments in exact token order", "title": "Launch Arguments"}, "launch_env_var_ids": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Org launch variable IDs selected for a raw device session. Only valid when `test_id` is absent.", "title": "Launch Env Var Ids"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "platform": {"default": "android", "title": "Platform", "type": "string"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}]}, "session_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Session Id"}, "startup_session_start_monotonic": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Startup Session Start Monotonic"}, "storekit_config": {"anyOf": [{"$ref": "#/components/schemas/IosStoreKitConfigSnapshot"}, {"type": "null"}], "description": "Resolved iOS StoreKit Testing config for this launch."}, "test_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Test Id"}, "test_info": {"anyOf": [{"$ref": "#/components/schemas/Test"}, {"type": "null"}]}, "user_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "User Id"}, "viewport": {"anyOf": [{"$ref": "#/components/schemas/Viewport"}, {"type": "null"}]}, "worker_ws_server": {"anyOf": [{}, {"type": "null"}], "title": "Worker Ws Server"}, "workflow_run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "title": "StartDeviceInfo", "type": "object"}, "StartDeviceResponse": {"description": "Structured response for the `start_device` endpoint.", "properties": {"error": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error"}, "error_detail": {"anyOf": [{"$ref": "#/components/schemas/LaunchEnvVarErrorDetail"}, {"type": "null"}]}, "iframe_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Iframe Url"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Message"}, "platform": {"title": "Platform", "type": "string"}, "retry_allowed": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Retry Allowed"}, "session_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Session Id"}, "status": {"$ref": "#/components/schemas/AsyncStatus"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "OpenTelemetry trace ID (32 hex chars, no dashes) for Grafana correlation", "title": "Trace Id"}, "websocket_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Websocket Url"}, "workflow_run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["status", "platform"], "title": "StartDeviceResponse", "type": "object"}, "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.", "enum": ["instruction", "validation", "extract", "scrape", "decision", "loop", "explore_continue", "end", "wait", "navigate", "back", "open_app", "kill_app", "go_home", "code_execution", "download_file", "set_location", "set_orientation", "set_appearance", "play_audio", "set_font_size", "module_import", "tap", "click", "double_tap", "input", "swipe", "drag", "pinch", "clear_text", "long_press", "select"], "title": "StepType", "type": "string"}, "SyncTagsRequest": {"description": "Request to sync tags for a test by name.", "properties": {"tag_names": {"items": {"type": "string"}, "title": "Tag Names", "type": "array"}}, "required": ["tag_names"], "title": "SyncTagsRequest", "type": "object"}, "SyncTagsResponse": {"description": "Response from sync operation.", "properties": {"tags": {"items": {"$ref": "#/components/schemas/TagSyncResultItem"}, "title": "Tags", "type": "array"}, "test_id": {"title": "Test Id", "type": "string"}}, "required": ["test_id", "tags"], "title": "SyncTagsResponse", "type": "object"}, "TLDRKeyMoment": {"description": "Key moment extracted from test execution", "properties": {"description": {"title": "Description", "type": "string"}, "importance": {"title": "Importance", "type": "string"}, "step_reference": {"title": "Step Reference", "type": "string"}}, "required": ["step_reference", "description", "importance"], "title": "TLDRKeyMoment", "type": "object"}, "TLDROutput": {"description": "TLDR output with structured citations", "properties": {"insights": {"items": {"type": "string"}, "title": "Insights", "type": "array"}, "key_moments": {"items": {"$ref": "#/components/schemas/TLDRKeyMoment"}, "title": "Key Moments", "type": "array"}, "llm_metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Llm Metadata"}, "test_case": {"title": "Test Case", "type": "string"}}, "required": ["test_case", "key_moments", "insights"], "title": "TLDROutput", "type": "object"}, "Tag": {"description": "Tag model for API responses - used for test categorization.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "#6B7280", "title": "Color"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "Tag", "type": "object"}, "TagListResponse": {"description": "Response model for listing tags.", "properties": {"tags": {"items": {"$ref": "#/components/schemas/TagWithCountResponse"}, "title": "Tags", "type": "array"}}, "required": ["tags"], "title": "TagListResponse", "type": "object"}, "TagResponse": {"description": "Response model for a single tag.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "#6B7280", "title": "Color"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name"], "title": "TagResponse", "type": "object"}, "TagSyncResultItem": {"description": "Result item from sync operation.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Color"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}}, "required": ["id", "name", "color"], "title": "TagSyncResultItem", "type": "object"}, "TagWithCountResponse": {"description": "Tag with usage count for listings.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "#6B7280", "title": "Color"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "name": {"title": "Name", "type": "string"}, "test_count": {"title": "Test Count", "type": "integer"}}, "required": ["id", "name", "test_count"], "title": "TagWithCountResponse", "type": "object"}, "TaskID": {"properties": {"app_link": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Link"}, "backend_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Backend Url"}, "build_version_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Override the build to use for this test execution. If provided, this will override the build attached to the test.", "title": "Build Version Id"}, "device_local": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Device Local"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Override the target device model for this execution", "title": "Device Model"}, "get_downloads": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Get Downloads"}, "launch_arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Inline iOS app arguments in exact token order", "title": "Launch Arguments"}, "launch_env_var_ids": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Org launch variable IDs selected for this execution. For mobile test runs, these are merged with the test's attached launch vars.", "title": "Launch Env Var Ids"}, "launch_env_vars": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "description": "Inline launch environment variables (KEY=VALUE) applied to the app's launch environment for this execution. Merged over org launch variables attached to the test; inline values take precedence.", "title": "Launch Env Vars"}, "llm_model_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Simple way to set the primary LLM model (automatically configures run_config.llm_config.primary_model)", "title": "Llm Model Name"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Override the target OS/runtime version for this execution", "title": "Os Version"}, "retries": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 1, "title": "Retries"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}], "description": "Complete configuration for the test run (overrides flattened fields if provided)"}, "session_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Client-generated device-session ID reused when retrying this exact test start", "title": "Session Id"}, "source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "api", "description": "Execution source: ui, cli, api, ci_cd, or workflow. Defaults to 'api' for direct API calls.", "title": "Source"}, "test_entrypoint": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Entrypoint"}, "test_id": {"format": "uuid", "title": "Test Id", "type": "string"}, "variable_overrides": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "description": "Runtime variable overrides. These take highest priority over local and global variables.", "title": "Variable Overrides"}}, "required": ["test_id"], "title": "TaskID", "type": "object"}, "TaskMetadata": {"properties": {"agent_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Human-readable instruction describing what the agent did, e.g. 'Click the Sign In button'", "title": "Agent Description"}, "download": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Download"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Id"}, "metadata": {"anyOf": [{"$ref": "#/components/schemas/DOMMetadata"}, {"type": "null"}]}, "step": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Deprecated: Use step_description instead", "title": "Step"}, "step_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}], "description": "Step-level configuration that overrides test-level config"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Human-readable description of the step", "title": "Step Description"}, "step_type": {"title": "Step Type", "type": "string"}}, "required": ["step_type"], "title": "TaskMetadata", "type": "object"}, "Test": {"additionalProperties": true, "properties": {"app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "App Id"}, "app_link": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Link"}, "app_package": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Package"}, "backend_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Backend Url"}, "device_local": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Device Local"}, "expected_version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Expected version for optimistic locking. If provided and doesn't match current version, update will fail with 409 Conflict.", "title": "Expected Version"}, "flowdescription": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "title": "Flowdescription"}, "get_downloads": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Get Downloads"}, "id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Id"}, "last_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Duration of the most recent execution in seconds", "title": "Last Duration"}, "last_execution_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Execution ID of the most recent execution for deep-linking to report (was last_task_id)", "title": "Last Execution Id"}, "last_execution_time": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ISO timestamp of the most recent execution completion", "title": "Last Execution Time"}, "last_modified_by": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "UUID of the user who last modified this test.", "title": "Last Modified By"}, "last_status": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Status of the most recent execution (success, failure, timeout, cancelled, running, queued, setup, verifying, or None)", "title": "Last Status"}, "link": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "title": "Link"}, "llm_model_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Llm Model Name"}, "mobile_targets": {"anyOf": [{"items": {"$ref": "#/components/schemas/MobileTarget"}, "type": "array"}, {"type": "null"}], "description": "Saved device model + runtime targets for this test", "title": "Mobile Targets"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "orientation": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Device orientation from test_mobile_details ('portrait' or 'landscape')", "title": "Orientation"}, "owner": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Owner"}, "package_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Package Name"}, "pinned_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Pinned Version"}, "platform": {"default": "Android", "title": "Platform", "type": "string"}, "resolved_build": {"anyOf": [{"$ref": "#/components/schemas/ResolvedBuild"}, {"type": "null"}]}, "retries": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 1, "title": "Retries"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}]}, "run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Run Id"}, "tags": {"anyOf": [{"items": {"$ref": "#/components/schemas/Tag"}, "type": "array"}, {"type": "null"}], "description": "Tags associated with this test for categorization and filtering", "title": "Tags"}, "tasks": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "type": "array"}, {"items": {"additionalProperties": true, "type": "object"}, "type": "array"}, {"items": {"$ref": "#/components/schemas/TaskMetadata"}, "type": "array"}], "default": [], "title": "Tasks"}, "test_timeout_seconds": {"anyOf": [{"minimum": 0.0, "type": "integer"}, {"type": "null"}], "description": "Per-test execution timeout in seconds. Null disables the override.", "title": "Test Timeout Seconds"}, "user_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "User Id"}, "version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Current version number for optimistic locking. Increments on each save.", "title": "Version"}, "viewport": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Viewport"}}, "title": "Test", "type": "object"}, "TestCreationResponse": {"description": "Response model for test creation", "properties": {"blocks_count": {"description": "Number of blocks created", "title": "Blocks Count", "type": "integer"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "Creation timestamp", "title": "Created At"}, "errors": {"description": "Any errors that occurred", "items": {"type": "string"}, "title": "Errors", "type": "array"}, "generated_ids": {"description": "List of generated block IDs", "items": {"type": "string"}, "title": "Generated Ids", "type": "array"}, "success": {"description": "Whether the operation was successful", "title": "Success", "type": "boolean"}, "test_id": {"description": "Generated test ID", "title": "Test Id", "type": "string"}}, "required": ["success", "test_id", "blocks_count", "generated_ids"], "title": "TestCreationResponse", "type": "object"}, "TestDeleteResponse": {"description": "Response model for test deletion.", "properties": {"id": {"description": "ID of the deleted test", "title": "Id", "type": "string"}, "message": {"description": "Success message", "title": "Message", "type": "string"}}, "required": ["message", "id"], "title": "TestDeleteResponse", "type": "object"}, "TestEnhancedHistoryItem": {"description": "Enhanced history item with task tracking details", "properties": {"cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration"}, "enhanced_task": {"$ref": "#/components/schemas/TestExecutionTasksEnhanced"}, "execution_time": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Execution Time"}, "has_report": {"default": false, "title": "Has Report", "type": "boolean"}, "id": {"format": "uuid", "title": "Id", "type": "string"}, "status": {"title": "Status", "type": "string"}, "test_uid": {"format": "uuid", "title": "Test Uid", "type": "string"}}, "required": ["id", "test_uid", "status", "enhanced_task"], "title": "TestEnhancedHistoryItem", "type": "object"}, "TestEnhancedHistoryResponse": {"description": "Response for test enhanced history endpoint", "properties": {"found_count": {"title": "Found Count", "type": "integer"}, "items": {"items": {"$ref": "#/components/schemas/TestEnhancedHistoryItem"}, "title": "Items", "type": "array"}, "requested_count": {"title": "Requested Count", "type": "integer"}, "total_count": {"title": "Total Count", "type": "integer"}}, "required": ["items", "total_count", "requested_count", "found_count"], "title": "TestEnhancedHistoryResponse", "type": "object"}, "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).", "properties": {"completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "current_step": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Step"}, "current_step_index": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 0, "title": "Current Step Index"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "execution_time_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Execution Time Seconds"}, "id": {"description": "Execution ID (primary key)", "format": "uuid", "title": "Id", "type": "string"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "progress": {"default": 0.0, "title": "Progress", "type": "number"}, "report_metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Report Metadata"}, "resolved_build_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Resolved Build Id"}, "session_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Session Id"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "steps_completed": {"default": 0, "title": "Steps Completed", "type": "integer"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "test_id": {"format": "uuid", "title": "Test Id", "type": "string"}, "total_steps": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Total Steps"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "updated_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Updated At"}, "was_quarantined": {"default": false, "title": "Was Quarantined", "type": "boolean"}, "workflow_execution_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}}, "required": ["id", "test_id"], "title": "TestExecutionTasksEnhanced", "type": "object"}, "TestInfo": {"properties": {"id": {"title": "Id", "type": "string"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}}, "required": ["id"], "title": "TestInfo", "type": "object"}, "TestListResponse": {"description": "Response model for listing tests.", "properties": {"apps": {"description": "List of apps for the organization", "items": {"$ref": "#/components/schemas/AppResponse"}, "title": "Apps", "type": "array"}, "count": {"description": "Number of tests in this page", "title": "Count", "type": "integer"}, "failing_tests_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in failing tests as % of total (positive = increase)", "title": "Failing Tests Wow"}, "has_more": {"default": false, "description": "Whether more tests exist beyond this page", "title": "Has More", "type": "boolean"}, "limit": {"default": 150, "description": "Limit used for this page", "title": "Limit", "type": "integer"}, "not_run_tests_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in not run tests as % of total (positive = increase)", "title": "Not Run Tests Wow"}, "offset": {"default": 0, "description": "Offset used for this page", "title": "Offset", "type": "integer"}, "passing_tests_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in passing tests as % of total (positive = increase)", "title": "Passing Tests Wow"}, "status_counts": {"anyOf": [{"$ref": "#/components/schemas/TestStatusCounts"}, {"type": "null"}], "description": "Org-wide test counts by status"}, "tests": {"description": "List of tests", "items": {"$ref": "#/components/schemas/TestResourceResponse"}, "title": "Tests", "type": "array"}, "total_count": {"default": 0, "description": "Total number of tests across all pages", "title": "Total Count", "type": "integer"}, "total_tests_wow": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Week-over-week percentage change in total tests (positive = increase)", "title": "Total Tests Wow"}}, "required": ["tests", "count"], "title": "TestListResponse", "type": "object"}, "TestResourceResponse": {"additionalProperties": true, "description": "Authenticated product read projection for one test resource.", "properties": {"app_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "App Id"}, "app_link": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Link"}, "app_package": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Package"}, "backend_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Backend Url"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "device_local": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Device Local"}, "expected_version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Expected version for optimistic locking. If provided and doesn't match current version, update will fail with 409 Conflict.", "title": "Expected Version"}, "flowdescription": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "title": "Flowdescription"}, "get_downloads": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Get Downloads"}, "id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Id"}, "last_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Duration of the most recent execution in seconds", "title": "Last Duration"}, "last_execution_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Execution ID of the most recent execution for deep-linking to report (was last_task_id)", "title": "Last Execution Id"}, "last_execution_time": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ISO timestamp of the most recent execution completion", "title": "Last Execution Time"}, "last_modified_by": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "UUID of the user who last modified this test.", "title": "Last Modified By"}, "last_status": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Status of the most recent execution (success, failure, timeout, cancelled, running, queued, setup, verifying, or None)", "title": "Last Status"}, "link": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "", "title": "Link"}, "llm_model_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Llm Model Name"}, "mobile_targets": {"anyOf": [{"items": {"$ref": "#/components/schemas/MobileTarget"}, "type": "array"}, {"type": "null"}], "description": "Saved device model + runtime targets for this test", "title": "Mobile Targets"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "orientation": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Device orientation from test_mobile_details ('portrait' or 'landscape')", "title": "Orientation"}, "owner": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Owner"}, "package_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Package Name"}, "pinned_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Pinned Version"}, "platform": {"default": "Android", "title": "Platform", "type": "string"}, "resolved_build": {"anyOf": [{"$ref": "#/components/schemas/ResolvedBuild"}, {"type": "null"}]}, "retries": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": 1, "title": "Retries"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}]}, "run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Run Id"}, "tags": {"anyOf": [{"items": {"$ref": "#/components/schemas/Tag"}, "type": "array"}, {"type": "null"}], "description": "Tags associated with this test for categorization and filtering", "title": "Tags"}, "tasks": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "type": "array"}, {"items": {"additionalProperties": true, "type": "object"}, "type": "array"}, {"items": {"$ref": "#/components/schemas/TaskMetadata"}, "type": "array"}], "default": [], "title": "Tasks"}, "test_timeout_seconds": {"anyOf": [{"minimum": 0.0, "type": "integer"}, {"type": "null"}], "description": "Per-test execution timeout in seconds. Null disables the override.", "title": "Test Timeout Seconds"}, "user_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "User Id"}, "version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Current version number for optimistic locking. Increments on each save.", "title": "Version"}, "viewport": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Viewport"}}, "title": "TestResourceResponse", "type": "object"}, "TestRestoreVersionRequest": {"description": "Request model for restoring a test to a previous version.", "properties": {"version": {"description": "Version number to restore to", "title": "Version", "type": "integer"}}, "required": ["version"], "title": "TestRestoreVersionRequest", "type": "object"}, "TestRestoreVersionResponse": {"description": "Response model for restoring a test version.", "properties": {"message": {"description": "Success message", "title": "Message", "type": "string"}, "new_version": {"description": "The new version number after restore", "title": "New Version", "type": "integer"}, "restored_from": {"description": "The version that was restored", "title": "Restored From", "type": "integer"}}, "required": ["message", "new_version", "restored_from"], "title": "TestRestoreVersionResponse", "type": "object"}, "TestRunConfig": {"description": "Complete configuration for a test run.", "properties": {"cache_retry_mode": {"$ref": "#/components/schemas/CacheRetryMode", "default": "full_rerun", "description": "Cache retry policy"}, "disable_grid": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "Admin-only: Disable grid preprocessing for grounding", "title": "Disable Grid"}, "disable_video_validation": {"default": false, "description": "When true, skip the background video validation check on VALIDATION steps; the screenshot verdict alone decides validation outcomes.", "title": "Disable Video Validation", "type": "boolean"}, "execution_mode": {"$ref": "#/components/schemas/ExecutionModeConfig", "default": {"enable_planning": false, "enable_reflection": true, "grounder_type": "moondream3", "network_capture": true, "reflection_retries": 1, "retries": 1, "skip_app_install": false}, "description": "Execution mode configuration"}, "fail_fast": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "description": "When true, the test halts immediately on the first failed validation or non-zero script exit code instead of continuing through remaining steps. Unset inherits the test-level value under a workflow override and otherwise behaves as false.", "title": "Fail Fast"}, "fallback_trigger": {"$ref": "#/components/schemas/FallbackTrigger", "default": "final_fail", "description": "When to trigger cache fallback"}, "llm_config": {"$ref": "#/components/schemas/LLMConfig", "default": {"planning_model": "gemini/gemini-3.7-flash", "primary_model": "gemini/gemini-3.7-flash", "reflection_model": "gemini/gemini-3.7-flash"}, "description": "LLM model configuration"}, "run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Run Id"}}, "title": "TestRunConfig", "type": "object"}, "TestStatusCounts": {"description": "Server-side test counts by status, computed across all tests (not just the current page).", "properties": {"failing": {"description": "Tests with last_status in ('failure', 'failed', 'timeout', 'cancelled')", "title": "Failing", "type": "integer"}, "not_run": {"description": "Tests with no status or 'verifying'", "title": "Not Run", "type": "integer"}, "passing": {"description": "Tests with last_status = 'success'", "title": "Passing", "type": "integer"}, "running": {"description": "Tests with last_status in ('running', 'queued', 'setup')", "title": "Running", "type": "integer"}, "total": {"description": "Total number of tests in the org", "title": "Total", "type": "integer"}}, "required": ["total", "passing", "failing", "not_run", "running"], "title": "TestStatusCounts", "type": "object"}, "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.).", "properties": {"completed_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Completed At"}, "current_step": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Current Step"}, "current_step_index": {"default": 0, "title": "Current Step Index", "type": "integer"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "execution_errors": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Execution Errors"}, "execution_time_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Execution Time Seconds"}, "id": {"description": "Execution ID (was task_id)", "format": "uuid", "title": "Id", "type": "string"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Metadata"}, "progress": {"default": 0.0, "title": "Progress", "type": "number"}, "started_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"$ref": "#/components/schemas/SessionStatus"}, "steps_completed": {"default": 0, "title": "Steps Completed", "type": "integer"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "test_history_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Test History Id"}, "test_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Test Id"}, "total_steps": {"default": 1, "title": "Total Steps", "type": "integer"}, "validation_failures": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "title": "Validation Failures"}, "workflow_run_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["id", "status"], "title": "TestStatusResponse", "type": "object"}, "TestVersionInfo": {"description": "Information about a specific test version.", "properties": {"created_at": {"description": "When this version was created", "format": "date-time", "title": "Created At", "type": "string"}, "id": {"description": "Version record ID", "format": "uuid", "title": "Id", "type": "string"}, "modified_by": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "User ID who created this version", "title": "Modified By"}, "modified_by_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Email of user who created this version", "title": "Modified By Email"}, "tasks": {"description": "Tasks at this version", "title": "Tasks"}, "test_id": {"description": "Test ID this version belongs to", "format": "uuid", "title": "Test Id", "type": "string"}, "version": {"description": "Version number", "title": "Version", "type": "integer"}}, "required": ["id", "test_id", "version", "tasks", "created_at"], "title": "TestVersionInfo", "type": "object"}, "TestVersionListResponse": {"description": "Response model for listing test versions.", "properties": {"total": {"description": "Total number of versions", "title": "Total", "type": "integer"}, "versions": {"description": "List of versions", "items": {"$ref": "#/components/schemas/TestVersionInfo"}, "title": "Versions", "type": "array"}}, "required": ["versions", "total"], "title": "TestVersionListResponse", "type": "object"}, "UnifiedWorkflowReportRequest": {"properties": {"include_video_metadata": {"default": false, "title": "Include Video Metadata", "type": "boolean"}, "token": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Token"}, "workflow_task_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Task Id"}}, "title": "UnifiedWorkflowReportRequest", "type": "object"}, "UnifiedWorkflowReportResponse": {"properties": {"child_share_status": {"additionalProperties": {"additionalProperties": true, "type": "object"}, "default": {}, "title": "Child Share Status", "type": "object"}, "child_tasks": {"default": [], "items": {"$ref": "#/components/schemas/ChildTaskReportInfo"}, "title": "Child Tasks", "type": "array"}, "is_public_view": {"default": false, "title": "Is Public View", "type": "boolean"}, "test_info": {"default": [], "items": {"$ref": "#/components/schemas/TestInfo"}, "title": "Test Info", "type": "array"}, "video_metadata": {"anyOf": [{"additionalProperties": {"$ref": "#/components/schemas/VideoMetadataInfo"}, "type": "object"}, {"type": "null"}], "title": "Video Metadata"}, "workflow_detail": {"anyOf": [{"$ref": "#/components/schemas/WorkflowDetailInfo"}, {"type": "null"}]}, "workflow_task": {"$ref": "#/components/schemas/WorkflowTaskInfo"}}, "required": ["workflow_task"], "title": "UnifiedWorkflowReportResponse", "type": "object"}, "UpdateDeviceTargetRequest": {"properties": {"device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "orientation": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Orientation"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}}, "title": "UpdateDeviceTargetRequest", "type": "object"}, "UpdateDeviceTargetResponse": {"properties": {"device_model": {"title": "Device Model", "type": "string"}, "os_version": {"title": "Os Version", "type": "string"}}, "required": ["device_model", "os_version"], "title": "UpdateDeviceTargetResponse", "type": "object"}, "UpdateFailurePolicyRequest": {"properties": {"failure_policy": {"title": "Failure Policy", "type": "string"}}, "required": ["failure_policy"], "title": "UpdateFailurePolicyRequest", "type": "object"}, "UpdateModuleRequest": {"description": "Request model for updating an existing module", "properties": {"blocks": {"anyOf": [{"items": {"$ref": "#/components/schemas/ModuleBlock"}, "type": "array"}, {"type": "null"}], "description": "New blocks array", "title": "Blocks"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "New description", "title": "Description"}, "expected_version": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Expected version for optimistic locking", "title": "Expected Version"}, "name": {"anyOf": [{"minLength": 1, "type": "string"}, {"type": "null"}], "description": "New name", "title": "Name"}}, "title": "UpdateModuleRequest", "type": "object"}, "UpdateTagRequest": {"description": "Request to update a tag.", "properties": {"color": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Color"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}}, "title": "UpdateTagRequest", "type": "object"}, "UpdateVariableModel": {"description": "Partial-merge update for a local variable (rename / value / secret).\n\nMirrors GlobalVariableUpdate: only fields that are set are applied.\nvariable_value is treated as \"provided\" when not None, so the frontend\nomits it to keep an existing secret's value unchanged.", "properties": {"is_secret": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Is Secret"}, "test_uid": {"format": "uuid", "title": "Test Uid", "type": "string"}, "variable_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Name"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Value"}}, "required": ["test_uid"], "title": "UpdateVariableModel", "type": "object"}, "UpdateVariableValueModel": {"properties": {"variable_id": {"format": "uuid", "title": "Variable Id", "type": "string"}, "variable_value": {"title": "Variable Value", "type": "string"}}, "required": ["variable_id", "variable_value"], "title": "UpdateVariableValueModel", "type": "object"}, "UpdateWorkflowBuildConfigRequest": {"properties": {"build_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Build Config"}, "override_build_config": {"title": "Override Build Config", "type": "boolean"}}, "required": ["build_config", "override_build_config"], "title": "UpdateWorkflowBuildConfigRequest", "type": "object"}, "UpdateWorkflowLocationConfigRequest": {"properties": {"location_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Location Config"}, "override_location": {"title": "Override Location", "type": "boolean"}}, "required": ["location_config", "override_location"], "title": "UpdateWorkflowLocationConfigRequest", "type": "object"}, "UpdateWorkflowNameRequest": {"properties": {"name": {"title": "Name", "type": "string"}}, "required": ["name"], "title": "UpdateWorkflowNameRequest", "type": "object"}, "UpdateWorkflowRunConfigRequest": {"properties": {"override_run_config": {"title": "Override Run Config", "type": "boolean"}, "run_config": {"additionalProperties": true, "title": "Run Config", "type": "object"}}, "required": ["run_config", "override_run_config"], "title": "UpdateWorkflowRunConfigRequest", "type": "object"}, "ValidationError": {"properties": {"ctx": {"title": "Context", "type": "object"}, "input": {"title": "Input"}, "loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "title": "Location", "type": "array"}, "msg": {"title": "Message", "type": "string"}, "type": {"title": "Error Type", "type": "string"}}, "required": ["loc", "msg", "type"], "title": "ValidationError", "type": "object"}, "VariableModel": {"properties": {"is_secret": {"default": false, "title": "Is Secret", "type": "boolean"}, "test_uid": {"format": "uuid", "title": "Test Uid", "type": "string"}, "variable_name": {"title": "Variable Name", "type": "string"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Value"}}, "required": ["test_uid", "variable_name"], "title": "VariableModel", "type": "object"}, "VariableResponse": {"description": "Response model for single variable operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"$ref": "#/components/schemas/VariableRow", "description": "Variable record"}}, "required": ["message", "result"], "title": "VariableResponse", "type": "object"}, "VariableRow": {"properties": {"has_secret_value": {"default": false, "description": "Whether an encrypted value is stored for this variable", "title": "Has Secret Value", "type": "boolean"}, "id": {"description": "Unique identifier of the variable", "format": "uuid", "title": "Id", "type": "string"}, "is_secret": {"default": false, "description": "Whether the value is encrypted and masked", "title": "Is Secret", "type": "boolean"}, "test_uid": {"description": "Test UID associated with variable", "format": "uuid", "title": "Test Uid", "type": "string"}, "variable_name": {"description": "Name of the variable", "title": "Variable Name", "type": "string"}, "variable_value": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Value of the variable", "title": "Variable Value"}}, "required": ["id", "test_uid", "variable_name"], "title": "VariableRow", "type": "object"}, "VariablesResponse": {"description": "Response model for variable list operations.", "properties": {"message": {"description": "Response message", "title": "Message", "type": "string"}, "result": {"description": "List of variable records", "items": {"$ref": "#/components/schemas/VariableRow"}, "title": "Result", "type": "array"}}, "required": ["message", "result"], "title": "VariablesResponse", "type": "object"}, "VideoMetadataInfo": {"properties": {"duration": {"title": "Duration", "type": "number"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "steps": {"default": [], "items": {"$ref": "#/components/schemas/app__routes__workflow_routes__workflow_share_xpt__StepMetadata"}, "title": "Steps", "type": "array"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "task_id": {"title": "Task Id", "type": "string"}, "test_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Name"}, "video_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Video Duration"}, "video_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Video Url"}}, "required": ["task_id", "duration"], "title": "VideoMetadataInfo", "type": "object"}, "Viewport": {"description": "Model for viewport dimensions used in browser sessions.", "properties": {"height": {"default": 768, "title": "Height", "type": "integer"}, "width": {"default": 1024, "title": "Width", "type": "integer"}}, "title": "Viewport", "type": "object"}, "WhileBlock": {"description": "Block for loop logic.", "properties": {"children": {"description": "Blocks to execute in the loop", "items": {"anyOf": [{"$ref": "#/components/schemas/ActionBlock"}, {"$ref": "#/components/schemas/IfBlock"}, {"$ref": "#/components/schemas/WhileBlock"}]}, "title": "Children", "type": "array"}, "condition": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Condition to evaluate for loop continuation (alternative to 'step_description')", "title": "Condition"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Unique identifier for the block (auto-generated if not provided)", "title": "Id"}, "step_description": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Condition to evaluate for loop continuation (alternative to 'condition')", "title": "Step Description"}, "type": {"const": "while", "title": "Type", "type": "string"}}, "required": ["type"], "title": "WhileBlock", "type": "object"}, "WorkerConnectionResponse": {"description": "Worker connection information.", "properties": {"device_height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Device Height"}, "device_width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Device Width"}, "ice_servers": {"anyOf": [{"items": {"additionalProperties": true, "type": "object"}, "type": "array"}, {"type": "null"}], "title": "Ice Servers"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Message"}, "signal_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Signal Url"}, "status": {"enum": ["ready", "not_ready", "cancelled", "stopped", "failed"], "title": "Status", "type": "string"}, "whep_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Whep Url"}, "worker_ws_url": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Worker Ws Url"}, "workflow_run_id": {"title": "Workflow Run Id", "type": "string"}}, "required": ["status", "workflow_run_id"], "title": "WorkerConnectionResponse", "type": "object"}, "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.", "properties": {"android_build": {"anyOf": [{"$ref": "#/components/schemas/PlatformApp"}, {"type": "null"}], "description": "Android app override"}, "ios_build": {"anyOf": [{"$ref": "#/components/schemas/PlatformApp"}, {"type": "null"}], "description": "iOS app override"}}, "title": "WorkflowAppConfig", "type": "object"}, "WorkflowCancelResponse": {"description": "Response model for workflow cancellation.", "properties": {"message": {"title": "Message", "type": "string"}, "success": {"title": "Success", "type": "boolean"}, "task_id": {"title": "Task Id", "type": "string"}}, "required": ["message", "success", "task_id"], "title": "WorkflowCancelResponse", "type": "object"}, "WorkflowData": {"properties": {"name": {"title": "Name", "type": "string"}, "org_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "owner": {"title": "Owner", "type": "string"}, "schedule": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": "No Schedule", "title": "Schedule"}, "tests": {"items": {"format": "uuid", "type": "string"}, "title": "Tests", "type": "array"}}, "required": ["name", "tests", "owner"], "title": "WorkflowData", "type": "object"}, "WorkflowDetailInfo": {"properties": {"created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "id": {"title": "Id", "type": "string"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Name"}, "override_run_config": {"default": false, "title": "Override Run Config", "type": "boolean"}, "run_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Run Config"}, "schedule": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Schedule"}, "schedule_enabled": {"default": false, "title": "Schedule Enabled", "type": "boolean"}, "schedule_timezone": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Schedule Timezone"}, "tests": {"default": [], "items": {"type": "string"}, "title": "Tests", "type": "array"}, "updated_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Updated At"}}, "required": ["id"], "title": "WorkflowDetailInfo", "type": "object"}, "WorkflowExecutionHistoryResponse": {"description": "Response model for workflow execution history.", "properties": {"average_duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Average Duration"}, "executions": {"items": {"$ref": "#/components/schemas/WorkflowStatusResponse"}, "title": "Executions", "type": "array"}, "success_rate": {"title": "Success Rate", "type": "number"}, "total_count": {"title": "Total Count", "type": "integer"}, "workflow_id": {"format": "uuid", "title": "Workflow Id", "type": "string"}}, "required": ["workflow_id", "executions", "total_count", "success_rate"], "title": "WorkflowExecutionHistoryResponse", "type": "object"}, "WorkflowExecutionHistoryStatus": {"description": "Simplified execution history status for workflow cards.", "properties": {"cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Execution timestamp", "title": "Created At"}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Execution duration in seconds", "title": "Duration"}, "status": {"description": "Execution status (success/failure/unknown)", "title": "Status", "type": "string"}}, "required": ["status"], "title": "WorkflowExecutionHistoryStatus", "type": "object"}, "WorkflowLastExecution": {"description": "Model for workflow last execution data.", "properties": {"cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "description": "Duration of the last execution in seconds", "title": "Duration"}, "failed_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Number of tests that failed in the last execution", "title": "Failed Count"}, "id": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Execution ID of the last execution (was task_id)", "title": "Id"}, "last_run": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "ISO timestamp of the last execution", "title": "Last Run"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "When the execution started", "title": "Started At"}, "status": {"description": "Status of the last execution", "enum": ["success", "failure", "not_run", "running", "timeout", "cancelled"], "title": "Status", "type": "string"}, "total_tests": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Total number of tests in the last execution", "title": "Total Tests"}}, "required": ["status"], "title": "WorkflowLastExecution", "type": "object"}, "WorkflowStatus": {"description": "Workflow execution status.", "enum": ["queued", "setup", "running", "completed", "failed", "cancelled", "timeout"], "title": "WorkflowStatus", "type": "string"}, "WorkflowStatusResponse": {"description": "Response model for workflow status polling that matches frontend expectations.", "properties": {"completed_tests": {"title": "Completed Tests", "type": "integer"}, "duration": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Duration"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "estimated_completion": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Estimated Completion"}, "execution_id": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Execution Id"}, "failed_tests": {"default": 0, "title": "Failed Tests", "type": "integer"}, "metadata": {"additionalProperties": true, "default": {}, "title": "Metadata", "type": "object"}, "passed_tests": {"default": 0, "title": "Passed Tests", "type": "integer"}, "progress": {"title": "Progress", "type": "number"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"$ref": "#/components/schemas/WorkflowStatus"}, "total_tests": {"title": "Total Tests", "type": "integer"}, "workflow_id": {"format": "uuid", "title": "Workflow Id", "type": "string"}}, "required": ["workflow_id", "status", "progress", "completed_tests", "total_tests"], "title": "WorkflowStatusResponse", "type": "object"}, "WorkflowTaskInfo": {"properties": {"completed_tests": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Completed Tests"}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "duration": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}, "success": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Success"}, "task_id": {"title": "Task Id", "type": "string"}, "task_ids": {"default": [], "items": {"type": "string"}, "title": "Task Ids", "type": "array"}, "total_tests": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Total Tests"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "triggered_by": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Triggered By"}, "updated_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Updated At"}, "workflow_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Id"}}, "required": ["task_id"], "title": "WorkflowTaskInfo", "type": "object"}, "WorkflowUpdateResponse": {"properties": {"data": {"additionalProperties": true, "title": "Data", "type": "object"}, "message": {"title": "Message", "type": "string"}}, "required": ["message", "data"], "title": "WorkflowUpdateResponse", "type": "object"}, "WorkflowWithLastStatus": {"description": "Workflow model with last execution status for workflow cards.", "properties": {"build_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Workflow-level build configuration (JSONB with ios_build and android_build)", "title": "Build Config"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "deleted": {"title": "Deleted", "type": "boolean"}, "execution_history": {"description": "Last N execution statuses", "items": {"$ref": "#/components/schemas/WorkflowExecutionHistoryStatus"}, "title": "Execution History", "type": "array"}, "id": {"format": "uuid4", "title": "Id", "type": "string"}, "last_execution": {"$ref": "#/components/schemas/WorkflowLastExecution", "description": "Last execution status and metadata"}, "last_run": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Last Run"}, "location_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Workflow-level location configuration (JSONB with latitude, longitude)", "title": "Location Config"}, "name": {"title": "Name", "type": "string"}, "org_id": {"anyOf": [{"format": "uuid4", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "override_build_config": {"default": false, "description": "When True, build_config overrides individual test build configurations", "title": "Override Build Config", "type": "boolean"}, "override_location": {"default": false, "description": "When True, location_config overrides individual test locations. Independent of override_run_config.", "title": "Override Location", "type": "boolean"}, "override_run_config": {"title": "Override Run Config", "type": "boolean"}, "owner": {"format": "uuid4", "title": "Owner", "type": "string"}, "quarantined_test_ids": {"description": "Test IDs with failure_policy='ignore_failure'. Failures in these tests do not fail the workflow.", "items": {"type": "string"}, "title": "Quarantined Test Ids", "type": "array"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}], "description": "Workflow-level run configuration that overrides individual test configs"}, "schedule": {"title": "Schedule", "type": "string"}, "schedule_enabled": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Schedule Enabled"}, "schedule_timezone": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Schedule Timezone"}, "test_count": {"description": "Number of tests in this workflow", "title": "Test Count", "type": "integer"}, "test_timeout_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Per-test execution timeout in seconds. Applied to all tests dispatched by this workflow.", "title": "Test Timeout Seconds"}, "tests": {"items": {"type": "string"}, "title": "Tests", "type": "array"}, "updated_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Updated At"}}, "required": ["id", "deleted", "name", "owner", "schedule", "override_run_config", "last_execution", "test_count"], "title": "WorkflowWithLastStatus", "type": "object"}, "WorkflowsBaseSchema": {"description": "Workflows Base Schema.", "properties": {"build_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Workflow-level build configuration (JSONB with ios_build and android_build)", "title": "Build Config"}, "created_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Created At"}, "deleted": {"title": "Deleted", "type": "boolean"}, "id": {"format": "uuid4", "title": "Id", "type": "string"}, "last_run": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Last Run"}, "location_config": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "description": "Workflow-level location configuration (JSONB with latitude, longitude)", "title": "Location Config"}, "name": {"title": "Name", "type": "string"}, "org_id": {"anyOf": [{"format": "uuid4", "type": "string"}, {"type": "null"}], "title": "Org Id"}, "override_build_config": {"default": false, "description": "When True, build_config overrides individual test build configurations", "title": "Override Build Config", "type": "boolean"}, "override_location": {"default": false, "description": "When True, location_config overrides individual test locations. Independent of override_run_config.", "title": "Override Location", "type": "boolean"}, "override_run_config": {"title": "Override Run Config", "type": "boolean"}, "owner": {"format": "uuid4", "title": "Owner", "type": "string"}, "quarantined_test_ids": {"description": "Test IDs with failure_policy='ignore_failure'. Failures in these tests do not fail the workflow.", "items": {"type": "string"}, "title": "Quarantined Test Ids", "type": "array"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}], "description": "Workflow-level run configuration that overrides individual test configs"}, "schedule": {"title": "Schedule", "type": "string"}, "schedule_enabled": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Schedule Enabled"}, "schedule_timezone": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Schedule Timezone"}, "test_timeout_seconds": {"anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Per-test execution timeout in seconds. Applied to all tests dispatched by this workflow.", "title": "Test Timeout Seconds"}, "tests": {"items": {"type": "string"}, "title": "Tests", "type": "array"}, "updated_at": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "title": "Updated At"}}, "required": ["id", "deleted", "name", "owner", "schedule", "override_run_config"], "title": "WorkflowsBaseSchema", "type": "object"}, "app__routes__execution_routes__device_sessions_xpt__SessionHistoryItem": {"description": "Single row in the device session history listing.", "properties": {"app_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}, "app_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Name"}, "build_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}, "build_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Version"}, "cloud_agent_conversation": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationAttributionSummary"}, {"type": "null"}]}, "cloud_agent_conversation_match_type": {"anyOf": [{"$ref": "#/components/schemas/CloudAgentConversationRelatedResourceMatchType"}, {"type": "null"}]}, "created_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Created At"}, "device_model": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Device Model"}, "duration_seconds": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Duration Seconds"}, "ended_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Ended At"}, "error_message": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Error Message"}, "has_video": {"default": false, "title": "Has Video", "type": "boolean"}, "id": {"title": "Id", "type": "string"}, "org_id": {"title": "Org Id", "type": "string"}, "os_version": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Os Version"}, "platform": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}, "report_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}, "source": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source"}, "source_metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "title": "Source Metadata"}, "started_at": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Started At"}, "status": {"title": "Status", "type": "string"}, "step_count": {"default": 0, "title": "Step Count", "type": "integer"}, "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"}, "trace_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Trace Id"}, "user_email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Email"}, "workflow_execution_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}, "workflow_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Name"}, "workflow_run_id": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Run Id"}}, "required": ["id", "org_id", "status"], "title": "SessionHistoryItem", "type": "object"}, "app__routes__execution_routes__device_sessions_xpt__SessionHistoryResponse": {"description": "Paginated device session history response.", "properties": {"limit": {"title": "Limit", "type": "integer"}, "offset": {"title": "Offset", "type": "integer"}, "org_id": {"title": "Org Id", "type": "string"}, "sessions": {"items": {"$ref": "#/components/schemas/app__routes__execution_routes__device_sessions_xpt__SessionHistoryItem"}, "title": "Sessions", "type": "array"}, "total": {"title": "Total", "type": "integer"}}, "required": ["sessions", "org_id", "total", "limit", "offset"], "title": "SessionHistoryResponse", "type": "object"}, "app__routes__workflow_routes__workflow_share_xpt__StepMetadata": {"properties": {"action_type": {"title": "Action Type", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Description"}, "end_time": {"title": "End Time", "type": "number"}, "index": {"title": "Index", "type": "integer"}, "start_time": {"title": "Start Time", "type": "number"}}, "required": ["index", "action_type", "start_time", "end_time"], "title": "StepMetadata", "type": "object"}, "cognisim_schemas__schemas__device_schema__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.\n variable_overrides: Runtime variable overrides applied to every child test.\n launch_env_var_ids: Stored organization launch variables applied to every child test.\n launch_env_vars: Inline launch variables applied to every child test.", "properties": {"build_config": {"anyOf": [{"$ref": "#/components/schemas/WorkflowAppConfig"}, {"type": "null"}], "description": "Build configuration override for this workflow execution"}, "launch_arguments": {"anyOf": [{"items": {"minLength": 1, "pattern": "^[^\\x00]+$", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Inline iOS app arguments in exact token order. Stored argument sets are applied first; these tokens are appended afterward.", "title": "Launch Arguments"}, "launch_env_var_ids": {"anyOf": [{"items": {"format": "uuid", "type": "string"}, "type": "array"}, {"type": "null"}], "description": "Org launch variable IDs selected for this workflow execution. They are merged over each child test's attached launch variables.", "title": "Launch Env Var Ids"}, "launch_env_vars": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "description": "Inline launch environment variables applied to every child test. Inline values override attached and run-selected org launch variables.", "title": "Launch Env Vars"}, "override_build_config": {"default": false, "description": "When True, build_config overrides individual test build configurations", "title": "Override Build Config", "type": "boolean"}, "run_config": {"anyOf": [{"$ref": "#/components/schemas/TestRunConfig"}, {"type": "null"}]}, "variable_overrides": {"anyOf": [{"additionalProperties": {"type": "string"}, "type": "object"}, {"type": "null"}], "description": "Runtime variable overrides applied to every child test in this workflow execution", "title": "Variable Overrides"}, "workflow_id": {"format": "uuid", "title": "Workflow Id", "type": "string"}}, "required": ["workflow_id"], "title": "WorkflowInfo", "type": "object"}}, "securitySchemes": {"HTTPBearer": {"scheme": "bearer", "type": "http"}}}, "info": {"description": "Revyl API", "title": "Revyl API", "version": "1.0.0"}, "openapi": "3.1.0", "paths": {"/api/v1/apps/": {"get": {"description": "List apps for the organization with pagination", "operationId": "list_apps_api_v1_apps__get", "parameters": [{"description": "Filter by platform", "in": "query", "name": "platform", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by platform", "title": "Platform"}}, {"description": "Page number (1-indexed)", "in": "query", "name": "page", "required": false, "schema": {"default": 1, "description": "Page number (1-indexed)", "minimum": 1, "title": "Page", "type": "integer"}}, {"description": "Number of items per page (max 500)", "in": "query", "name": "page_size", "required": false, "schema": {"default": 50, "description": "Number of items per page (max 500)", "maximum": 500, "minimum": 1, "title": "Page Size", "type": "integer"}}, {"description": "Search by app name", "in": "query", "name": "search", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search by app name", "title": "Search"}}, {"description": "Show apps directly attributed to this cloud-agent conversation or containing an attributed build/job", "in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Show apps directly attributed to this cloud-agent conversation or containing an attributed build/job", "title": "Attributed To Cloud Agent Conversation Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaginatedAppsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Apps", "tags": ["Apps", "public"]}, "post": {"description": "Create a new app", "operationId": "create_app_api_v1_apps__post", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppCreateRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create App", "tags": ["Apps", "public"]}}, "/api/v1/apps/build-caches": {"get": {"description": "List the org's stored build cache objects with size and last-use time.", "operationId": "list_build_caches_api_v1_apps_build_caches_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildCacheListResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "List Build Caches", "tags": ["Build Caches", "public"]}}, "/api/v1/apps/build-caches/{key}": {"delete": {"description": "Evict a build cache so the next build runs cold and re-uploads fresh.", "operationId": "delete_build_cache_api_v1_apps_build_caches__key__delete", "parameters": [{"in": "path", "name": "key", "required": true, "schema": {"title": "Key", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildCacheDeleteResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Build Cache", "tags": ["Build Caches", "public"]}}, "/api/v1/apps/builds/{version_id}": {"delete": {"description": "Delete a specific build (soft-delete)", "operationId": "delete_build_api_v1_apps_builds__version_id__delete", "parameters": [{"in": "path", "name": "version_id", "required": true, "schema": {"format": "uuid", "title": "Version Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Build", "tags": ["Apps", "public"]}, "get": {"description": "Get a specific build", "operationId": "get_build_api_v1_apps_builds__version_id__get", "parameters": [{"in": "path", "name": "version_id", "required": true, "schema": {"format": "uuid", "title": "Version Id", "type": "string"}}, {"description": "Include presigned download URL", "in": "query", "name": "include_download_url", "required": false, "schema": {"default": false, "description": "Include presigned download URL", "title": "Include Download Url", "type": "boolean"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Build", "tags": ["Apps", "public"]}}, "/api/v1/apps/builds/{version_id}/complete-upload": {"post": {"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", "parameters": [{"in": "path", "name": "version_id", "required": true, "schema": {"format": "uuid", "title": "Version Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildUploadCompleteRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Complete Build Upload", "tags": ["Apps", "public"]}}, "/api/v1/apps/builds/{version_id}/extract-package-id": {"post": {"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", "parameters": [{"in": "path", "name": "version_id", "required": true, "schema": {"format": "uuid", "title": "Version Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExtractBuildPackageIdResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Extract Build Package Id", "tags": ["Apps", "public"]}}, "/api/v1/apps/remote": {"post": {"description": "Enqueue a first-class sandbox-build job behind the stable remote API.", "operationId": "trigger_remote_build_api_v1_apps_remote_post", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildTriggerResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Trigger Remote Build", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/remote/runners/available": {"get": {"description": "Check sandbox-build capacity for the caller's org and platform.", "operationId": "check_build_runners_available_api_v1_apps_remote_runners_available_get", "parameters": [{"in": "query", "name": "platform", "required": false, "schema": {"default": "ios", "enum": ["ios", "android"], "title": "Platform", "type": "string"}}, {"deprecated": true, "description": "Deprecated and ignored. Runner selection is managed by Revyl.", "in": "query", "name": "runner_id", "required": false, "schema": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "deprecated": true, "description": "Deprecated and ignored. Runner selection is managed by Revyl.", "title": "Runner Id"}}, {"description": "Optional sandbox build image key. Defaults to latest.", "in": "query", "name": "image", "required": false, "schema": {"anyOf": [{"pattern": "^[a-zA-Z0-9._\\-]{1,128}$", "type": "string"}, {"type": "null"}], "description": "Optional sandbox build image key. Defaults to latest.", "title": "Image"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildRunnerStatus"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Check Build Runners Available", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/remote/upload-url": {"post": {"description": "Generate a presigned POST for uploading a remote-build source archive.", "operationId": "get_source_upload_url_api_v1_apps_remote_upload_url_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildSourceUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildSourceUploadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Source Upload Url", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/remote/{build_job_id}": {"delete": {"description": "Cancel a queued or running sandbox-backed remote build.", "operationId": "cancel_remote_build_api_v1_apps_remote__build_job_id__delete", "parameters": [{"in": "path", "name": "build_job_id", "required": true, "schema": {"format": "uuid", "title": "Build Job Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Cancel Remote Build", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/remote/{build_job_id}/logs": {"get": {"description": "Fetch structured build logs for a sandbox-backed remote build job.", "operationId": "get_remote_build_logs_api_v1_apps_remote__build_job_id__logs_get", "parameters": [{"in": "path", "name": "build_job_id", "required": true, "schema": {"format": "uuid", "title": "Build Job Id", "type": "string"}}, {"description": "Redis stream cursor. Omit for latest tail; pass 0-0 to read from the beginning.", "in": "query", "name": "after_id", "required": false, "schema": {"anyOf": [{"pattern": "^\\d+-\\d+$", "type": "string"}, {"type": "null"}], "description": "Redis stream cursor. Omit for latest tail; pass 0-0 to read from the beginning.", "title": "After Id"}}, {"description": "Redis stream cursor. Fetch events older than this id.", "in": "query", "name": "before_id", "required": false, "schema": {"anyOf": [{"pattern": "^\\d+-\\d+$", "type": "string"}, {"type": "null"}], "description": "Redis stream cursor. Fetch events older than this id.", "title": "Before Id"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 200, "maximum": 10000, "minimum": 1, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildLogsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Remote Build Logs", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/remote/{build_job_id}/status": {"get": {"description": "Poll the current status of a sandbox-backed remote build job.", "operationId": "get_remote_build_status_api_v1_apps_remote__build_job_id__status_get", "parameters": [{"in": "path", "name": "build_job_id", "required": true, "schema": {"format": "uuid", "title": "Build Job Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoteBuildStatusResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Remote Build Status", "tags": ["Remote Builds", "public"]}}, "/api/v1/apps/{app_id}": {"delete": {"description": "Delete an app and all its builds (soft-delete)", "operationId": "delete_app_api_v1_apps__app_id__delete", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteAppResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete App", "tags": ["Apps", "public"]}, "get": {"description": "Get a specific app", "operationId": "get_app_api_v1_apps__app_id__get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get App", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds": {"get": {"description": "List builds for an app with pagination", "operationId": "list_builds_api_v1_apps__app_id__builds_get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"description": "Include presigned download URLs", "in": "query", "name": "include_download_urls", "required": false, "schema": {"default": false, "description": "Include presigned download URLs", "title": "Include Download Urls", "type": "boolean"}}, {"description": "Include queued, running, failed, and cancelled build jobs in the collection.", "in": "query", "name": "include_jobs", "required": false, "schema": {"default": false, "description": "Include queued, running, failed, and cancelled build jobs in the collection.", "title": "Include Jobs", "type": "boolean"}}, {"description": "Page number (1-indexed)", "in": "query", "name": "page", "required": false, "schema": {"default": 1, "description": "Page number (1-indexed)", "minimum": 1, "title": "Page", "type": "integer"}}, {"description": "Number of items per page (max 100)", "in": "query", "name": "page_size", "required": false, "schema": {"default": 20, "description": "Number of items per page (max 100)", "maximum": 100, "minimum": 1, "title": "Page Size", "type": "integer"}}, {"description": "Search by version name or package name", "in": "query", "name": "search", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Search by version name or package name", "title": "Search"}}, {"description": "Filter the build/job collection by cloud-agent conversation (requires include_jobs=true)", "in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "description": "Filter the build/job collection by cloud-agent conversation (requires include_jobs=true)", "title": "Attributed To Cloud Agent Conversation Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/PaginatedBuildsResponse"}, {"$ref": "#/components/schemas/PaginatedBuildsWithJobsResponse"}], "title": "Response List Builds Api V1 Apps App Id Builds Get"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Builds", "tags": ["Apps", "public"]}, "post": {"description": "Create a build from a completed staging upload.\n\nLocates the artifact staged by the upload session, validates it\nserver-side, copies it to its permanent location, and inserts the build\nrow. Invalid artifacts never produce a build row; their staging objects\nare deleted immediately.", "operationId": "create_build_from_upload_api_v1_apps__app_id__builds_post", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildCreateFromUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Build From Upload", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds/from-url": {"post": {"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", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildFromUrlRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildResponse"}}}, "description": "Successful Response"}, "400": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildArtifactRejectionResponse"}}}, "description": "Bad Request"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Build From Url", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds/multipart-upload/resume": {"post": {"description": "Resume an interrupted multipart upload started by the route above.\n\nS3 is the only durable record of an in-progress upload (no build row\nexists yet), so this asks S3 which parts it already holds and re-presigns\nfresh URLs for every part. The client uploads only the missing parts and\nassembles the object with the returned ETags \u2014 a dropped connection costs\none part, never the whole artifact. The part_size is recomputed from the\nunchanged file_size, so it matches the original start deterministically.", "operationId": "resume_build_multipart_upload_api_v1_apps__app_id__builds_multipart_upload_resume_post", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildMultipartUploadResumeRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildMultipartUploadResumeResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Resume Build Multipart Upload", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds/multipart-upload/start": {"post": {"description": "Start an S3 multipart upload into the staging area.\n\nLike upload-session, no build row is created here: the client uploads\nparts directly to S3, assembles them with the presigned complete URL,\nthen POST /{app_id}/builds validates the staged artifact and inserts the\nbuild row \u2014 identical to the single-PUT staging flow from that point on.\nThe abort URL is a courtesy: the bucket's AbortIncompleteMultipartUpload\nlifecycle rule frees unfinished parts, and assembled-but-never-finalized\nstaging objects are swept when a later session for the same app starts.", "operationId": "start_build_multipart_upload_api_v1_apps__app_id__builds_multipart_upload_start_post", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"description": "Build upload source for backend-owned lifecycle analytics", "in": "query", "name": "source", "required": false, "schema": {"default": "api", "description": "Build upload source for backend-owned lifecycle analytics", "title": "Source", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildMultipartUploadStartRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildMultipartUploadStartResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Start Build Multipart Upload", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds/upload-session": {"post": {"description": "Open a staging upload session for a new build artifact.\n\nReturns a presigned URL targeting the staging area. No build row is\ncreated here \u2014 POST /{app_id}/builds creates the build after the\nuploaded artifact passes validation, so a build row only ever exists\nfor installable builds. Abandoned staging uploads are swept when a\nlater session for the same app starts; there is nothing for clients\nto clean up.", "operationId": "create_build_upload_session_api_v1_apps__app_id__builds_upload_session_post", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"description": "Build upload source for backend-owned lifecycle analytics", "in": "query", "name": "source", "required": false, "schema": {"default": "api", "description": "Build upload source for backend-owned lifecycle analytics", "title": "Source", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildUploadSessionRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildUploadSessionResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Build Upload Session", "tags": ["Apps", "public"]}}, "/api/v1/apps/{app_id}/builds/upload-url": {"post": {"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", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}, {"description": "Version string (must be unique)", "in": "query", "name": "version", "required": true, "schema": {"description": "Version string (must be unique)", "title": "Version", "type": "string"}}, {"description": "Name of the file to upload", "in": "query", "name": "file_name", "required": true, "schema": {"description": "Name of the file to upload", "title": "File Name", "type": "string"}}, {"description": "Build upload source for backend-owned lifecycle analytics", "in": "query", "name": "source", "required": false, "schema": {"default": "api", "description": "Build upload source for backend-owned lifecycle analytics", "title": "Source", "type": "string"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BuildCreateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Build Upload Url", "tags": ["Apps", "public"]}}, "/api/v1/atlas/v2/annotations/feedback": {"get": {"operationId": "list_atlas_annotation_feedback", "parameters": [{"in": "query", "name": "app_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "App Id"}}, {"in": "query", "name": "observation_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Observation Id"}}, {"in": "query", "name": "status", "required": false, "schema": {"default": "open", "enum": ["open", "resolved", "dismissed", "closed", "all"], "title": "Status", "type": "string"}}, {"in": "query", "name": "author_type", "required": false, "schema": {"default": "all", "enum": ["all", "human", "agent"], "title": "Author Type", "type": "string"}}, {"in": "query", "name": "cursor", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 25, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationFeedbackResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Atlas Annotation Feedback", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-attachments/uploads": {"post": {"operationId": "declare_atlas_annotation_attachment_upload", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAttachmentUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAttachmentUploadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Declare Atlas Annotation Attachment Upload", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-attachments/{attachment_id}/complete": {"post": {"operationId": "complete_atlas_annotation_attachment_upload", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "attachment_id", "required": true, "schema": {"title": "Attachment Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAttachment"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Complete Atlas Annotation Attachment Upload", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-comments/{comment_id}": {"delete": {"operationId": "delete_atlas_annotation_comment", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "comment_id", "required": true, "schema": {"title": "Comment Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationComment"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Atlas Annotation Comment", "tags": ["App Atlas"]}, "patch": {"operationId": "edit_atlas_annotation_comment", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "comment_id", "required": true, "schema": {"title": "Comment Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationCommentEditRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationComment"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Edit Atlas Annotation Comment", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}": {"get": {"operationId": "get_atlas_annotation_thread", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "query", "name": "include_variants", "required": false, "schema": {"default": false, "title": "Include Variants", "type": "boolean"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationThreadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas Annotation Thread", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}/anchor": {"patch": {"operationId": "move_atlas_annotation_thread_anchor", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationAnchorMoveRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationThreadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Move Atlas Annotation Thread Anchor", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}/dismiss": {"post": {"operationId": "dismiss_atlas_annotation_thread", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationStatusChangeRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationThreadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Dismiss Atlas Annotation Thread", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}/reopen": {"post": {"operationId": "reopen_atlas_annotation_thread", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationStatusChangeRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationThreadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Reopen Atlas Annotation Thread", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}/replies": {"post": {"operationId": "add_atlas_annotation_reply", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationReplyRequest"}}}, "required": true}, "responses": {"201": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationCommentResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Add Atlas Annotation Reply", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/annotation-threads/{thread_id}/resolve": {"post": {"operationId": "resolve_atlas_annotation_thread", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "thread_id", "required": true, "schema": {"title": "Thread Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationStatusChangeRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationThreadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Resolve Atlas Annotation Thread", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/edge-runs": {"get": {"description": "Lazy, per-edge clip lookup for the edge sidebar.\n\nResolves the observed runs behind a single selected map edge (latest first)\nand presigns the run video for the newest run only, so one request paints\nthe clip. Other runs are presigned on demand via the per-report endpoint.", "operationId": "get_atlas_v2_edge_runs_api_v1_atlas_v2_apps__app_id__edge_runs_get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"description": "Source node entity id", "in": "query", "name": "source", "required": true, "schema": {"description": "Source node entity id", "title": "Source", "type": "string"}}, {"description": "Target node entity id", "in": "query", "name": "target", "required": true, "schema": {"description": "Target node entity id", "title": "Target", "type": "string"}}, {"in": "query", "name": "action_type", "required": true, "schema": {"title": "Action Type", "type": "string"}}, {"in": "query", "name": "action_label", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Action Label"}}, {"in": "query", "name": "build_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}}, {"in": "query", "name": "report_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}}, {"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "workflow_execution_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}}, {"in": "query", "name": "source_kind", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Kind"}}, {"in": "query", "name": "from_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "From Time"}}, {"in": "query", "name": "to_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "To Time"}}, {"in": "query", "name": "surface_scope", "required": false, "schema": {"default": "app", "title": "Surface Scope", "type": "string"}}, {"in": "query", "name": "visibility", "required": false, "schema": {"default": "included", "title": "Visibility", "type": "string"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 5, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasEdgeRunsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Edge Runs", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/entities/{entity_id}/observations": {"get": {"operationId": "get_atlas_v2_entity_observations_api_v1_atlas_v2_apps__app_id__entities__entity_id__observations_get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "entity_id", "required": true, "schema": {"title": "Entity Id", "type": "string"}}, {"in": "query", "name": "build_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}}, {"in": "query", "name": "report_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}}, {"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "source_kind", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Kind"}}, {"in": "query", "name": "from_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "From Time"}}, {"in": "query", "name": "to_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "To Time"}}, {"in": "query", "name": "surface_scope", "required": false, "schema": {"default": "app", "title": "Surface Scope", "type": "string"}}, {"in": "query", "name": "visibility", "required": false, "schema": {"default": "included", "title": "Visibility", "type": "string"}}, {"in": "query", "name": "include_variants", "required": false, "schema": {"default": true, "title": "Include Variants", "type": "boolean"}}, {"in": "query", "name": "include_screenshots", "required": false, "schema": {"default": false, "title": "Include Screenshots", "type": "boolean"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 12, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"additionalProperties": true, "title": "Response Get Atlas V2 Entity Observations Api V1 Atlas V2 Apps App Id Entities Entity Id Observations Get", "type": "object"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Entity Observations", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/graph": {"get": {"operationId": "get_atlas_v2_graph_api_v1_atlas_v2_apps__app_id__graph_get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "query", "name": "build_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}}, {"in": "query", "name": "report_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}}, {"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "workflow_execution_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}}, {"in": "query", "name": "source_kind", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Kind"}}, {"in": "query", "name": "from_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "From Time"}}, {"in": "query", "name": "to_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "To Time"}}, {"in": "query", "name": "surface_scope", "required": false, "schema": {"default": "app", "title": "Surface Scope", "type": "string"}}, {"in": "query", "name": "visibility", "required": false, "schema": {"default": "included", "title": "Visibility", "type": "string"}}, {"in": "query", "name": "include_variants", "required": false, "schema": {"default": false, "title": "Include Variants", "type": "boolean"}}, {"in": "query", "name": "include_details", "required": false, "schema": {"default": true, "title": "Include Details", "type": "boolean"}}, {"in": "query", "name": "include_flows", "required": false, "schema": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Include Flows"}}, {"in": "query", "name": "include_screenshots", "required": false, "schema": {"default": false, "title": "Include Screenshots", "type": "boolean"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 500, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasV2GraphResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Graph", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/observations/{observation_id}": {"get": {"operationId": "get_atlas_v2_observation_api_v1_atlas_v2_apps__app_id__observations__observation_id__get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "observation_id", "required": true, "schema": {"title": "Observation Id", "type": "string"}}, {"in": "query", "name": "build_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}}, {"in": "query", "name": "report_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}}, {"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "source_kind", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Kind"}}, {"in": "query", "name": "from_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "From Time"}}, {"in": "query", "name": "to_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "To Time"}}, {"in": "query", "name": "surface_scope", "required": false, "schema": {"default": "app", "title": "Surface Scope", "type": "string"}}, {"in": "query", "name": "visibility", "required": false, "schema": {"default": "included", "title": "Visibility", "type": "string"}}, {"in": "query", "name": "include_variants", "required": false, "schema": {"default": true, "title": "Include Variants", "type": "boolean"}}, {"in": "query", "name": "include_screenshots", "required": false, "schema": {"default": false, "title": "Include Screenshots", "type": "boolean"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 1000, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"additionalProperties": true, "title": "Response Get Atlas V2 Observation Api V1 Atlas V2 Apps App Id Observations Observation Id Get", "type": "object"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Observation", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/observations/{observation_id}/annotation-anchor-preview": {"post": {"operationId": "preview_atlas_annotation_anchor", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "observation_id", "required": true, "schema": {"title": "Observation Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationAnchorPreviewRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationAnchorPreviewResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Preview Atlas Annotation Anchor", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/observations/{observation_id}/annotation-threads": {"get": {"operationId": "list_atlas_observation_annotation_threads", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "observation_id", "required": true, "schema": {"title": "Observation Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasAnnotationObservationThreadsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Atlas Observation Annotation Threads", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/observations/{observation_id}/grounded-annotation-threads": {"post": {"operationId": "create_grounded_atlas_annotation_thread", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "path", "name": "observation_id", "required": true, "schema": {"title": "Observation Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasGroundedAnnotationThreadCreateRequest"}}}, "required": true}, "responses": {"201": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasGroundedAnnotationThreadCreateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Grounded Atlas Annotation Thread", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/apps/{app_id}/structure": {"get": {"operationId": "get_atlas_v2_structure_api_v1_atlas_v2_apps__app_id__structure_get", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"title": "App Id", "type": "string"}}, {"in": "query", "name": "build_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Build Id"}}, {"in": "query", "name": "report_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Report Id"}}, {"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "workflow_execution_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Workflow Execution Id"}}, {"in": "query", "name": "source_kind", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source Kind"}}, {"in": "query", "name": "from_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "From Time"}}, {"in": "query", "name": "to_time", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "To Time"}}, {"in": "query", "name": "surface_scope", "required": false, "schema": {"default": "app", "title": "Surface Scope", "type": "string"}}, {"in": "query", "name": "visibility", "required": false, "schema": {"default": "included", "title": "Visibility", "type": "string"}}, {"in": "query", "name": "include_variants", "required": false, "schema": {"default": false, "title": "Include Variants", "type": "boolean"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 500, "title": "Limit", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"additionalProperties": true, "title": "Response Get Atlas V2 Structure Api V1 Atlas V2 Apps App Id Structure Get", "type": "object"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Structure", "tags": ["App Atlas"]}}, "/api/v1/atlas/v2/index": {"get": {"operationId": "get_atlas_v2_index_api_v1_atlas_v2_index_get", "parameters": [{"in": "query", "name": "limit", "required": false, "schema": {"default": 100, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "title": "Offset", "type": "integer"}}, {"in": "query", "name": "search", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Search"}}, {"in": "query", "name": "content_only", "required": false, "schema": {"default": false, "title": "Content Only", "type": "boolean"}}, {"in": "query", "name": "olap_ready", "required": false, "schema": {"default": false, "title": "Olap Ready", "type": "boolean"}}, {"in": "query", "name": "summary_first", "required": false, "schema": {"default": false, "title": "Summary First", "type": "boolean"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AtlasV2IndexResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Atlas V2 Index", "tags": ["App Atlas"]}}, "/api/v1/entity/users/cli-device-authorizations": {"post": {"description": "Start a browser approval for a CLI that cannot complete a local login.\n\nUnauthenticated by necessity: the caller has no credential yet, which is the\npoint. Creating an authorization grants nothing on its own; only a signed-in\nuser's approval mints a credential, and only the caller holding the returned\ndevice code can redeem it.\n\nParameters:\n request: Optional device label, per-install identifier, and bounded\n launcher (`client_source`) when the Cursor plugin started login.\n\nReturns:\n CreateCLIDeviceAuthorizationResponse: The device code, the short user\n code, both approval URLs, and the polling budget.\n\nRaises:\n HTTPException 429: When the per-IP creation limit is exceeded.\n HTTPException 503: When no authorization could be registered.", "operationId": "create_cli_device_authorization_endpoint_api_v1_entity_users_cli_device_authorizations_post", "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/CreateCLIDeviceAuthorizationRequest"}, {"type": "null"}], "title": "Request"}}}}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateCLIDeviceAuthorizationResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "summary": "Create Cli Device Authorization Endpoint", "tags": ["User"]}}, "/api/v1/entity/users/cli-device-authorizations/credentials": {"post": {"description": "Return the credential to the CLI holding the device code, exactly once.\n\nUnauthenticated by necessity and authorized by the device code alone, which\nis why that code is high entropy, travels only in the request body, and stops\nworking the moment it is redeemed.\n\nParameters:\n request: The device code issued when the authorization was created.\n\nReturns:\n RedeemCLIDeviceCredentialResponse: The pending state while the user has\n not decided, the denial, or the credential on the redeeming poll.\n\nRaises:\n HTTPException 404: If the device code is unknown, expired, or spent.\n HTTPException 429: When the per-IP poll limit is exceeded.", "operationId": "redeem_cli_device_credential_endpoint_api_v1_entity_users_cli_device_authorizations_credentials_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RedeemCLIDeviceCredentialRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RedeemCLIDeviceCredentialResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "summary": "Redeem Cli Device Credential Endpoint", "tags": ["User"]}}, "/api/v1/entity/users/get_dashboard_metrics": {"get": {"description": "Get dashboard metrics with week-over-week comparisons for tests and workflows.\n\nOnboarding, trial, billing, and Atlas facts come from primary and always\nreflect current state. When the eventual-read lane is unavailable this\nstill returns 200 with ``analytics_degraded=True`` and placeholder\nexecution aggregates, because none of the chrome the dashboard gates on\ndepends on that lane.\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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DashboardMetrics"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "Get Dashboard Metrics Endpoint", "tags": ["User"]}}, "/api/v1/entity/users/get_user_uuid": {"get": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AuthInfo"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "Get User Uuid Endpoint", "tags": ["User"]}}, "/api/v1/entity/users/revoke_cli_api_key": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RevokeCLIApiKeyResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Revoke Cli Api Key Endpoint", "tags": ["User"]}}, "/api/v1/execution/api/execute_test_id_async": {"post": {"description": "Trigger a test execution asynchronously via Hatchet event.", "operationId": "execute_test_id_async_api_v1_execution_api_execute_test_id_async_post", "parameters": [{"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}, {"in": "header", "name": "X-CI-Commit-SHA", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Commit-Sha"}}, {"in": "header", "name": "X-CI-Branch", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Branch"}}, {"in": "header", "name": "X-CI-PR-Number", "required": false, "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "X-Ci-Pr-Number"}}, {"in": "header", "name": "X-CI-Run-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Run-Url"}}, {"in": "header", "name": "X-CI-Run-ID", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Run-Id"}}, {"in": "header", "name": "X-CI-Repository", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Repository"}}, {"in": "header", "name": "X-CI-Actor", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Actor"}}, {"in": "header", "name": "X-CI-Actor-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Actor-Url"}}, {"in": "header", "name": "X-CI-PR-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Pr-Url"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TaskID"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExecuteTestAsyncAPIResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Execute Test Id Async", "tags": ["Tests", "public"]}}, "/api/v1/execution/api/execute_workflow_id_async": {"post": {"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", "parameters": [{"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}, {"in": "header", "name": "X-CI-Commit-SHA", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Commit-Sha"}}, {"in": "header", "name": "X-CI-Branch", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Branch"}}, {"in": "header", "name": "X-CI-PR-Number", "required": false, "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "X-Ci-Pr-Number"}}, {"in": "header", "name": "X-CI-Run-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Run-Url"}}, {"in": "header", "name": "X-CI-Run-ID", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Run-Id"}}, {"in": "header", "name": "X-CI-Repository", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Repository"}}, {"in": "header", "name": "X-CI-Actor", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Actor"}}, {"in": "header", "name": "X-CI-Actor-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Actor-Url"}}, {"in": "header", "name": "X-CI-PR-URL", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-Pr-Url"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/cognisim_schemas__schemas__device_schema__WorkflowInfo"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExecuteWorkflowAsyncAPIResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Execute Workflow Id Async", "tags": ["Workflows", "public"]}}, "/api/v1/execution/billing/plan": {"get": {"description": "Return the org's current billing plan.", "operationId": "billing_plan_api_v1_execution_billing_plan_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PlanInfo"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "Billing Plan"}}, "/api/v1/execution/device-proxy/{workflow_run_id}/{action}": {"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", "parameters": [{"in": "path", "name": "workflow_run_id", "required": true, "schema": {"title": "Workflow Run Id", "type": "string"}}, {"in": "path", "name": "action", "required": true, "schema": {"title": "Action", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Proxy Worker Request Get"}, "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", "parameters": [{"in": "path", "name": "workflow_run_id", "required": true, "schema": {"title": "Workflow Run Id", "type": "string"}}, {"in": "path", "name": "action", "required": true, "schema": {"title": "Action", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Proxy Worker Request Post"}}, "/api/v1/execution/device-sessions/active": {"get": {"description": "Get controllable device sessions for an organization.\n\nIncludes queued sessions waiting for a worker, plus starting/running sessions\nwhere the device can still be observed or controlled. Later non-terminal\nlifecycle states are excluded after device control has ended.\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", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ActiveDeviceSessionsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Active Device Sessions"}}, "/api/v1/execution/device-sessions/history": {"get": {"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, cli, api, explore, 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", "parameters": [{"in": "query", "name": "limit", "required": false, "schema": {"default": 50, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, {"in": "query", "name": "source", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Source"}}, {"in": "query", "name": "platform", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}}, {"in": "query", "name": "status", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}}, {"in": "query", "name": "search", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Search"}}, {"in": "query", "name": "user_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "User Id"}}, {"in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Attributed To Cloud Agent Conversation Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/app__routes__execution_routes__device_sessions_xpt__SessionHistoryResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Session History"}}, "/api/v1/execution/device-sessions/{session_id}": {"get": {"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", "parameters": [{"in": "path", "name": "session_id", "required": true, "schema": {"title": "Session Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeviceSessionDetailItem"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Device Session By Id"}}, "/api/v1/execution/device-sessions/{session_id}/artifacts/upload-url": {"post": {"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", "parameters": [{"in": "path", "name": "session_id", "required": true, "schema": {"title": "Session Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SessionArtifactUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SessionArtifactUploadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Session Artifact Upload Url"}}, "/api/v1/execution/device-targets": {"get": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AllPlatformTargets"}}}, "description": "Successful Response"}}, "summary": "Get the device target matrix for all platforms"}}, "/api/v1/execution/device/status/cancel/{workflow_run_id}": {"post": {"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 cloud_agent_provider: Cloud-agent provider header, when the CLI sent\n one.\n cloud_agent_provider_conversation_id: Provider conversation id header,\n which for Cursor is the Agent id.\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", "parameters": [{"in": "path", "name": "workflow_run_id", "required": true, "schema": {"title": "Workflow Run Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Cancel Device"}}, "/api/v1/execution/ground": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GroundResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Ground Element"}}, "/api/v1/execution/start_device": {"post": {"operationId": "start_device_api_v1_execution_start_device_post", "parameters": [{"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-Revyl-Agent", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Agent"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/StartDeviceInfo"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/StartDeviceResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Start Device"}}, "/api/v1/execution/streaming/worker-connection/{workflow_run_id}": {"get": {"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\nArgs:\n workflow_run_id: The workflow run ID to get connection info for.\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", "parameters": [{"in": "path", "name": "workflow_run_id", "required": true, "schema": {"title": "Workflow Run Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkerConnectionResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Worker Connection"}}, "/api/v1/execution/tests/status/cancel/{task_id}": {"post": {"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", "parameters": [{"in": "path", "name": "task_id", "required": true, "schema": {"title": "Task Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CancelTestResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Cancel Test", "tags": ["Tests", "public"]}}, "/api/v1/explorations/apps/{app_id}": {"post": {"description": "Launch an exploration run via the parent Hatchet workflow.", "operationId": "launch_exploration_api_v1_explorations_apps__app_id__post", "parameters": [{"in": "path", "name": "app_id", "required": true, "schema": {"format": "uuid", "title": "App Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExplorationLaunchRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExplorationLaunchResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Launch Exploration", "tags": ["Explorations"]}}, "/api/v1/explorations/{run_id}": {"get": {"operationId": "get_exploration_api_v1_explorations__run_id__get", "parameters": [{"in": "path", "name": "run_id", "required": true, "schema": {"format": "uuid", "title": "Run Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExplorationRunResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Exploration", "tags": ["Explorations"]}}, "/api/v1/explorations/{run_id}/cancel": {"post": {"description": "Cancel a running exploration and all of its device lanes.", "operationId": "cancel_exploration_api_v1_explorations__run_id__cancel_post", "parameters": [{"in": "path", "name": "run_id", "required": true, "schema": {"format": "uuid", "title": "Run Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExplorationCancelResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Cancel Exploration", "tags": ["Explorations"]}}, "/api/v1/explorations/{run_id}/report": {"get": {"description": "Run-report view of an exploration: parent run + per-lane child cards.", "operationId": "get_exploration_report_api_v1_explorations__run_id__report_get", "parameters": [{"in": "path", "name": "run_id", "required": true, "schema": {"format": "uuid", "title": "Run Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ExplorationRunReportResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Exploration Report", "tags": ["Explorations"]}}, "/api/v1/files/": {"get": {"description": "List all files for the authenticated user's org.", "operationId": "list_org_files_api_v1_files__get", "parameters": [{"in": "query", "name": "limit", "required": false, "schema": {"default": 100, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Org Files", "tags": ["Org Files", "Org Files"]}}, "/api/v1/files/upload-url": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileUploadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Upload Url", "tags": ["Org Files", "Org Files"]}}, "/api/v1/files/{file_id}": {"delete": {"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", "parameters": [{"in": "path", "name": "file_id", "required": true, "schema": {"format": "uuid", "title": "File Id", "type": "string"}}], "responses": {"204": {"description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Org File", "tags": ["Org Files", "Org Files"]}, "put": {"description": "Update file name and/or description.", "operationId": "update_org_file_api_v1_files__file_id__put", "parameters": [{"in": "path", "name": "file_id", "required": true, "schema": {"format": "uuid", "title": "File Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileUpdate"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFile"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Org File", "tags": ["Org Files", "Org Files"]}}, "/api/v1/files/{file_id}/complete-upload": {"post": {"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", "parameters": [{"in": "path", "name": "file_id", "required": true, "schema": {"format": "uuid", "title": "File Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileCompleteUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFile"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Complete Upload", "tags": ["Org Files", "Org Files"]}}, "/api/v1/files/{file_id}/download-url": {"get": {"description": "Generate a presigned download URL for an org file.", "operationId": "get_file_download_url_api_v1_files__file_id__download_url_get", "parameters": [{"in": "path", "name": "file_id", "required": true, "schema": {"format": "uuid", "title": "File Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileDownloadUrlResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get File Download Url", "tags": ["Org Files", "Org Files"]}}, "/api/v1/files/{file_id}/replace-url": {"put": {"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 \u2014 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", "parameters": [{"in": "path", "name": "file_id", "required": true, "schema": {"format": "uuid", "title": "File Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileUploadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgFileUploadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Replace Url", "tags": ["Org Files", "Org Files"]}}, "/api/v1/hotreload/relays": {"post": {"operationId": "create_hotreload_relay_api_v1_hotreload_relays_post", "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/HotReloadRelayCreateRequest"}, {"type": "null"}], "title": "Body"}}}}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HotReloadRelayResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Hotreload Relay", "tags": ["hotreload"]}}, "/api/v1/hotreload/relays/{relay_id}": {"delete": {"operationId": "revoke_hotreload_relay_api_v1_hotreload_relays__relay_id__delete", "parameters": [{"in": "path", "name": "relay_id", "required": true, "schema": {"title": "Relay Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HotReloadRelayRevokeResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Revoke Hotreload Relay", "tags": ["hotreload"]}}, "/api/v1/hotreload/relays/{relay_id}/heartbeat": {"post": {"operationId": "heartbeat_hotreload_relay_api_v1_hotreload_relays__relay_id__heartbeat_post", "parameters": [{"in": "path", "name": "relay_id", "required": true, "schema": {"title": "Relay Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HotReloadRelayHeartbeatResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Heartbeat Hotreload Relay", "tags": ["hotreload"]}}, "/api/v1/integrations/github/install-url": {"get": {"description": "Return a GitHub App install URL for the current authenticated org.", "operationId": "get_github_install_url_api_v1_integrations_github_install_url_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GitHubInstallUrlResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "Get Github Install Url", "tags": ["Integrations - GitHub App"]}}, "/api/v1/integrations/github/repositories": {"get": {"description": "List live GitHub repositories the org's GitHub App can see.", "operationId": "get_organization_repositories_api_v1_integrations_github_repositories_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrganizationRepositoriesResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "Get Organization Repositories", "tags": ["Integrations - GitHub App"]}}, "/api/v1/modules/create": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleSingleResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Module", "tags": ["Modules"]}}, "/api/v1/modules/delete/{module_id}": {"delete": {"description": "Delete a module", "operationId": "delete_module_api_v1_modules_delete__module_id__delete", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteModuleResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Module", "tags": ["Modules"]}}, "/api/v1/modules/list": {"get": {"description": "List all modules for the user's organization", "operationId": "list_modules_api_v1_modules_list_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModulesListResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "List Modules", "tags": ["Modules"]}}, "/api/v1/modules/update/{module_id}": {"put": {"description": "Update an existing module", "operationId": "update_module_api_v1_modules_update__module_id__put", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateModuleRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleSingleResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Module", "tags": ["Modules"]}}, "/api/v1/modules/{module_id}": {"get": {"description": "Get a specific module by ID", "operationId": "get_module_api_v1_modules__module_id__get", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleSingleResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Module", "tags": ["Modules"]}}, "/api/v1/modules/{module_id}/restore": {"post": {"description": "Restore a module to a previous version", "operationId": "restore_module_version_api_v1_modules__module_id__restore_post", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleRestoreVersionRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleRestoreVersionResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Restore Module Version", "tags": ["Modules"]}}, "/api/v1/modules/{module_id}/tests": {"get": {"description": "Get all tests that use a specific module", "operationId": "get_module_usage_api_v1_modules__module_id__tests_get", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleUsageResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Module Usage", "tags": ["Modules"]}}, "/api/v1/modules/{module_id}/versions": {"get": {"description": "Get version history for a module", "operationId": "get_module_versions_api_v1_modules__module_id__versions_get", "parameters": [{"in": "path", "name": "module_id", "required": true, "schema": {"format": "uuid", "title": "Module Id", "type": "string"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 20, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModuleVersionListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Module Versions", "tags": ["Modules"]}}, "/api/v1/projects/catalog": {"post": {"description": "List canonical projects after live repository access verification.", "operationId": "list_repository_projects_api_v1_projects_catalog_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepositoryProjectCatalogQuery"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepositoryProjectCatalogResponse"}}}, "description": "Successful Response"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 List Repository Projects Api V1 Projects Catalog Post"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "413": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Request Entity Too Large"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}}}, "description": "Unprocessable Entity"}, "502": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Gateway"}}, "security": [{"HTTPBearer": []}], "summary": "List Repository Projects", "tags": ["project-configuration"]}}, "/api/v1/projects/{project_id}/configuration": {"put": {"description": "Atomically replace the complete caller-directed project configuration.", "operationId": "replace_project_configuration_api_v1_projects__project_id__configuration_put", "parameters": [{"in": "path", "name": "project_id", "required": true, "schema": {"format": "uuid", "title": "Project Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationReplaceRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationReplaceResponse"}}}, "description": "Successful Response"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 Replace Project Configuration Api V1 Projects Project Id Configuration Put"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "413": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Request Entity Too Large"}, "422": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}], "title": "Response 422 Replace Project Configuration Api V1 Projects Project Id Configuration Put"}}}, "description": "Unprocessable Entity"}, "502": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Gateway"}}, "security": [{"HTTPBearer": []}], "summary": "Replace Project Configuration", "tags": ["project-configuration"]}}, "/api/v1/projects/{project_id}/configuration/read": {"post": {"description": "Read canonical state after live repository access verification.", "operationId": "read_project_configuration_api_v1_projects__project_id__configuration_read_post", "parameters": [{"in": "path", "name": "project_id", "required": true, "schema": {"format": "uuid", "title": "Project Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationReadRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationReadResponse"}}}, "description": "Successful Response"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 Read Project Configuration Api V1 Projects Project Id Configuration Read Post"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "413": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Request Entity Too Large"}, "422": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}], "title": "Response 422 Read Project Configuration Api V1 Projects Project Id Configuration Read Post"}}}, "description": "Unprocessable Entity"}, "502": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Gateway"}}, "security": [{"HTTPBearer": []}], "summary": "Read Project Configuration", "tags": ["project-configuration"]}}, "/api/v1/projects/{project_id}/configuration/validate": {"post": {"description": "Validate candidate meaning, identity, and references without writing.", "operationId": "validate_project_configuration_api_v1_projects__project_id__configuration_validate_post", "parameters": [{"in": "path", "name": "project_id", "required": true, "schema": {"format": "uuid", "title": "Project Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationValidateRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationValidateResponse"}}}, "description": "Successful Response"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 Validate Project Configuration Api V1 Projects Project Id Configuration Validate Post"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "413": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Request Entity Too Large"}, "422": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}], "title": "Response 422 Validate Project Configuration Api V1 Projects Project Id Configuration Validate Post"}}}, "description": "Unprocessable Entity"}, "502": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Gateway"}}, "security": [{"HTTPBearer": []}], "summary": "Validate Project Configuration", "tags": ["project-configuration"]}}, "/api/v1/projects/{project_id}/cursor-proof-authorization": {"get": {"description": "Return whether this project currently requires and has Cursor authority.", "operationId": "get_project_cursor_proof_authorization_api_v1_projects__project_id__cursor_proof_authorization_get", "parameters": [{"in": "path", "name": "project_id", "required": true, "schema": {"format": "uuid", "title": "Project Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectCursorProofAuthorizationResponse"}}}, "description": "Successful Response"}, "400": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Request"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 Get Project Cursor Proof Authorization Api V1 Projects Project Id Cursor Proof Authorization Get"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}}}, "description": "Unprocessable Entity"}, "503": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Service Unavailable"}}, "security": [{"HTTPBearer": []}], "summary": "Get Project Cursor Proof Authorization", "tags": ["project-configuration"]}, "put": {"description": "Authorize unattended Cursor proof without changing authored config.", "operationId": "put_project_cursor_proof_authorization_api_v1_projects__project_id__cursor_proof_authorization_put", "parameters": [{"in": "path", "name": "project_id", "required": true, "schema": {"format": "uuid", "title": "Project Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectCursorProofAuthorizationResponse"}}}, "description": "Successful Response"}, "400": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Bad Request"}, "403": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}, {"$ref": "#/components/schemas/ProjectConfigurationForbiddenResponse"}], "title": "Response 403 Put Project Cursor Proof Authorization Api V1 Projects Project Id Cursor Proof Authorization Put"}}}, "description": "Forbidden"}, "404": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Not Found"}, "409": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Conflict"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationRequestValidationErrorResponse"}}}, "description": "Unprocessable Entity"}, "503": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectConfigurationErrorResponse"}}}, "description": "Service Unavailable"}}, "security": [{"HTTPBearer": []}], "summary": "Put Project Cursor Proof Authorization", "tags": ["project-configuration"]}}, "/api/v1/recordings/compile": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CompileRecordingStartResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Start Compile", "tags": ["Recording Compilation"]}}, "/api/v1/recordings/compile/{job_id}": {"get": {"description": "Poll the status of a compile job.", "operationId": "get_compile_status_api_v1_recordings_compile__job_id__get", "parameters": [{"in": "path", "name": "job_id", "required": true, "schema": {"title": "Job Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CompileRecordingStatusResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Compile Status", "tags": ["Recording Compilation"]}}, "/api/v1/report/async-run/generate_shareable_report_link_by_session": {"post": {"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\nConcurrent first creates for the same session use\n``insert_session_if_absent`` (ON CONFLICT DO NOTHING). The losing writer\nreselects the winner's live token and extends its expiry instead of\nraising a unique-violation 500.\n\nRefreshing with a temporary ``expiration_hours`` never shortens an\nexisting longer-lived expiry (for example after proof-media publish\npromoted the token). Explicit delete remains the revoke path.\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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ShareableReportResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Generate Shareable Report Link By Session", "tags": ["Async Test Report"]}}, "/api/v1/report/async-run/generate_shareable_report_link_by_task": {"post": {"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.\n\nThe lookup-then-upsert runs inside a single transaction (get_db_tx_conn) so\na concurrent generate can't race between the existing-token read and the\ndelete/update/insert that follows.", "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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ShareableReportResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Generate Shareable Report Link By Task", "tags": ["Async Test Report"]}}, "/api/v1/reports-v3/reports/by-execution/{execution_id}/context": {"get": {"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", "parameters": [{"in": "path", "name": "execution_id", "required": true, "schema": {"title": "Execution Id", "type": "string"}}, {"in": "query", "name": "include_steps", "required": false, "schema": {"default": true, "title": "Include Steps", "type": "boolean"}}, {"in": "query", "name": "include_actions", "required": false, "schema": {"default": true, "title": "Include Actions", "type": "boolean"}}, {"in": "query", "name": "include_llm_calls", "required": false, "schema": {"default": true, "title": "Include Llm Calls", "type": "boolean"}}, {"description": "Public share token for unauthenticated access", "in": "query", "name": "token", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Public share token for unauthenticated access", "title": "Token"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReportContextResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Report Context By Execution"}}, "/api/v1/reports-v3/reports/by-session/{session_id}/context": {"get": {"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", "parameters": [{"in": "path", "name": "session_id", "required": true, "schema": {"title": "Session Id", "type": "string"}}, {"in": "query", "name": "include_steps", "required": false, "schema": {"default": true, "title": "Include Steps", "type": "boolean"}}, {"in": "query", "name": "include_actions", "required": false, "schema": {"default": true, "title": "Include Actions", "type": "boolean"}}, {"in": "query", "name": "include_llm_calls", "required": false, "schema": {"default": true, "title": "Include Llm Calls", "type": "boolean"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReportContextResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Report Context By Session"}}, "/api/v1/reports-v3/reports/{report_id}/device-logs": {"get": {"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", "parameters": [{"in": "path", "name": "report_id", "required": true, "schema": {"title": "Report Id", "type": "string"}}, {"description": "Public share token for unauthenticated access", "in": "query", "name": "token", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Public share token for unauthenticated access", "title": "Token"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeviceLogsDownloadResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Device Logs Download Url"}}, "/api/v1/tests/create": {"post": {"description": "Create a new test using the normalized schema", "operationId": "create_test_endpoint_api_v1_tests_create_post", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Test"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Test"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Test Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/delete/{test_id}": {"delete": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestDeleteResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Test Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/duplicate": {"post": {"description": "Duplicate an existing test with all its data.", "operationId": "duplicate_test_endpoint_api_v1_tests_duplicate_post", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DuplicateTestRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DuplicateTestResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Duplicate Test Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/get_simple_tests": {"get": {"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.", "operationId": "get_simple_tests_endpoint_api_v1_tests_get_simple_tests_get", "parameters": [{"description": "Maximum number of tests to return", "in": "query", "name": "limit", "required": false, "schema": {"default": 100, "description": "Maximum number of tests to return", "title": "Limit", "type": "integer"}}, {"description": "Number of tests to skip", "in": "query", "name": "offset", "required": false, "schema": {"default": 0, "description": "Number of tests to skip", "title": "Offset", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SimpleTestListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Simple Tests Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/get_test_by_id/{test_id}": {"get": {"operationId": "get_test_by_id_endpoint_api_v1_tests_get_test_by_id__test_id__get", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestResourceResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Test By Id Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/get_test_enhanced_history": {"get": {"description": "Get enhanced test execution history with detailed tracking information.", "operationId": "get_test_enhanced_history_api_v1_tests_get_test_enhanced_history_get", "parameters": [{"in": "query", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 20, "maximum": 100, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, {"in": "query", "name": "status", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Status"}}, {"in": "query", "name": "sort_order", "required": false, "schema": {"default": "desc", "pattern": "^(asc|desc)$", "title": "Sort Order", "type": "string"}}, {"in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Attributed To Cloud Agent Conversation Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestEnhancedHistoryResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Test Enhanced History", "tags": ["Tests"]}}, "/api/v1/tests/get_test_execution_task": {"get": {"description": "Get a test execution task status by task ID (legacy endpoint).", "operationId": "get_test_execution_task_api_v1_tests_get_test_execution_task_get", "parameters": [{"in": "query", "name": "task_id", "required": true, "schema": {"title": "Task Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestStatusResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Test Execution Task", "tags": ["Tests"]}}, "/api/v1/tests/get_tests": {"get": {"operationId": "query_tests_endpoint_api_v1_tests_get_tests_get", "parameters": [{"in": "query", "name": "limit", "required": false, "schema": {"default": 50, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, {"in": "query", "name": "search", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Search"}}, {"in": "query", "name": "status", "required": false, "schema": {"default": "all", "enum": ["all", "passing", "failing", "notRun"], "title": "Status", "type": "string"}}, {"in": "query", "name": "platform", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Platform"}}, {"in": "query", "name": "app_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "App Id"}}, {"in": "query", "name": "tags", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Tags"}}, {"in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Attributed To Cloud Agent Conversation Id"}}, {"in": "query", "name": "sort_by", "required": false, "schema": {"default": "lastRun", "enum": ["lastRun", "name", "status", "platform", "build", "duration"], "title": "Sort By", "type": "string"}}, {"in": "query", "name": "sort_dir", "required": false, "schema": {"default": "desc", "enum": ["asc", "desc"], "title": "Sort Dir", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Query Tests Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/scripts": {"get": {"description": "List all scripts accessible to the user (own scripts + org scripts).", "operationId": "list_scripts_api_v1_tests_scripts_get", "parameters": [{"description": "Maximum number of scripts to return", "in": "query", "name": "limit", "required": false, "schema": {"default": 100, "description": "Maximum number of scripts to return", "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}}, {"description": "Number of scripts to skip", "in": "query", "name": "offset", "required": false, "schema": {"default": 0, "description": "Number of scripts to skip", "minimum": 0, "title": "Offset", "type": "integer"}}, {"description": "Filter by runtime (python, javascript, typescript, bash)", "in": "query", "name": "runtime", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "description": "Filter by runtime (python, javascript, typescript, bash)", "title": "Runtime"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScriptListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Scripts", "tags": ["Code Execution Scripts"]}, "post": {"description": "Create a new script.", "operationId": "create_script_api_v1_tests_scripts_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScriptCreate"}}}, "required": true}, "responses": {"201": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScript"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Script", "tags": ["Code Execution Scripts"]}}, "/api/v1/tests/scripts/{script_id}": {"delete": {"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", "parameters": [{"in": "path", "name": "script_id", "required": true, "schema": {"format": "uuid", "title": "Script Id", "type": "string"}}], "responses": {"204": {"description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Script", "tags": ["Code Execution Scripts"]}, "get": {"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", "parameters": [{"in": "path", "name": "script_id", "required": true, "schema": {"format": "uuid", "title": "Script Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScript"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Script", "tags": ["Code Execution Scripts"]}, "put": {"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", "parameters": [{"in": "path", "name": "script_id", "required": true, "schema": {"format": "uuid", "title": "Script Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScriptUpdate"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeExecutionScript"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Script", "tags": ["Code Execution Scripts"]}}, "/api/v1/tests/scripts/{script_id}/tests": {"get": {"description": "Get all usage of a specific script: tests that use it directly as a step,\nand modules that use it as a step and are themselves imported by at least\none test.", "operationId": "get_script_usage_api_v1_tests_scripts__script_id__tests_get", "parameters": [{"in": "path", "name": "script_id", "required": true, "schema": {"format": "uuid", "title": "Script Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ScriptUsageResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Script Usage", "tags": ["Code Execution Scripts"]}}, "/api/v1/tests/tags": {"get": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TagListResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "List Tags", "tags": ["Tags"]}, "post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TagResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Tag", "tags": ["Tags"]}}, "/api/v1/tests/tags/tests/bulk-sync": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BulkSyncTagsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Bulk Sync Test Tags", "tags": ["Tags"]}}, "/api/v1/tests/tags/tests/{test_id}": {"get": {"description": "Get all tags for a specific test.", "operationId": "get_test_tags_api_v1_tests_tags_tests__test_id__get", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/TagResponse"}, "title": "Response Get Test Tags Api V1 Tests Tags Tests Test Id Get", "type": "array"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Test Tags", "tags": ["Tags"]}}, "/api/v1/tests/tags/tests/{test_id}/sync": {"post": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SyncTagsRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SyncTagsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Sync Test Tags", "tags": ["Tags"]}}, "/api/v1/tests/tags/{tag_id}": {"delete": {"description": "Delete a tag. Automatically removes from all tests (CASCADE).", "operationId": "delete_tag_api_v1_tests_tags__tag_id__delete", "parameters": [{"in": "path", "name": "tag_id", "required": true, "schema": {"title": "Tag Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"additionalProperties": true, "title": "Response Delete Tag Api V1 Tests Tags Tag Id Delete", "type": "object"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Tag", "tags": ["Tags"]}, "patch": {"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", "parameters": [{"in": "path", "name": "tag_id", "required": true, "schema": {"title": "Tag Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateTagRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TagResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Tag", "tags": ["Tags"]}}, "/api/v1/tests/update/{test_id}": {"put": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Test"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Test"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Test Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/yaml/from-blocks": {"post": {"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", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/BlocksCreationRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestCreationResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Test From Blocks", "tags": ["YAML Operations"]}}, "/api/v1/tests/{test_id}/device-target": {"patch": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateDeviceTargetRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateDeviceTargetResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Device Target", "tags": ["Tests"]}}, "/api/v1/tests/{test_id}/restore": {"post": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestRestoreVersionRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestRestoreVersionResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Restore Test Version Endpoint", "tags": ["Tests"]}}, "/api/v1/tests/{test_id}/versions": {"get": {"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", "parameters": [{"in": "path", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}, {"description": "Maximum number of versions to return", "in": "query", "name": "limit", "required": false, "schema": {"default": 50, "description": "Maximum number of versions to return", "title": "Limit", "type": "integer"}}, {"description": "Number of versions to skip", "in": "query", "name": "offset", "required": false, "schema": {"default": 0, "description": "Number of versions to skip", "title": "Offset", "type": "integer"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TestVersionListResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Test Versions Endpoint", "tags": ["Tests"]}}, "/api/v1/variables/custom/add": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Add Variable Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/check_exists": {"get": {"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", "parameters": [{"in": "query", "name": "test_id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Test Id"}}, {"in": "query", "name": "variable_name", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Variable Name"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CheckVariableExistsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Check Variable Exists Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/delete": {"delete": {"description": "Delete a variable for a specific test", "operationId": "delete_variable_endpoint_api_v1_variables_custom_delete_delete", "parameters": [{"in": "query", "name": "test_uid", "required": true, "schema": {"title": "Test Uid", "type": "string"}}, {"in": "query", "name": "variable_name", "required": true, "schema": {"title": "Variable Name", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariablesResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Variable Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/delete_all": {"delete": {"description": "Delete all variables for a specific test", "operationId": "delete_all_variables_endpoint_api_v1_variables_custom_delete_all_delete", "parameters": [{"in": "query", "name": "test_uid", "required": true, "schema": {"title": "Test Uid", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariablesResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete All Variables Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/read_variables": {"get": {"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", "parameters": [{"in": "query", "name": "test_uid", "required": true, "schema": {"title": "Test Uid", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariablesResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Read Variables Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/update/{variable_id}": {"put": {"description": "Apply a partial merge update (name / value / secret) by stable variable ID.\n\nMirrors the global-variable update contract: only provided fields change and\na secret's plaintext is encrypted at rest and never returned. Secret\ntransitions follow the write-only model: promoting a non-secret encrypts the\nexisting value in place (no re-entry); demoting a secret requires a fresh\nvalue, since the old plaintext is never revealed.", "operationId": "update_variable_endpoint_api_v1_variables_custom_update__variable_id__put", "parameters": [{"in": "path", "name": "variable_id", "required": true, "schema": {"format": "uuid", "title": "Variable Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateVariableModel"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Variable Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/custom/update_value": {"put": {"description": "Update a variable's value by its stable ID.\n\nPreserves the variable's secret status: a secret's new value is re-encrypted\nso plaintext is never written, and the response stays masked.", "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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/VariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Variable Value Endpoint", "tags": ["Custom Variables"]}}, "/api/v1/variables/global": {"get": {"description": "List all global variables for the caller's organization.", "operationId": "list_global_variables_api_v1_variables_global_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GlobalVariablesResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "List Global Variables", "tags": ["Global Variables"]}, "post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GlobalVariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Add Global Variable", "tags": ["Global Variables"]}}, "/api/v1/variables/global/{variable_id}": {"delete": {"description": "Delete a global variable.", "operationId": "delete_global_variable_api_v1_variables_global__variable_id__delete", "parameters": [{"in": "path", "name": "variable_id", "required": true, "schema": {"format": "uuid", "title": "Variable Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GlobalVariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Global Variable", "tags": ["Global Variables"]}, "put": {"description": "Update an existing global variable.", "operationId": "update_global_variable_api_v1_variables_global__variable_id__put", "parameters": [{"in": "path", "name": "variable_id", "required": true, "schema": {"format": "uuid", "title": "Variable Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GlobalVariableUpdate"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GlobalVariableResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Global Variable", "tags": ["Global Variables"]}}, "/api/v1/variables/ios_storekit/refs": {"delete": {"operationId": "delete_ios_storekit_config_ref_api_v1_variables_ios_storekit_refs_delete", "parameters": [{"in": "query", "name": "scope_type", "required": true, "schema": {"title": "Scope Type", "type": "string"}}, {"in": "query", "name": "scope_id", "required": true, "schema": {"format": "uuid", "title": "Scope Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/IosStoreKitConfigRefResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Ios Storekit Config Ref", "tags": ["iOS StoreKit Config"]}, "get": {"operationId": "get_ios_storekit_config_ref_api_v1_variables_ios_storekit_refs_get", "parameters": [{"in": "query", "name": "scope_type", "required": true, "schema": {"title": "Scope Type", "type": "string"}}, {"in": "query", "name": "scope_id", "required": true, "schema": {"format": "uuid", "title": "Scope Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/IosStoreKitConfigRefResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Ios Storekit Config Ref", "tags": ["iOS StoreKit Config"]}, "put": {"operationId": "upsert_ios_storekit_config_ref_api_v1_variables_ios_storekit_refs_put", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/IosStoreKitConfigRefUpsertRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/IosStoreKitConfigRefResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Upsert Ios Storekit Config Ref", "tags": ["iOS StoreKit Config"]}}, "/api/v1/variables/org_launch_env": {"get": {"operationId": "list_org_launch_env_vars_api_v1_variables_org_launch_env_get", "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarsResponse"}}}, "description": "Successful Response"}}, "security": [{"HTTPBearer": []}], "summary": "List Org Launch Env Vars", "tags": ["Org Launch Environment Variables"]}, "post": {"operationId": "add_org_launch_env_var_api_v1_variables_org_launch_env_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarCreate"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Add Org Launch Env Var", "tags": ["Org Launch Environment Variables"]}}, "/api/v1/variables/org_launch_env/test-attachments": {"get": {"operationId": "list_test_launch_env_var_attachments_api_v1_variables_org_launch_env_test_attachments_get", "parameters": [{"in": "query", "name": "test_id", "required": true, "schema": {"title": "Test Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "List Test Launch Env Var Attachments", "tags": ["Org Launch Environment Variables"]}, "put": {"operationId": "replace_test_launch_env_var_attachments_api_v1_variables_org_launch_env_test_attachments_put", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReplaceTestLaunchEnvVarRefsRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarsResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Replace Test Launch Env Var Attachments", "tags": ["Org Launch Environment Variables"]}}, "/api/v1/variables/org_launch_env/{env_var_id}": {"delete": {"operationId": "delete_org_launch_env_var_api_v1_variables_org_launch_env__env_var_id__delete", "parameters": [{"in": "path", "name": "env_var_id", "required": true, "schema": {"format": "uuid", "title": "Env Var Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarDeleteResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Org Launch Env Var", "tags": ["Org Launch Environment Variables"]}, "put": {"operationId": "update_org_launch_env_var_api_v1_variables_org_launch_env__env_var_id__put", "parameters": [{"in": "path", "name": "env_var_id", "required": true, "schema": {"format": "uuid", "title": "Env Var Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarUpdate"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrgLaunchEnvVarResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Org Launch Env Var", "tags": ["Org Launch Environment Variables"]}}, "/api/v1/workflows/create": {"post": {"description": "Create a new workflow", "operationId": "create_workflow_api_v1_workflows_create_post", "parameters": [{"in": "header", "name": "X-Revyl-Cloud-Agent-Provider", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider"}}, {"in": "header", "name": "X-Revyl-Cloud-Agent-Provider-Conversation-Id", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Cloud-Agent-Provider-Conversation-Id"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowData"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateWorkflowResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Create Workflow", "tags": ["Workflows"]}}, "/api/v1/workflows/delete/{workflow_id}": {"delete": {"description": "Soft delete a workflow by setting the deleted flag to True", "operationId": "delete_workflow_endpoint_api_v1_workflows_delete__workflow_id__delete", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteWorkflowResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Delete Workflow Endpoint", "tags": ["Workflows"]}}, "/api/v1/workflows/get_info/{workflow_id}": {"get": {"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", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflow Info Lightweight", "tags": ["Workflows"]}}, "/api/v1/workflows/get_with_last_status": {"get": {"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", "parameters": [{"in": "query", "name": "limit", "required": false, "schema": {"default": 100, "maximum": 200, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, {"in": "query", "name": "history_limit", "required": false, "schema": {"default": 10, "maximum": 50, "minimum": 1, "title": "History Limit", "type": "integer"}}, {"in": "query", "name": "attributed_to_cloud_agent_conversation_id", "required": false, "schema": {"anyOf": [{"format": "uuid", "type": "string"}, {"type": "null"}], "title": "Attributed To Cloud Agent Conversation Id"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetWorkflowsWithLastStatusResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflows With Last Status", "tags": ["Workflows"]}}, "/api/v1/workflows/get_workflow_info": {"get": {"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", "parameters": [{"in": "query", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflow Info Endpoint", "tags": ["Workflows"]}}, "/api/v1/workflows/share/generate_shareable_link": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GenerateWorkflowShareableLinkResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Generate Workflow Shareable Link", "tags": ["Workflow Share"]}}, "/api/v1/workflows/share/unified-report": {"post": {"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": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnifiedWorkflowReportResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "summary": "Get Unified Workflow Report", "tags": ["Workflow Share"]}}, "/api/v1/workflows/status/history/{workflow_id}": {"get": {"description": "Get execution history with org-based authorization.", "operationId": "get_workflow_execution_history_api_v1_workflows_status_history__workflow_id__get", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "query", "name": "limit", "required": false, "schema": {"default": 100, "maximum": 1000, "minimum": 1, "title": "Limit", "type": "integer"}}, {"in": "query", "name": "offset", "required": false, "schema": {"default": 0, "minimum": 0, "title": "Offset", "type": "integer"}}, {"description": "Start date in ISO format (YYYY-MM-DD) - get executions from this date to now", "in": "query", "name": "start_date", "required": false, "schema": {"anyOf": [{"format": "date-time", "type": "string"}, {"type": "null"}], "description": "Start date in ISO format (YYYY-MM-DD) - get executions from this date to now", "title": "Start Date"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowExecutionHistoryResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflow Execution History", "tags": ["Workflow Status"]}}, "/api/v1/workflows/status/{task_id}": {"get": {"description": "Get real-time status of a specific workflow execution.", "operationId": "get_workflow_status_api_v1_workflows_status__task_id__get", "parameters": [{"in": "path", "name": "task_id", "required": true, "schema": {"title": "Task Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowStatusResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflow Status", "tags": ["Workflow Status"]}}, "/api/v1/workflows/update_build_config/{workflow_id}": {"put": {"description": "Update the build configuration of a workflow", "operationId": "update_workflow_build_config_api_v1_workflows_update_build_config__workflow_id__put", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateWorkflowBuildConfigRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowUpdateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Build Config", "tags": ["Workflows"]}}, "/api/v1/workflows/update_location_config/{workflow_id}": {"put": {"description": "Update the location configuration of a workflow", "operationId": "update_workflow_location_config_api_v1_workflows_update_location_config__workflow_id__put", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateWorkflowLocationConfigRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowUpdateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Location Config", "tags": ["Workflows"]}}, "/api/v1/workflows/update_name/{workflow_id}": {"put": {"description": "Update the name of a workflow", "operationId": "update_workflow_name_api_v1_workflows_update_name__workflow_id__put", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateWorkflowNameRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowUpdateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Name", "tags": ["Workflows"]}}, "/api/v1/workflows/update_run_config/{workflow_id}": {"put": {"description": "Update the run configuration of a workflow", "operationId": "update_workflow_run_config_api_v1_workflows_update_run_config__workflow_id__put", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateWorkflowRunConfigRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/WorkflowUpdateResponse"}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Run Config", "tags": ["Workflows"]}}, "/api/v1/workflows/update_tests/{workflow_id}": {"put": {"description": "Update the test list for a workflow (batch update)", "operationId": "update_workflow_tests_api_v1_workflows_update_tests__workflow_id__put", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}, {"in": "header", "name": "X-Revyl-Client", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Revyl-Client"}}, {"in": "header", "name": "X-CI-System", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "X-Ci-System"}}], "requestBody": {"content": {"application/json": {"schema": {"items": {"format": "uuid", "type": "string"}, "title": "Test Ids", "type": "array"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Tests", "tags": ["Workflows"]}}, "/api/v1/workflows/workflow-tests/{workflow_test_id}": {"patch": {"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", "parameters": [{"in": "path", "name": "workflow_test_id", "required": true, "schema": {"title": "Workflow Test Id", "type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateFailurePolicyRequest"}}}, "required": true}, "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Update Workflow Test Failure Policy", "tags": ["Workflows", "Workflows", "public"]}}, "/api/v1/workflows/workflow/{workflow_id}/tests": {"get": {"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", "parameters": [{"in": "path", "name": "workflow_id", "required": true, "schema": {"title": "Workflow Id", "type": "string"}}], "responses": {"200": {"content": {"application/json": {"schema": {}}}, "description": "Successful Response"}, "422": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}, "description": "Validation Error"}}, "security": [{"HTTPBearer": []}], "summary": "Get Workflow Tests With Policy", "tags": ["Workflows", "Workflows", "public"]}}}, "servers": [{"description": "Production", "url": "https://backend.revyl.ai"}]}