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)]
pub enum StandardActionType {
#[serde(rename = "click")]
Click,
#[serde(rename = "doubleClick")]
DoubleClick,
#[serde(rename = "rightClick")]
RightClick,
#[serde(rename = "type")]
Type,
#[serde(rename = "clear")]
Clear,
#[serde(rename = "select")]
Select,
#[serde(rename = "focus")]
Focus,
#[serde(rename = "blur")]
Blur,
#[serde(rename = "hover")]
Hover,
#[serde(rename = "scroll")]
Scroll,
#[serde(rename = "check")]
Check,
#[serde(rename = "uncheck")]
Uncheck,
#[serde(rename = "toggle")]
Toggle,
#[serde(rename = "setValue")]
SetValue,
#[serde(rename = "drag")]
Drag,
#[serde(rename = "submit")]
Submit,
#[serde(rename = "reset")]
Reset,
#[serde(rename = "wait")]
Wait,
#[serde(rename = "navigate")]
Navigate,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct Point {
pub x: f64,
pub y: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum ScrollDirection {
Up,
Down,
Left,
Right,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(untagged)]
pub enum TransitionActionValue {
Single(String),
Multiple(Vec<String>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct TransitionAction {
#[serde(rename = "type")]
pub action_type: StandardActionType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub clear_first: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub type_delay: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<TransitionActionValue>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub select_by_label: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delay_ms: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scroll_direction: Option<ScrollDirection>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scroll_amount: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drag_target: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drag_target_position: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drag_steps: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drag_hold_delay: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub drag_html5: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub button: Option<MouseButton>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub position: Option<Point>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct DomainKnowledge {
pub id: String,
pub title: String,
pub content: String,
pub tags: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineConfig {
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub render_count: u64,
pub element_count: u64,
pub include_html_ids: bool,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineConfigCreate {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineConfigUpdate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
pub struct StateMachineConfigFull {
#[serde(flatten)]
pub config: StateMachineConfig,
pub states: Vec<StateMachineState>,
pub transitions: Vec<StateMachineTransition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineState {
pub id: String,
pub config_id: String,
pub state_id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub element_ids: Vec<String>,
pub render_ids: Vec<String>,
pub confidence: f64,
pub acceptance_criteria: Vec<String>,
pub extra_metadata: HashMap<String, Value>,
pub domain_knowledge: Vec<DomainKnowledge>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineStateCreate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state_id: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub element_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub render_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub acceptance_criteria: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extra_metadata: Option<HashMap<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub domain_knowledge: Option<Vec<DomainKnowledge>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineStateUpdate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub element_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub render_ids: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confidence: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub acceptance_criteria: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extra_metadata: Option<HashMap<String, Value>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub domain_knowledge: Option<Vec<DomainKnowledge>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineTransition {
pub id: String,
pub config_id: String,
pub transition_id: String,
pub name: String,
pub from_states: Vec<String>,
pub activate_states: Vec<String>,
pub exit_states: Vec<String>,
pub actions: Vec<TransitionAction>,
pub path_cost: f64,
pub stays_visible: bool,
pub extra_metadata: HashMap<String, Value>,
pub created_at: String,
pub updated_at: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineTransitionCreate {
pub name: String,
pub from_states: Vec<String>,
pub activate_states: Vec<String>,
pub exit_states: Vec<String>,
pub actions: Vec<TransitionAction>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path_cost: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stays_visible: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extra_metadata: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineTransitionUpdate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from_states: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub activate_states: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exit_states: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub actions: Option<Vec<TransitionAction>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path_cost: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stays_visible: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extra_metadata: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct PathfindingRequest {
pub from_states: Vec<String>,
pub target_states: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct PathfindingStep {
pub transition_id: String,
pub transition_name: String,
pub from_states: Vec<String>,
pub activate_states: Vec<String>,
pub exit_states: Vec<String>,
pub path_cost: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct PathfindingResult {
pub found: bool,
pub steps: Vec<PathfindingStep>,
pub total_cost: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct TransitionExecutionResult {
pub success: bool,
pub transition_id: String,
pub active_states: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct NavigationResult {
pub success: bool,
pub path: Vec<String>,
pub active_states: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub target_state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub results: Option<Vec<NavigationResult>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct ActiveStatesResult {
pub success: bool,
pub active_states: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub current_state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state_history: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct TransitionInfo {
pub id: String,
pub from_state: String,
#[serde(default)]
pub to_state: Option<String>,
pub workflows: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct AvailableTransitionsResult {
pub success: bool,
pub transitions: Vec<TransitionInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub current_state: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum InitialStatesSource {
Defaults,
Workflow,
Override,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct InitialStateRef {
pub id: String,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ResolvedInitialStates {
pub state_ids: Vec<String>,
pub source: InitialStatesSource,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub states: Option<Vec<InitialStateRef>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub workflow_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct ResolvedInitialStatesResult {
pub success: bool,
pub state_ids: Vec<String>,
pub source: InitialStatesSource,
pub states: Vec<InitialStateRef>,
pub workflow_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum DiscoveryStrategy {
Auto,
Fingerprint,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct StateNodeData {
pub state_id: String,
pub name: String,
pub element_count: u64,
pub confidence: f64,
pub element_ids: Vec<String>,
pub description: Option<String>,
pub is_blocking: bool,
pub is_selected: bool,
pub is_initial: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub outgoing_count: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub incoming_count: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_drop_target: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub element_thumbnails: Option<HashMap<String, String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct TransitionEdgeData {
pub transition_id: String,
pub name: String,
pub path_cost: f64,
pub action_count: u64,
pub action_types: Vec<StandardActionType>,
pub is_highlighted: bool,
pub stays_visible: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub first_action_target: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
#[schemars(deny_unknown_fields)]
pub struct StateMachineExportFormat {
pub states: HashMap<String, HashMap<String, Value>>,
pub transitions: HashMap<String, HashMap<String, Value>>,
pub config: HashMap<String, Value>,
}