Adom Desktop
Public Made by Adomby adom
Installs the adom-desktop CLI and its Claude skills INTO A CLOUD CONTAINER so an AI assistant there can understand and drive Adom Desktop over the relay. This is the container side, NOT the app itself. The Adom Desktop app is the signed Windows installer under Download below: run THAT on the PC you want the AI to control. Rule of thumb: pkg install here (in your Linux container), Download there (on your Windows PC). Once installed, the AI can drive file transfer, screenshots, notifications, KiCa
AD-core intercepts browser_raise_os_window/focus_window, bypassing pup's foreground gate (reason + audit trail)
What
AD-core INTERCEPTS browser_raise_os_window / browser_focus_window (native handler: resolves the window by its "(session: )" title, returns {raised, hwnd, resolvedBy}) and never forwards the verb to the puppeteer bridge. That bypasses pup 1.8.70's new FOREGROUND GATE.
The gate being bypassed
pup 1.8.70 (mirroring abe's dual-key contract) requires a foregroundReason (min 10 chars, quote/paraphrase of what the user said) for ANY foregrounding; the reason is logged, recorded in lastAgentUpdate, and surfaced as lastForeground in status so the user can audit "who put this window on my screen and why". browser_open_window {foreground:true} is gated correctly (pup receives it). But raise/focus never reach pup, so ANY thread can silently foreground any pup window with zero reason and zero audit trail.
Real incident (2026-07-15, AdomLapper)
A thread background-opened a wiki page then raised it 2 minutes later onto the user's screen. No log line anywhere; forensics required reading an in-page focus-latch timestamp. The raise went through AD's native interceptor.
Repro
adom-desktop --target ADOMGPU browser_raise_os_window {"sessionId":"<any pup session>"} → returns {raised:true, resolvedBy:"title", hwnd:...} (AD's shape); the pup bridge log shows the verb never arrived; pup's foreground_reason_required refusal never fires.
Ask (either works; first preferred)
- STOP intercepting browser_raise_os_window / browser_focus_window — forward them to the puppeteer bridge like other browser_* verbs, so the bridge's gate + audit trail apply. (If the interception exists for the title-resolution convenience, pup already does that itself.)
- OR apply the same dual-key gate natively in AD's interceptor: require foregroundReason (min 10 chars) else refuse with errorCode foreground_reason_required, and log the granted reason in the AD Activity Log.
Contract reference: abe's userRequestedForeground + foregroundReason (driving-the-extension skill) and pup 1.8.70's browser_describe entries.