1→syntax = "proto3"; 2→package guruconnect; 3→ 4→// ============================================================================ 5→// Session Management 6→// ============================================================================ 7→ 8→message SessionRequest { 9→ string agent_id = 1; 10→ string session_token = 2; 11→ SessionType session_type = 3; 12→ string client_version = 4; 13→} 14→ 15→message SessionResponse { 16→ bool success = 1; 17→ string session_id = 2; 18→ string error = 3; 19→ DisplayInfo display_info = 4; 20→} 21→ 22→enum SessionType { 23→ SCREEN_CONTROL = 0; 24→ VIEW_ONLY = 1; 25→ BACKSTAGE = 2; 26→ FILE_TRANSFER = 3; 27→} 28→ 29→// ============================================================================ 30→// Display Information 31→// ============================================================================ 32→ 33→message DisplayInfo { 34→ repeated Display displays = 1; 35→ int32 primary_display = 2; 36→} 37→ 38→message Display { 39→ int32 id = 1; 40→ string name = 2; 41→ int32 x = 3; 42→ int32 y = 4; 43→ int32 width = 5; 44→ int32 height = 6; 45→ bool is_primary = 7; 46→} 47→ 48→message SwitchDisplay { 49→ int32 display_id = 1; 50→} 51→ 52→// ============================================================================ 53→// Video Frames 54→// ============================================================================ 55→ 56→message VideoFrame { 57→ int64 timestamp = 1; 58→ int32 display_id = 2; 59→ int32 sequence = 3; 60→ 61→ oneof encoding { 62→ RawFrame raw = 10; 63→ EncodedFrame vp9 = 11; 64→ EncodedFrame h264 = 12; 65→ EncodedFrame h265 = 13; 66→ } 67→} 68→ 69→message RawFrame { 70→ int32 width = 1; 71→ int32 height = 2; 72→ bytes data = 3; // Zstd compressed BGRA 73→ bool compressed = 4; 74→ repeated DirtyRect dirty_rects = 5; 75→ bool is_keyframe = 6; // Full frame vs incremental 76→} 77→ 78→message DirtyRect { 79→ int32 x = 1; 80→ int32 y = 2; 81→ int32 width = 3; 82→ int32 height = 4; 83→} 84→ 85→message EncodedFrame { 86→ bytes data = 1; 87→ bool keyframe = 2; 88→ int64 pts = 3; 89→ int64 dts = 4; 90→} 91→ 92→message VideoAck { 93→ int32 sequence = 1; 94→ int64 timestamp = 2; 95→} 96→ 97→// ============================================================================ 98→// Cursor 99→// ============================================================================ 100→ 101→message CursorShape { 102→ uint64 id = 1; 103→ int32 hotspot_x = 2; 104→ int32 hotspot_y = 3; 105→ int32 width = 4; 106→ int32 height = 5; 107→ bytes data = 6; // BGRA bitmap 108→} 109→ 110→message CursorPosition { 111→ int32 x = 1; 112→ int32 y = 2; 113→ bool visible = 3; 114→} 115→ 116→// ============================================================================ 117→// Input Events 118→// ============================================================================ 119→ 120→message MouseEvent { 121→ int32 x = 1; 122→ int32 y = 2; 123→ MouseButtons buttons = 3; 124→ int32 wheel_delta_x = 4; 125→ int32 wheel_delta_y = 5; 126→ MouseEventType event_type = 6; 127→} 128→ 129→enum MouseEventType { 130→ MOUSE_MOVE = 0; 131→ MOUSE_DOWN = 1; 132→ MOUSE_UP = 2; 133→ MOUSE_WHEEL = 3; 134→} 135→ 136→message MouseButtons { 137→ bool left = 1; 138→ bool right = 2; 139→ bool middle = 3; 140→ bool x1 = 4; 141→ bool x2 = 5; 142→} 143→ 144→message KeyEvent { 145→ bool down = 1; // true = key down, false = key up 146→ KeyEventType key_type = 2; 147→ uint32 vk_code = 3; // Virtual key code (Windows VK_*) 148→ uint32 scan_code = 4; // Hardware scan code 149→ string unicode = 5; // Unicode character (for text input) 150→ Modifiers modifiers = 6; 151→} 152→ 153→enum KeyEventType { 154→ KEY_VK = 0; // Virtual key code 155→ KEY_SCAN = 1; // Scan code 156→ KEY_UNICODE = 2; // Unicode character 157→} 158→ 159→message Modifiers { 160→ bool ctrl = 1; 161→ bool alt = 2; 162→ bool shift = 3; 163→ bool meta = 4; // Windows key 164→ bool caps_lock = 5; 165→ bool num_lock = 6; 166→} 167→ 168→message SpecialKeyEvent { 169→ SpecialKey key = 1; 170→} 171→ 172→enum SpecialKey { 173→ CTRL_ALT_DEL = 0; 174→ LOCK_SCREEN = 1; 175→ PRINT_SCREEN = 2; 176→} 177→ 178→// ============================================================================ 179→// Clipboard 180→// ============================================================================ 181→ 182→message ClipboardData { 183→ ClipboardFormat format = 1; 184→ bytes data = 2; 185→ string mime_type = 3; 186→} 187→ 188→enum ClipboardFormat { 189→ CLIPBOARD_TEXT = 0; 190→ CLIPBOARD_HTML = 1; 191→ CLIPBOARD_RTF = 2; 192→ CLIPBOARD_IMAGE = 3; 193→ CLIPBOARD_FILES = 4; 194→} 195→ 196→message ClipboardRequest { 197→ // Request current clipboard content 198→} 199→ 200→// ============================================================================ 201→// Quality Control 202→// ============================================================================ 203→ 204→message QualitySettings { 205→ QualityPreset preset = 1; 206→ int32 custom_fps = 2; // 1-60 207→ int32 custom_bitrate = 3; // kbps 208→ CodecPreference codec = 4; 209→} 210→ 211→enum QualityPreset { 212→ QUALITY_AUTO = 0; 213→ QUALITY_LOW = 1; // Low bandwidth 214→ QUALITY_BALANCED = 2; 215→ QUALITY_HIGH = 3; // Best quality 216→} 217→ 218→enum CodecPreference { 219→ CODEC_AUTO = 0; 220→ CODEC_RAW = 1; // Raw + Zstd (LAN) 221→ CODEC_VP9 = 2; 222→ CODEC_H264 = 3; 223→ CODEC_H265 = 4; 224→} 225→ 226→message LatencyReport { 227→ int64 rtt_ms = 1; 228→ int32 fps = 2; 229→ int32 bitrate_kbps = 3; 230→} 231→ 232→// ============================================================================ 233→// Chat Messages 234→// ============================================================================ 235→ 236→message ChatMessage { 237→ string id = 1; // Unique message ID 238→ string sender = 2; // "technician" or "client" 239→ string content = 3; // Message text 240→ int64 timestamp = 4; // Unix timestamp 241→} 242→ 243→// ============================================================================ 244→// Control Messages 245→// ============================================================================ 246→ 247→message Heartbeat { 248→ int64 timestamp = 1; 249→} 250→ 251→message HeartbeatAck { 252→ int64 client_timestamp = 1; 253→ int64 server_timestamp = 2; 254→} 255→ 256→message Disconnect { 257→ string reason = 1; 258→} 259→ 260→// Server commands agent to start streaming video 261→message StartStream { 262→ string viewer_id = 1; // ID of viewer requesting stream 263→ int32 display_id = 2; // Which display to stream (0 = primary) 264→} 265→ 266→// Server commands agent to stop streaming 267→message StopStream { 268→ string viewer_id = 1; // Which viewer disconnected 269→} 270→ 271→// Agent reports its status periodically when idle 272→message AgentStatus { 273→ string hostname = 1; 274→ string os_version = 2; 275→ bool is_elevated = 3; 276→ int64 uptime_secs = 4; 277→ int32 display_count = 5; 278→ bool is_streaming = 6; 279→ string agent_version = 7; // Agent version (e.g., "0.1.0-abc123") 280→} 281→ 282→// Server commands agent to uninstall itself 283→message AdminCommand { 284→ AdminCommandType command = 1; 285→ string reason = 2; // Why the command was issued 286→} 287→ 288→enum AdminCommandType { 289→ ADMIN_UNINSTALL = 0; // Uninstall agent and remove from startup 290→ ADMIN_RESTART = 1; // Restart the agent process 291→ ADMIN_UPDATE = 2; // Download and install update 292→} 293→ 294→// ============================================================================ 295→// Auto-Update Messages 296→// ============================================================================ 297→ 298→// Update command details (sent with AdminCommand or standalone) 299→message UpdateInfo { 300→ string version = 1; // Target version (e.g., "0.2.0") 301→ string download_url = 2; // HTTPS URL to download new binary 302→ string checksum_sha256 = 3; // SHA-256 hash for verification 303→ bool mandatory = 4; // If true, agent must update immediately 304→} 305→ 306→// Update status report (agent -> server) 307→message UpdateStatus { 308→ string current_version = 1; // Current running version 309→ UpdateState state = 2; // Current update state 310→ string error_message = 3; // Error details if state is FAILED 311→ int32 progress_percent = 4; // Download progress (0-100) 312→} 313→ 314→enum UpdateState { 315→ UPDATE_IDLE = 0; // No update in progress 316→ UPDATE_CHECKING = 1; // Checking for updates 317→ UPDATE_DOWNLOADING = 2; // Downloading new binary 318→ UPDATE_VERIFYING = 3; // Verifying checksum 319→ UPDATE_INSTALLING = 4; // Installing (rename/copy) 320→ UPDATE_RESTARTING = 5; // About to restart 321→ UPDATE_COMPLETE = 6; // Update successful (after restart) 322→ UPDATE_FAILED = 7; // Update failed 323→} 324→ 325→// ============================================================================ 326→// Top-Level Message Wrapper 327→// ============================================================================ 328→ 329→message Message { 330→ oneof payload { 331→ // Session 332→ SessionRequest session_request = 1; 333→ SessionResponse session_response = 2; 334→ 335→ // Video 336→ VideoFrame video_frame = 10; 337→ VideoAck video_ack = 11; 338→ SwitchDisplay switch_display = 12; 339→ 340→ // Cursor 341→ CursorShape cursor_shape = 15; 342→ CursorPosition cursor_position = 16; 343→ 344→ // Input 345→ MouseEvent mouse_event = 20; 346→ KeyEvent key_event = 21; 347→ SpecialKeyEvent special_key = 22; 348→ 349→ // Clipboard 350→ ClipboardData clipboard_data = 30; 351→ ClipboardRequest clipboard_request = 31; 352→ 353→ // Quality 354→ QualitySettings quality_settings = 40; 355→ LatencyReport latency_report = 41; 356→ 357→ // Control 358→ Heartbeat heartbeat = 50; 359→ HeartbeatAck heartbeat_ack = 51; 360→ Disconnect disconnect = 52; 361→ StartStream start_stream = 53; 362→ StopStream stop_stream = 54; 363→ AgentStatus agent_status = 55; 364→ 365→ // Chat 366→ ChatMessage chat_message = 60; 367→ 368→ // Admin commands (server -> agent) 369→ AdminCommand admin_command = 70; 370→ 371→ // Auto-update messages 372→ UpdateInfo update_info = 75; // Server -> Agent: update available 373→ UpdateStatus update_status = 76; // Agent -> Server: update progress 374→ } 375→} 376→ Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.