syntax = "proto3"; package guruconnect; // ============================================================================ // Session Management // ============================================================================ message SessionRequest { string agent_id = 1; string session_token = 2; SessionType session_type = 3; string client_version = 4; } message SessionResponse { bool success = 1; string session_id = 2; string error = 3; DisplayInfo display_info = 4; } enum SessionType { SCREEN_CONTROL = 0; VIEW_ONLY = 1; BACKSTAGE = 2; FILE_TRANSFER = 3; } // ============================================================================ // Display Information // ============================================================================ message DisplayInfo { repeated Display displays = 1; int32 primary_display = 2; } message Display { int32 id = 1; string name = 2; int32 x = 3; int32 y = 4; int32 width = 5; int32 height = 6; bool is_primary = 7; } message SwitchDisplay { int32 display_id = 1; } // ============================================================================ // Video Frames // ============================================================================ message VideoFrame { int64 timestamp = 1; int32 display_id = 2; int32 sequence = 3; oneof encoding { RawFrame raw = 10; EncodedFrame vp9 = 11; EncodedFrame h264 = 12; EncodedFrame h265 = 13; } } message RawFrame { int32 width = 1; int32 height = 2; bytes data = 3; // Zstd compressed BGRA bool compressed = 4; repeated DirtyRect dirty_rects = 5; bool is_keyframe = 6; // Full frame vs incremental } message DirtyRect { int32 x = 1; int32 y = 2; int32 width = 3; int32 height = 4; } message EncodedFrame { bytes data = 1; bool keyframe = 2; int64 pts = 3; int64 dts = 4; } message VideoAck { int32 sequence = 1; int64 timestamp = 2; } // ============================================================================ // Cursor // ============================================================================ message CursorShape { uint64 id = 1; int32 hotspot_x = 2; int32 hotspot_y = 3; int32 width = 4; int32 height = 5; bytes data = 6; // BGRA bitmap } message CursorPosition { int32 x = 1; int32 y = 2; bool visible = 3; } // ============================================================================ // Input Events // ============================================================================ message MouseEvent { int32 x = 1; int32 y = 2; MouseButtons buttons = 3; int32 wheel_delta_x = 4; int32 wheel_delta_y = 5; MouseEventType event_type = 6; } enum MouseEventType { MOUSE_MOVE = 0; MOUSE_DOWN = 1; MOUSE_UP = 2; MOUSE_WHEEL = 3; } message MouseButtons { bool left = 1; bool right = 2; bool middle = 3; bool x1 = 4; bool x2 = 5; } message KeyEvent { bool down = 1; // true = key down, false = key up KeyEventType key_type = 2; uint32 vk_code = 3; // Virtual key code (Windows VK_*) uint32 scan_code = 4; // Hardware scan code string unicode = 5; // Unicode character (for text input) Modifiers modifiers = 6; } enum KeyEventType { KEY_VK = 0; // Virtual key code KEY_SCAN = 1; // Scan code KEY_UNICODE = 2; // Unicode character } message Modifiers { bool ctrl = 1; bool alt = 2; bool shift = 3; bool meta = 4; // Windows key bool caps_lock = 5; bool num_lock = 6; } message SpecialKeyEvent { SpecialKey key = 1; } enum SpecialKey { CTRL_ALT_DEL = 0; LOCK_SCREEN = 1; PRINT_SCREEN = 2; } // ============================================================================ // Clipboard // ============================================================================ message ClipboardData { ClipboardFormat format = 1; bytes data = 2; string mime_type = 3; } enum ClipboardFormat { CLIPBOARD_TEXT = 0; CLIPBOARD_HTML = 1; CLIPBOARD_RTF = 2; CLIPBOARD_IMAGE = 3; CLIPBOARD_FILES = 4; } message ClipboardRequest { // Request current clipboard content } // ============================================================================ // Quality Control // ============================================================================ message QualitySettings { QualityPreset preset = 1; int32 custom_fps = 2; // 1-60 int32 custom_bitrate = 3; // kbps CodecPreference codec = 4; } enum QualityPreset { QUALITY_AUTO = 0; QUALITY_LOW = 1; // Low bandwidth QUALITY_BALANCED = 2; QUALITY_HIGH = 3; // Best quality } enum CodecPreference { CODEC_AUTO = 0; CODEC_RAW = 1; // Raw + Zstd (LAN) CODEC_VP9 = 2; CODEC_H264 = 3; CODEC_H265 = 4; } message LatencyReport { int64 rtt_ms = 1; int32 fps = 2; int32 bitrate_kbps = 3; } // ============================================================================ // Control Messages // ============================================================================ message Heartbeat { int64 timestamp = 1; } message HeartbeatAck { int64 client_timestamp = 1; int64 server_timestamp = 2; } message Disconnect { string reason = 1; } // ============================================================================ // Top-Level Message Wrapper // ============================================================================ message Message { oneof payload { // Session SessionRequest session_request = 1; SessionResponse session_response = 2; // Video VideoFrame video_frame = 10; VideoAck video_ack = 11; SwitchDisplay switch_display = 12; // Cursor CursorShape cursor_shape = 15; CursorPosition cursor_position = 16; // Input MouseEvent mouse_event = 20; KeyEvent key_event = 21; SpecialKeyEvent special_key = 22; // Clipboard ClipboardData clipboard_data = 30; ClipboardRequest clipboard_request = 31; // Quality QualitySettings quality_settings = 40; LatencyReport latency_report = 41; // Control Heartbeat heartbeat = 50; HeartbeatAck heartbeat_ack = 51; Disconnect disconnect = 52; } }