1use serde::{Deserialize, Serialize};
2
3use crate::ecs::{ChangedEntities, EcsFrame, PageMetadata};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
7pub enum ErrorCode {
8 Unknown = 0,
9 Timeout = 1,
10 TabNotFound = 2,
11 RateLimited = 3,
12 BadRequest = 4,
13 Internal = 5,
14}
15
16#[derive(Serialize, Deserialize, Debug, Clone)]
31pub enum DaemonMessage {
32 Frame { tab_id: u64, frame: EcsFrame, metadata: PageMetadata },
34 FrameDelta { tab_id: u64, sequence_number: u64, scroll_offset: (f32, f32), viewport: (f32, f32), entities: ChangedEntities },
35 Metadata { tab_id: u64, title: String, url: String },
36 Error { tab_id: u64, code: ErrorCode, description: String },
37 EvaluateResult { tab_id: u64, result: String },
38 FoundEntities { tab_id: u64, entities: Vec<EntitySummary> },
39
40 Navigate { tab_id: u64, url: String, format: u8 },
42 Scroll { tab_id: u64, dx: f32, dy: f32 },
43 Click { tab_id: u64, x: f32, y: f32 },
44 Input { tab_id: u64, text: String },
45 Resize { tab_id: u64, width: u32, height: u32 },
46 NewTab { url: Option<String> },
47 CloseTab { tab_id: u64 },
48 GoBack { tab_id: u64 },
49 GoForward { tab_id: u64 },
50 Evaluate { tab_id: u64, js: String, timeout_ms: u32 },
51
52 FindEntities { tab_id: u64, query: EntityQuery },
54 EntitySnapshot { tab_id: u64 },
55 ClickEntity { tab_id: u64, entity_id: u64 },
56 InputEntity { tab_id: u64, entity_id: u64, value: String },
57
58 ActionLog { tab_id: u64, entries: Vec<ActionEntry> },
62
63 ClickSelector { tab_id: u64, query: EntityQuery },
65
66 GetActionLog { tab_id: u64 },
68
69 CompareTabs { tab_a: u64, tab_b: u64 },
71 TabComparison { tab_a: u64, tab_b: u64, summary: String },
73
74 TransferTab { from: u64, to: u64 },
76
77 Health,
79 HealthResult { pid: u32, uptime_secs: u64, rss_kb: u64, connections: u32, version: String },
81
82 ApiKey { key: String },
84 Handshake { version: u32, capabilities: Vec<String> },
86}
87
88#[derive(Serialize, Deserialize, Debug, Clone)]
90pub struct ActionEntry {
91 pub sequence: u64,
92 pub action: String,
93 pub target_id: u64,
94 pub value: String,
95 pub timestamp: u64,
96 pub entity_count: u32,
97}
98
99#[derive(Serialize, Deserialize, Debug, Clone)]
101pub struct EntityQuery {
102 pub role: Option<String>,
103 pub tag: Option<String>,
104 pub intent: Option<String>,
105 pub text_contains: Option<String>,
106 pub label: Option<String>,
107 pub limit: Option<u16>,
108}
109
110#[derive(Serialize, Deserialize, Debug, Clone)]
112pub struct EntitySummary {
113 pub id: u64,
114 pub tag: String,
115 pub text: String,
116 pub role: String,
117 pub href: String,
118 pub classes: String,
119 pub intent: String,
120 pub is_interactive: bool,
121 pub parent_id: u64,
122}