C:\Users\MikeSwanson\claude-projects\guru-connect\server\Cargo.toml:44:jsonwebtoken = "9" C:\Users\MikeSwanson\claude-projects\guru-connect\agent\Cargo.toml:63: "Win32_UI_Input_KeyboardAndMouse", C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\config.rs:15: /// JWT secret for authentication C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\config.rs:16: pub jwt_secret: Option, C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\config.rs:28: jwt_secret: env::var("JWT_SECRET").ok(), C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\config.rs:41: jwt_secret: None, C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:3://! Handles JWT validation for dashboard users and API key C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:19:/// Authenticated agent from API key C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:53:/// Validate an agent API key (placeholder for MVP) C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:54:pub fn validate_agent_key(_api_key: &str) -> Option { C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:55: // TODO: Implement actual API key validation C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\auth\mod.rs:56: // For MVP, accept any key C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:13: /// Agent API key for authentication C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:14: pub api_key: String, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:114: let api_key = std::env::var("GURUCONNECT_API_KEY") C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:115: .unwrap_or_else(|_| "dev-key".to_string()); C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:119: api_key, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\config.rs:184:api_key = "your-agent-api-key" C:\Users\MikeSwanson\claude-projects\guru-connect\server\src\relay\mod.rs:166: Some(proto::message::Payload::KeyEvent(_)) => { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:1://! Keyboard input simulation using Windows SendInput API C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:6:use windows::Win32::UI::Input::KeyboardAndMouse::{ C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:7: SendInput, INPUT, INPUT_0, INPUT_KEYBOARD, KEYBD_EVENT_FLAGS, KEYEVENTF_EXTENDEDKEY, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:8: KEYEVENTF_KEYUP, KEYEVENTF_SCANCODE, KEYEVENTF_UNICODE, KEYBDINPUT, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:9: MapVirtualKeyW, MAPVK_VK_TO_VSC_EX, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:12:/// Keyboard input controller C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:13:pub struct KeyboardController { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:27:impl KeyboardController { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:28: /// Create a new keyboard controller C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:35: /// Press a key down by virtual key code C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:37: pub fn key_down(&mut self, vk_code: u16) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:38: self.send_key(vk_code, true) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:41: /// Release a key by virtual key code C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:43: pub fn key_up(&mut self, vk_code: u16) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:44: self.send_key(vk_code, false) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:47: /// Send a key event C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:49: fn send_key(&mut self, vk_code: u16, down: bool) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:50: // Get scan code from virtual key C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:51: let scan_code = unsafe { MapVirtualKeyW(vk_code as u32, MAPVK_VK_TO_VSC_EX) as u16 }; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:53: let mut flags = KEYBD_EVENT_FLAGS::default(); C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:55: // Add extended key flag for certain keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:56: if Self::is_extended_key(vk_code) || (scan_code >> 8) == 0xE0 { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:57: flags |= KEYEVENTF_EXTENDEDKEY; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:61: flags |= KEYEVENTF_KEYUP; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:65: r#type: INPUT_KEYBOARD, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:67: ki: KEYBDINPUT { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:68: wVk: windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY(vk_code), C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:89: // Key down C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:91: r#type: INPUT_KEYBOARD, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:93: ki: KEYBDINPUT { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:94: wVk: windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY(0), C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:96: dwFlags: KEYEVENTF_UNICODE, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:103: // Key up C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:105: r#type: INPUT_KEYBOARD, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:107: ki: KEYBDINPUT { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:108: wVk: windows::Win32::UI::Input::KeyboardAndMouse::VIRTUAL_KEY(0), C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:110: dwFlags: KEYEVENTF_UNICODE | KEYEVENTF_KEYUP, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:137: // For now, we'll attempt to send the key combination C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:159: // Fallback: Try sending the keys (won't work without proper privileges) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:167: // Press keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:168: self.key_down(VK_CONTROL)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:169: self.key_down(VK_MENU)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:170: self.key_down(VK_DELETE)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:172: // Release keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:173: self.key_up(VK_DELETE)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:174: self.key_up(VK_MENU)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:175: self.key_up(VK_CONTROL)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:180: /// Check if a virtual key code is an extended key C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:182: fn is_extended_key(vk: u16) -> bool { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:185: 0x21..=0x28 | // Page Up, Page Down, End, Home, Arrow keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:187: 0x5B | 0x5C | // Left/Right Windows keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:188: 0x5D | // Applications key C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:212: pub fn key_down(&mut self, _vk_code: u16) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:213: anyhow::bail!("Keyboard input only supported on Windows") C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:217: pub fn key_up(&mut self, _vk_code: u16) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:218: anyhow::bail!("Keyboard input only supported on Windows") C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:223: anyhow::bail!("Keyboard input only supported on Windows") C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:232:/// Common Windows virtual key codes C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:256: // 0-9 keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:257: pub const KEY_0: u16 = 0x30; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:258: pub const KEY_9: u16 = 0x39; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:260: // A-Z keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:261: pub const KEY_A: u16 = 0x41; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:262: pub const KEY_Z: u16 = 0x5A; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:264: // Windows keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:268: // Function keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\keyboard.rs:282: // Modifier keys C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:19: /// Force keyframe on next encode C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:20: force_keyframe: bool, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:39: force_keyframe: true, // Start with keyframe C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:153: let is_keyframe = self.force_keyframe || self.previous_frame.is_none(); C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:154: self.force_keyframe = false; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:156: let (data_to_compress, dirty_rects, full_frame) = if is_keyframe { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:157: // Keyframe: send full frame C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:169: is_keyframe: false, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:205: is_keyframe: full_frame, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:221: is_keyframe: full_frame, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:225: fn request_keyframe(&mut self) { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\raw.rs:226: self.force_keyframe = true; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\mod.rs:25: /// Whether this is a keyframe (full frame) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\mod.rs:26: pub is_keyframe: bool, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\mod.rs:34: /// Request a keyframe on next encode C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\encoder\mod.rs:35: fn request_keyframe(&mut self); C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mouse.rs:7:use windows::Win32::UI::Input::KeyboardAndMouse::{ C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:62: &self.config.api_key, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:175: Some(message::Payload::KeyEvent(key)) => { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:176: // Handle keyboard event C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:177: input.key_event(key.vk_code as u16, key.down)?; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:180: Some(message::Payload::SpecialKey(special)) => { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:181: use crate::proto::SpecialKey; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:182: match SpecialKey::try_from(special.key).ok() { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\session\mod.rs:183: Some(SpecialKey::CtrlAltDel) => { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:3://! Handles mouse and keyboard input simulation using Windows SendInput API. C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:6:mod keyboard; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:9:pub use keyboard::KeyboardController; C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:13:/// Combined input controller for mouse and keyboard C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:16: keyboard: KeyboardController, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:24: keyboard: KeyboardController::new()?, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:33: /// Get keyboard controller C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:34: pub fn keyboard(&mut self) -> &mut KeyboardController { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:35: &mut self.keyboard C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:57: /// Press or release a key C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:58: pub fn key_event(&mut self, vk_code: u16, down: bool) -> Result<()> { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:60: self.keyboard.key_down(vk_code) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:62: self.keyboard.key_up(vk_code) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:68: self.keyboard.type_char(ch) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\input\mod.rs:73: self.keyboard.send_sas() C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:32: pub async fn connect(url: &str, api_key: &str, agent_id: &str, agent_name: &str) -> Result { C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:34: // Server expects: agent_id (required), agent_name (optional), api_key (for auth) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:36: format!("{}&agent_id={}&agent_name={}&api_key={}", url, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:39: urlencoding::encode(api_key)) C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:41: format!("{}?agent_id={}&agent_name={}&api_key={}", url, C:\Users\MikeSwanson\claude-projects\guru-connect\agent\src\transport\websocket.rs:44: urlencoding::encode(api_key)) C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:48: "js-tokens": "^4.0.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:772: "eslint-visitor-keys": "^3.4.3" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:784: "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:786: "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1739: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1778: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1823: "@typescript-eslint/visitor-keys": "8.50.0" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1899: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1980: "node_modules/@typescript-eslint/visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1982: "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:1988: "eslint-visitor-keys": "^4.2.1" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2336: "path-key": "^3.1.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2566: "eslint-visitor-keys": "^4.2.1", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2648: "node_modules/eslint-visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2650: "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2670: "eslint-visitor-keys": "^4.2.1" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:2802: "keyv": "^4.5.4" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3130: "node_modules/js-tokens": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3132: "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3197: "node_modules/keyv": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3199: "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3690: "node_modules/path-key": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3692: "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\package-lock.json:3703: "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:15: "js-tokens": "^4.0.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:764: "eslint-visitor-keys": "^3.4.3" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:776: "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:778: "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:1762: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:1801: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:1846: "@typescript-eslint/visitor-keys": "8.50.0" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:1922: "@typescript-eslint/visitor-keys": "8.50.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2003: "node_modules/@typescript-eslint/visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2005: "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2011: "eslint-visitor-keys": "^4.2.1" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2359: "path-key": "^3.1.0", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2589: "eslint-visitor-keys": "^4.2.1", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2671: "node_modules/eslint-visitor-keys": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2673: "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2693: "eslint-visitor-keys": "^4.2.1" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:2825: "keyv": "^4.5.4" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3154: "node_modules/js-tokens": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3156: "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3221: "node_modules/keyv": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3223: "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3724: "node_modules/path-key": { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3726: "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\node_modules\.package-lock.json:3737: "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\App.tsx:13:import { ApiKeys } from "./pages/ApiKeys"; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\App.tsx:151: path="/api-keys" C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\App.tsx:154: C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:8:import type { MouseEvent, KeyEvent, VideoFrame } from '../types/protocol'; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:13:const MSG_KEY_EVENT = 21; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:49: * Encode a key event to binary format C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:51:export function encodeKeyEvent(event: KeyEvent): Uint8Array { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:56: view.setUint8(0, MSG_KEY_EVENT); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:58: // Key down/up C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:61: // Key type C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:62: view.setUint8(2, event.keyType); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:64: // Virtual key code C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:113: // Is keyframe C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:114: const isKeyframe = view.getUint8(20) === 1; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:133: isKeyframe, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\lib\protobuf.ts:145: keyframe: isKeyframe, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:12:export type SessionType = (typeof SessionType)[keyof typeof SessionType]; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:16: sessionToken: string; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:56: isKeyframe: boolean; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:61: keyframe: boolean; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:81:export type MouseEventType = (typeof MouseEventType)[keyof typeof MouseEventType]; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:100:export const KeyEventType = { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:101: KEY_VK: 0, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:102: KEY_SCAN: 1, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:103: KEY_UNICODE: 2, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:105:export type KeyEventType = (typeof KeyEventType)[keyof typeof KeyEventType]; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:116:export interface KeyEvent { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\types\protocol.ts:118: keyType: KeyEventType; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:14:// Add auth token to requests C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:16: const token = localStorage.getItem("token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:17: if (token) { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:18: config.headers.Authorization = `Bearer ${token}`; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:28: localStorage.removeItem("token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:61: api_key?: string; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:75:export interface ApiKey { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:78: key?: string; // Only returned on creation C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:79: key_preview?: string; // Masked version for display C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:86: password: string; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:91: password: string; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:96: token: string; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:107: changePassword: (data: { current_password: string; new_password: string }) => C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:108: api.post("/api/auth/change-password", data), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:110: exchangeRmmToken: (rmmToken: string) => C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:111: api.post("/api/auth/rmm/token", { token: rmmToken }), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:128: regenerateKey: (id: string) => api.post<{ api_key: string }>(`/api/agents/${id}/regenerate-key`), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:135: create: (data: { email: string; password?: string; name?: string; role?: string; org_id?: string }) => C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:152:// API Keys C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:153:export const apiKeysApi = { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:154: list: () => api.get("/api/api-keys"), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:155: create: (name: string) => api.post("/api/api-keys", { name }), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\api\client.ts:156: delete: (id: string) => api.delete(`/api/api-keys/${id}`), C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:6:import type { ConnectionStatus, VideoFrame, MouseEvent as ProtoMouseEvent, KeyEvent as ProtoKeyEvent, Modifiers } from '../types/protocol'; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:8:import { encodeMouseEvent, encodeKeyEvent, decodeVideoFrame } from '../lib/protobuf'; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:22: sendKeyEvent: (event: ProtoKeyEvent) => void; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:156: // Send key event C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:157: const sendKeyEvent = useCallback((event: ProtoKeyEvent) => { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:159: const data = encodeKeyEvent(event); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:176: sendKeyEvent, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:214: * Helper to create key event from DOM keyboard event C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:216:export function createKeyEvent( C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:217: domEvent: React.KeyboardEvent, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:219:): ProtoKeyEvent { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:221: ctrl: domEvent.ctrlKey, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:222: alt: domEvent.altKey, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:223: shift: domEvent.shiftKey, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:224: meta: domEvent.metaKey, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:229: // Use key code for special keys, unicode for regular characters C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:230: const isCharacter = domEvent.key.length === 1; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:234: keyType: isCharacter ? 2 : 0, // KEY_UNICODE or KEY_VK C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:235: vkCode: domEvent.keyCode, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useRemoteSession.ts:237: unicode: isCharacter ? domEvent.key : undefined, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:8: token: string | null; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:11: login: (email: string, password: string) => Promise; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:12: register: (email: string, password: string, name?: string) => Promise; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:13: loginWithRmmToken: (rmmToken: string) => Promise; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:22: const rmmToken = params.get("rmm_token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:23: const isIntegrated = !!rmmToken || localStorage.getItem("auth_mode") === "integrated"; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:29: const [token, setToken] = useState(() => localStorage.getItem("token")); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:33: // Check for RMM token in URL on mount C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:36: const rmmToken = params.get("rmm_token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:38: if (rmmToken) { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:39: // Clear the token from URL C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:43: // Exchange RMM token C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:44: loginWithRmmToken(rmmToken).catch((err) => { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:45: console.error("Failed to exchange RMM token:", err); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:48: } else if (token) { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:49: // Validate existing token C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:54: localStorage.removeItem("token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:55: setToken(null); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:63: const login = async (email: string, password: string) => { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:64: const res = await authApi.login({ email, password }); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:65: localStorage.setItem("token", res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:67: setToken(res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:71: const register = async (email: string, password: string, name?: string) => { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:72: const res = await authApi.register({ email, password, name }); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:73: localStorage.setItem("token", res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:75: setToken(res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:79: const loginWithRmmToken = async (rmmToken: string) => { C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:81: const res = await authApi.exchangeRmmToken(rmmToken); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:82: localStorage.setItem("token", res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:84: setToken(res.data.token); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:92: localStorage.removeItem("token"); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:94: setToken(null); C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:102: token, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\hooks\useAuth.tsx:107: loginWithRmmToken, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\components\SessionControls.tsx:4: * Toolbar for controlling the remote session (quality, displays, special keys) C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\components\SessionControls.tsx:16: onSpecialKey?: (key: 'ctrl-alt-del' | 'lock-screen' | 'print-screen') => void; C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\components\SessionControls.tsx:26: onSpecialKey, C:\Users\MikeSwanson\claude-projects\guru-connect\dashboard\src\components\SessionControls.tsx:60: