Enhanced code review and frontend validation with intelligent triggers: Code Review Agent Enhancement: - Added Sequential Thinking MCP integration for complex issues - Triggers on 2+ rejections or 3+ critical issues - New escalation format with root cause analysis - Comprehensive solution strategies with trade-off evaluation - Educational feedback to break rejection cycles - Files: .claude/agents/code-review.md (+308 lines) - Docs: CODE_REVIEW_ST_ENHANCEMENT.md, CODE_REVIEW_ST_TESTING.md Frontend Design Skill Enhancement: - Automatic invocation for ANY UI change - Comprehensive validation checklist (200+ checkpoints) - 8 validation categories (visual, interactive, responsive, a11y, etc.) - 3 validation levels (quick, standard, comprehensive) - Integration with code review workflow - Files: .claude/skills/frontend-design/SKILL.md (+120 lines) - Docs: UI_VALIDATION_CHECKLIST.md (462 lines), AUTOMATIC_VALIDATION_ENHANCEMENT.md (587 lines) Settings Optimization: - Repaired .claude/settings.local.json (fixed m365 pattern) - Reduced permissions from 49 to 33 (33% reduction) - Removed duplicates, sorted alphabetically - Created SETTINGS_PERMISSIONS.md documentation Checkpoint Command Enhancement: - Dual checkpoint system (git + database) - Saves session context to API for cross-machine recall - Includes git metadata in database context - Files: .claude/commands/checkpoint.md (+139 lines) Decision Rationale: - Sequential Thinking MCP breaks rejection cycles by identifying root causes - Automatic frontend validation catches UI issues before code review - Dual checkpoints enable complete project memory across machines - Settings optimization improves maintainability Total: 1,200+ lines of documentation and enhancements Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
381 lines
13 KiB
Plaintext
381 lines
13 KiB
Plaintext
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→
|
|
|
|
<system-reminder>
|
|
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.
|
|
</system-reminder>
|