use serde::{Deserialize, Serialize};
use crate::ecs::{ChangedEntities, EcsFrame, PageMetadata};
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorCode {
Unknown = 0,
Timeout = 1,
TabNotFound = 2,
RateLimited = 3,
BadRequest = 4,
Internal = 5,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum DaemonMessage {
Frame { tab_id: u64, frame: EcsFrame, metadata: PageMetadata },
FrameDelta { tab_id: u64, sequence_number: u64, scroll_offset: (f32, f32), viewport: (f32, f32), entities: ChangedEntities },
Metadata { tab_id: u64, title: String, url: String },
Error { tab_id: u64, code: ErrorCode, description: String },
EvaluateResult { tab_id: u64, result: String },
FoundEntities { tab_id: u64, entities: Vec<EntitySummary> },
Navigate { tab_id: u64, url: String, format: u8 },
Scroll { tab_id: u64, dx: f32, dy: f32 },
Click { tab_id: u64, x: f32, y: f32 },
Input { tab_id: u64, text: String },
Resize { tab_id: u64, width: u32, height: u32 },
NewTab { url: Option<String> },
CloseTab { tab_id: u64 },
GoBack { tab_id: u64 },
GoForward { tab_id: u64 },
Evaluate { tab_id: u64, js: String, timeout_ms: u32 },
FindEntities { tab_id: u64, query: EntityQuery },
EntitySnapshot { tab_id: u64 },
ClickEntity { tab_id: u64, entity_id: u64 },
InputEntity { tab_id: u64, entity_id: u64, value: String },
ActionLog { tab_id: u64, entries: Vec<ActionEntry> },
ClickSelector { tab_id: u64, query: EntityQuery },
GetActionLog { tab_id: u64 },
CompareTabs { tab_a: u64, tab_b: u64 },
TabComparison { tab_a: u64, tab_b: u64, summary: String },
TransferTab { from: u64, to: u64 },
Health,
HealthResult { pid: u32, uptime_secs: u64, rss_kb: u64, connections: u32, version: String },
ApiKey { key: String },
Handshake { version: u32, capabilities: Vec<String> },
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ActionEntry {
pub sequence: u64,
pub action: String,
pub target_id: u64,
pub value: String,
pub timestamp: u64,
pub entity_count: u32,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct EntityQuery {
pub role: Option<String>,
pub tag: Option<String>,
pub intent: Option<String>,
pub text_contains: Option<String>,
pub label: Option<String>,
pub limit: Option<u16>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct EntitySummary {
pub id: u64,
pub tag: String,
pub text: String,
pub role: String,
pub href: String,
pub classes: String,
pub intent: String,
pub is_interactive: bool,
pub parent_id: u64,
}