use crate::task_run::Pagination;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RunType {
QaTest,
IntegrationTest,
LiveAutomation,
Recording,
Debug,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RunStatus {
Pending,
Running,
Completed,
Failed,
Timeout,
Cancelled,
Paused,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ActionStatus {
Success,
Failed,
Timeout,
Skipped,
Error,
Pending,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
#[schemars(title = "ExecutionActionType")]
pub enum ActionType {
Find,
FindAll,
WaitFor,
WaitUntilGone,
Click,
DoubleClick,
RightClick,
Type,
PressKey,
Hotkey,
Scroll,
Drag,
GoToState,
Transition,
VerifyState,
Conditional,
Loop,
Parallel,
Sequence,
Wait,
Screenshot,
Log,
Assert,
AiPrompt,
RunPromptSequence,
Custom,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ErrorType {
ElementNotFound,
Timeout,
AssertionFailed,
Crash,
NetworkError,
ValidationError,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum IssueSeverity {
Critical,
High,
Medium,
Low,
Informational,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ScreenshotType {
Error,
Success,
Manual,
Periodic,
ActionResult,
StateVerification,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct RunnerMetadata {
#[serde(alias = "runner_version")]
pub runner_version: String,
#[serde(alias = "os")]
pub os: String,
#[serde(alias = "hostname")]
pub hostname: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screen_resolution"
)]
pub screen_resolution: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "cpu_info")]
pub cpu_info: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "memory_mb")]
pub memory_mb: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "extra")]
pub extra: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct WorkflowMetadata {
#[serde(alias = "workflow_id")]
pub workflow_id: String,
#[serde(alias = "workflow_name")]
pub workflow_name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "workflow_version"
)]
pub workflow_version: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "total_states"
)]
pub total_states: Option<u32>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "total_transitions"
)]
pub total_transitions: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "tags")]
pub tags: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "initial_state_ids"
)]
pub initial_state_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionStats {
#[serde(alias = "total_actions")]
pub total_actions: u32,
#[serde(alias = "successful_actions")]
pub successful_actions: u32,
#[serde(alias = "failed_actions")]
pub failed_actions: u32,
#[serde(alias = "timeout_actions")]
pub timeout_actions: u32,
#[serde(alias = "skipped_actions")]
pub skipped_actions: u32,
#[serde(alias = "total_duration_ms")]
pub total_duration_ms: u64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "avg_action_duration_ms"
)]
pub avg_action_duration_ms: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "total_tokens_input"
)]
pub total_tokens_input: Option<u64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "total_tokens_output"
)]
pub total_tokens_output: Option<u64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "total_cost_usd"
)]
pub total_cost_usd: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "llm_action_count"
)]
pub llm_action_count: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct CoverageData {
#[serde(alias = "coverage_percentage")]
pub coverage_percentage: f64,
#[serde(alias = "states_covered")]
pub states_covered: u32,
#[serde(alias = "total_states")]
pub total_states: u32,
#[serde(alias = "transitions_covered")]
pub transitions_covered: u32,
#[serde(alias = "total_transitions")]
pub total_transitions: u32,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "uncovered_states"
)]
pub uncovered_states: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "uncovered_transitions"
)]
pub uncovered_transitions: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "state_visit_counts"
)]
pub state_visit_counts: Option<HashMap<String, u32>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "transition_execution_counts"
)]
pub transition_execution_counts: Option<HashMap<String, u32>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct LLMMetrics {
#[serde(default, skip_serializing_if = "Option::is_none", alias = "model")]
pub model: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "provider")]
pub provider: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "tokens_input"
)]
pub tokens_input: Option<u64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "tokens_output"
)]
pub tokens_output: Option<u64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "tokens_total"
)]
pub tokens_total: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "cost_usd")]
pub cost_usd: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "generation_params"
)]
pub generation_params: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunCreate {
#[serde(alias = "project_id")]
pub project_id: String,
#[serde(alias = "run_type")]
pub run_type: RunType,
#[serde(alias = "run_name")]
pub run_name: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(alias = "runner_metadata")]
pub runner_metadata: RunnerMetadata,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "workflow_metadata"
)]
pub workflow_metadata: Option<WorkflowMetadata>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "configuration"
)]
pub configuration: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunResponse {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "project_id")]
pub project_id: String,
#[serde(alias = "run_type")]
pub run_type: RunType,
#[serde(alias = "run_name")]
pub run_name: String,
#[serde(alias = "status")]
pub status: RunStatus,
#[serde(alias = "started_at")]
pub started_at: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "ended_at")]
pub ended_at: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "duration_seconds"
)]
pub duration_seconds: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(title = "ExecutionMatchLocation")]
#[schemars(deny_unknown_fields)]
pub struct MatchLocation {
#[serde(alias = "x")]
pub x: i32,
#[serde(alias = "y")]
pub y: i32,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "width")]
pub width: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "height")]
pub height: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionExecutionCreate {
#[serde(alias = "sequence_number")]
pub sequence_number: u32,
#[serde(alias = "action_type")]
pub action_type: ActionType,
#[serde(alias = "action_name")]
pub action_name: String,
#[serde(alias = "status")]
pub status: ActionStatus,
#[serde(alias = "started_at")]
pub started_at: String,
#[serde(alias = "completed_at")]
pub completed_at: String,
#[serde(alias = "duration_ms")]
pub duration_ms: u64,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "from_state")]
pub from_state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "to_state")]
pub to_state: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "active_states"
)]
pub active_states: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "pattern_id")]
pub pattern_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "pattern_name"
)]
pub pattern_name: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "confidence_score"
)]
pub confidence_score: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "match_location"
)]
pub match_location: Option<MatchLocation>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "error_message"
)]
pub error_message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "error_type")]
pub error_type: Option<ErrorType>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "error_stack"
)]
pub error_stack: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screenshot_id"
)]
pub screenshot_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "parent_action_id"
)]
pub parent_action_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "input_data")]
pub input_data: Option<HashMap<String, Value>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "output_data"
)]
pub output_data: Option<HashMap<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "metadata")]
pub metadata: Option<HashMap<String, Value>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "llm_metrics"
)]
pub llm_metrics: Option<LLMMetrics>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "span_type")]
pub span_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "trace_id")]
pub trace_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "parent_id")]
pub parent_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionExecutionResponse {
#[serde(alias = "recorded")]
pub recorded: u32,
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "action_ids")]
pub action_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ScreenshotAnnotationShape {
Box,
Circle,
Arrow,
Text,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ScreenshotAnnotation {
#[serde(rename = "type", alias = "shape")]
pub shape: ScreenshotAnnotationShape,
#[serde(alias = "x")]
pub x: i32,
#[serde(alias = "y")]
pub y: i32,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "width")]
pub width: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "height")]
pub height: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "label")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "color")]
pub color: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionScreenshotCreate {
#[serde(alias = "screenshot_id")]
pub screenshot_id: String,
#[serde(alias = "sequence_number")]
pub sequence_number: u32,
#[serde(alias = "screenshot_type")]
pub screenshot_type: ScreenshotType,
#[serde(alias = "timestamp")]
pub timestamp: String,
#[serde(alias = "width")]
pub width: u32,
#[serde(alias = "height")]
pub height: u32,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_sequence_number"
)]
pub action_sequence_number: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "state")]
pub state: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "active_states"
)]
pub active_states: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "annotations"
)]
pub annotations: Option<Vec<ScreenshotAnnotation>>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "metadata")]
pub metadata: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionScreenshotResponse {
#[serde(alias = "screenshot_id")]
pub screenshot_id: String,
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "image_url")]
pub image_url: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "thumbnail_url"
)]
pub thumbnail_url: Option<String>,
#[serde(alias = "uploaded_at")]
pub uploaded_at: String,
#[serde(alias = "file_size_bytes")]
pub file_size_bytes: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueCreate {
#[serde(alias = "title")]
pub title: String,
#[serde(alias = "description")]
pub description: String,
#[serde(alias = "severity")]
pub severity: IssueSeverity,
#[serde(alias = "issue_type")]
pub issue_type: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_sequence_number"
)]
pub action_sequence_number: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "state")]
pub state: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screenshot_ids"
)]
pub screenshot_ids: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "reproduction_steps"
)]
pub reproduction_steps: Option<Vec<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "expected_behavior"
)]
pub expected_behavior: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "actual_behavior"
)]
pub actual_behavior: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "metadata")]
pub metadata: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueResponse {
#[serde(alias = "recorded")]
pub recorded: u32,
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "issue_ids")]
pub issue_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunComplete {
#[serde(alias = "status")]
pub status: RunStatus,
#[serde(alias = "ended_at")]
pub ended_at: String,
#[serde(alias = "stats")]
pub stats: ExecutionStats,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "coverage")]
pub coverage: Option<CoverageData>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "summary")]
pub summary: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "error_message"
)]
pub error_message: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunCompleteResponse {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "status")]
pub status: RunStatus,
#[serde(alias = "started_at")]
pub started_at: String,
#[serde(alias = "ended_at")]
pub ended_at: String,
#[serde(alias = "duration_seconds")]
pub duration_seconds: f64,
#[serde(alias = "stats")]
pub stats: ExecutionStats,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "coverage")]
pub coverage: Option<CoverageData>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum IssueStatus {
New,
Open,
InProgress,
Resolved,
Closed,
WontFix,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum IssueType {
Functional,
Visual,
Performance,
Crash,
Timeout,
Assertion,
StateMismatch,
ElementNotFound,
AiDetected,
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum IssueSource {
Automation,
AiAnalysis,
VisualRegression,
UserReported,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionExecutionBatch {
#[serde(alias = "actions")]
pub actions: Vec<ActionExecutionCreate>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionExecutionBatchResponse {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "actions_recorded")]
pub actions_recorded: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "action_ids")]
pub action_ids: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueBatch {
#[serde(alias = "issues")]
pub issues: Vec<ExecutionIssueCreate>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueBatchResponse {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "issues_recorded")]
pub issues_recorded: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "issue_ids")]
pub issue_ids: Vec<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueUpdate {
#[serde(default, skip_serializing_if = "Option::is_none", alias = "status")]
pub status: Option<IssueStatus>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "severity")]
pub severity: Option<IssueSeverity>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "assigned_to_user_id"
)]
pub assigned_to_user_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "resolution_notes"
)]
pub resolution_notes: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct VisualComparisonResult {
#[serde(alias = "comparison_id")]
pub comparison_id: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "baseline_id"
)]
pub baseline_id: Option<String>,
#[serde(alias = "similarity_score")]
pub similarity_score: f64,
#[serde(alias = "threshold")]
pub threshold: f64,
#[serde(alias = "passed")]
pub passed: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "diff_image_url"
)]
pub diff_image_url: Option<String>,
#[serde(alias = "diff_region_count")]
pub diff_region_count: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunDetail {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "project_id")]
pub project_id: String,
#[serde(alias = "run_type")]
pub run_type: RunType,
#[serde(alias = "run_name")]
pub run_name: String,
#[serde(alias = "status")]
pub status: RunStatus,
#[serde(alias = "started_at")]
pub started_at: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "ended_at")]
pub ended_at: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "duration_seconds"
)]
pub duration_seconds: Option<f64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "description"
)]
pub description: Option<String>,
#[serde(alias = "runner_metadata")]
pub runner_metadata: RunnerMetadata,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "workflow_metadata"
)]
pub workflow_metadata: Option<WorkflowMetadata>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "configuration"
)]
pub configuration: HashMap<String, Value>,
#[serde(alias = "stats")]
pub stats: ExecutionStats,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "coverage")]
pub coverage: Option<CoverageData>,
#[serde(alias = "created_at")]
pub created_at: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "updated_at")]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueDetail {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "issue_type")]
pub issue_type: IssueType,
#[serde(alias = "severity")]
pub severity: IssueSeverity,
#[serde(alias = "status")]
pub status: IssueStatus,
#[serde(alias = "source")]
pub source: IssueSource,
#[serde(alias = "title")]
pub title: String,
#[serde(alias = "description")]
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "state_name")]
pub state_name: Option<String>,
#[serde(alias = "screenshot_count")]
pub screenshot_count: u32,
#[serde(alias = "created_at")]
pub created_at: String,
#[serde(alias = "updated_at")]
pub updated_at: String,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_sequence_number"
)]
pub action_sequence_number: Option<u32>,
#[serde(
default,
skip_serializing_if = "Vec::is_empty",
alias = "reproduction_steps"
)]
pub reproduction_steps: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "screenshots")]
pub screenshots: Vec<ExecutionScreenshotResponse>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "error_details"
)]
pub error_details: HashMap<String, Value>,
#[serde(default, skip_serializing_if = "HashMap::is_empty", alias = "metadata")]
pub metadata: HashMap<String, Value>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "assigned_to"
)]
pub assigned_to: Option<HashMap<String, Value>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "resolution_notes"
)]
pub resolution_notes: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionRunListResponse {
#[serde(alias = "runs")]
pub runs: Vec<ExecutionRunResponse>,
#[serde(alias = "pagination")]
pub pagination: Pagination,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionExecutionListResponse {
#[serde(alias = "actions")]
pub actions: Vec<ActionExecutionResponse>,
#[serde(alias = "pagination")]
pub pagination: Pagination,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionIssueListResponse {
#[serde(alias = "issues")]
pub issues: Vec<ExecutionIssueResponse>,
#[serde(alias = "pagination")]
pub pagination: Pagination,
#[serde(default, skip_serializing_if = "HashMap::is_empty", alias = "summary")]
pub summary: HashMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ActionReliabilityStats {
#[serde(alias = "action_name")]
pub action_name: String,
#[serde(alias = "action_type")]
pub action_type: ActionType,
#[serde(alias = "total_executions")]
pub total_executions: u32,
#[serde(alias = "successful_executions")]
pub successful_executions: u32,
#[serde(alias = "failed_executions")]
pub failed_executions: u32,
#[serde(alias = "success_rate")]
pub success_rate: f64,
#[serde(alias = "avg_duration_ms")]
pub avg_duration_ms: u64,
#[serde(alias = "p50_duration_ms")]
pub p50_duration_ms: u64,
#[serde(alias = "p95_duration_ms")]
pub p95_duration_ms: u64,
#[serde(
default,
skip_serializing_if = "Vec::is_empty",
alias = "common_errors"
)]
pub common_errors: Vec<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionTrendDataPoint {
#[serde(alias = "date")]
pub date: String,
#[serde(alias = "runs_count")]
pub runs_count: u32,
#[serde(alias = "success_rate")]
pub success_rate: f64,
#[serde(alias = "avg_duration_seconds")]
pub avg_duration_seconds: i64,
#[serde(alias = "total_actions")]
pub total_actions: u32,
#[serde(alias = "issues_count")]
pub issues_count: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ExecutionTrendResponse {
#[serde(alias = "project_id")]
pub project_id: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "run_type")]
pub run_type: Option<RunType>,
#[serde(alias = "start_date")]
pub start_date: String,
#[serde(alias = "end_date")]
pub end_date: String,
#[serde(alias = "granularity")]
pub granularity: String,
#[serde(alias = "data_points")]
pub data_points: Vec<ExecutionTrendDataPoint>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "overall_stats"
)]
pub overall_stats: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ModelCostBreakdown {
#[serde(alias = "model")]
pub model: String,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "provider")]
pub provider: Option<String>,
#[serde(alias = "tokens_input")]
pub tokens_input: u64,
#[serde(alias = "tokens_output")]
pub tokens_output: u64,
#[serde(alias = "cost_usd")]
pub cost_usd: f64,
#[serde(alias = "action_count")]
pub action_count: u32,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct LLMCostSummary {
#[serde(alias = "run_id")]
pub run_id: String,
#[serde(alias = "total_tokens_input")]
pub total_tokens_input: u64,
#[serde(alias = "total_tokens_output")]
pub total_tokens_output: u64,
#[serde(alias = "total_cost_usd")]
pub total_cost_usd: f64,
#[serde(alias = "llm_action_count")]
pub llm_action_count: u32,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "per_model")]
pub per_model: Vec<ModelCostBreakdown>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct CostTrendDataPoint {
#[serde(alias = "date")]
pub date: String,
#[serde(alias = "tokens_input")]
pub tokens_input: u64,
#[serde(alias = "tokens_output")]
pub tokens_output: u64,
#[serde(alias = "cost_usd")]
pub cost_usd: f64,
#[serde(alias = "llm_action_count")]
pub llm_action_count: u32,
#[serde(alias = "runs_count")]
pub runs_count: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct CostTrendResponse {
#[serde(alias = "project_id")]
pub project_id: String,
#[serde(alias = "start_date")]
pub start_date: String,
#[serde(alias = "end_date")]
pub end_date: String,
#[serde(alias = "granularity")]
pub granularity: String,
#[serde(alias = "data_points")]
pub data_points: Vec<CostTrendDataPoint>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "overall_stats"
)]
pub overall_stats: HashMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct HistoricalActionQuery {
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_type"
)]
pub action_type: Option<ActionType>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "action_name"
)]
pub action_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "state_name")]
pub state_name: Option<String>,
#[serde(alias = "success_only")]
pub success_only: bool,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "project_id")]
pub project_id: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "workflow_id"
)]
pub workflow_id: Option<String>,
#[serde(alias = "limit")]
pub limit: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct HistoricalActionResult {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "action_type")]
pub action_type: ActionType,
#[serde(alias = "action_name")]
pub action_name: String,
#[serde(alias = "status")]
pub status: ActionStatus,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "from_state")]
pub from_state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "to_state")]
pub to_state: Option<String>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "input_data"
)]
pub input_data: HashMap<String, Value>,
#[serde(
default,
skip_serializing_if = "HashMap::is_empty",
alias = "output_data"
)]
pub output_data: HashMap<String, Value>,
#[serde(alias = "duration_ms")]
pub duration_ms: u64,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "screenshot_url"
)]
pub screenshot_url: Option<String>,
#[serde(alias = "has_screenshot")]
pub has_screenshot: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct PlaybackFrameRequest {
#[serde(alias = "action_ids")]
pub action_ids: Vec<String>,
#[serde(alias = "include_screenshots")]
pub include_screenshots: bool,
}