diff --git a/pi/files/agent/extensions/peon.ts b/pi/files/agent/extensions/peon.ts index 410c8a7..debba85 100644 --- a/pi/files/agent/extensions/peon.ts +++ b/pi/files/agent/extensions/peon.ts @@ -29,9 +29,36 @@ const PACKS_DIR = path.join(process.env.HOME || "~", ".config/openpeon/packs"); const CONFIG_FILE = path.join(process.env.HOME || "~", ".config/openpeon/config.json"); const DEFAULT_PACK = "peon"; const DEBOUNCE_MS = 500; -const REMOTE_HOST = "linux-pc"; // SSH host for remote notifications // ======================================= +// Get the remote host to SSH back to (the machine the user is physically on) +function getRemoteHost(): string | null { + // Try SSH_CONNECTION to get client's IP (format: client_ip client_port server_ip server_port) + const sshConn = process.env.SSH_CONNECTION || ""; + const clientIP = sshConn.split(" ")[0]; + if (clientIP && clientIP !== "::1" && clientIP !== "127.0.0.1") { + return clientIP; + } + + // Fall back to SSH_CLIENT (older format) + const sshClient = process.env.SSH_CLIENT || ""; + const clientIP2 = sshClient.split(" ")[0]; + if (clientIP2 && clientIP2 !== "::1" && clientIP2 !== "127.0.0.1") { + return clientIP2; + } + + return null; +} + +// Map Mac paths to Linux paths for SSH playback +function mapPathToRemote(soundPath: string): string { + // Mac home → Linux home (different username) + if (soundPath.startsWith("/Users/thomasglopes/")) { + return soundPath.replace("/Users/thomasglopes/", "/home/thomasgl/"); + } + return soundPath; +} + // ============ SSH DETECTION ============ function isSSH(): boolean { if ( @@ -168,31 +195,67 @@ function playSoundLocal(soundPath: string, volume: number): void { } } -function playSoundRemote(soundPath: string, volume: number): void { - // Play sound on remote host via SSH - const vol = Math.round(volume * 100); - exec( - `ssh -o ConnectTimeout=2 -o BatchMode=yes ${REMOTE_HOST} "pw-play --volume=${vol} '${soundPath}'" 2>/dev/null || true`, - { timeout: 5000 } - ); -} - function playSound(soundPath: string, volume: number): void { - // Always play locally - playSoundLocal(soundPath, volume); - - // If on SSH, also play remotely - if (isSSH()) { - playSoundRemote(soundPath, volume); + const remoteHost = getRemoteHost(); + + // If in SSH session from Mac, play only on the remote Linux machine (where user physically is) + if (remoteHost && isSSH() && process.platform === "darwin") { + const remotePath = mapPathToRemote(soundPath); + // SSH back to Linux with correct username and mapped path + // pw-play expects volume as 0.0-1.0 float + exec( + `ssh -o ConnectTimeout=2 -o BatchMode=yes thomasgl@${remoteHost} "pw-play --volume=${volume} '${remotePath}' 2>/dev/null" 2>/dev/null || true`, + { timeout: 5000 } + ); + return; // Don't play locally - user is on Linux } + + // If in SSH session from Linux, play only on remote Mac + if (remoteHost && isSSH() && process.platform === "linux") { + const vol = Math.round(volume * 100); + exec( + `ssh -o ConnectTimeout=2 -o BatchMode=yes ${remoteHost} "afplay -v ${vol/100} '${soundPath}' 2>/dev/null" 2>/dev/null || true`, + { timeout: 5000 } + ); + return; // Don't play locally - user is on Mac + } + + // Play locally when not in SSH session + playSoundLocal(soundPath, volume); } function sendNotification(title: string, message: string): void { + const remoteHost = getRemoteHost(); + + // If SSH'd from Mac to Linux, send notification to Linux (where user is) + if (remoteHost && isSSH() && process.platform === "darwin") { + exec( + `ssh -o ConnectTimeout=2 -o BatchMode=yes thomasgl@${remoteHost} "notify-send -i ~/.pi/agent/extensions/assets/pi-logo.svg '${title}' '${message}'" 2>/dev/null || true`, + { timeout: 5000 } + ); + return; + } + + // If SSH'd from Linux to Mac, send notification to Mac (where user is) + if (remoteHost && isSSH() && process.platform === "linux") { + exec( + `ssh -o ConnectTimeout=2 -o BatchMode=yes ${remoteHost} "osascript -e 'display notification \"${message}\" with title \"${title}\"'" 2>/dev/null || true`, + { timeout: 5000 } + ); + return; + } + + // Send locally when not in SSH session if (process.platform === "linux") { exec( `notify-send -i ~/.pi/agent/extensions/assets/pi-logo.svg '${title}' '${message}' 2>/dev/null || true`, { timeout: 5000 } ); + } else if (process.platform === "darwin") { + exec( + `osascript -e 'display notification "${message}" with title "${title}"' 2>/dev/null || true`, + { timeout: 5000 } + ); } }