Adom Bridge
Public Made by Adomby adom
Adom Bridge unleashes your AI onto your full PC: full power, full safety. The AI breaks out of the container it runs in and onto your real machine, managing and running your entire laptop as you: launch apps, move files, drive any window, control KiCad, Fusion 360 or your real signed-in browser. Works with any AI, cloud or local (Claude Desktop, Claude Code, Codex), no Hydrogen required. Bridge and its bridges are an operating system for AI, with managed Node and Python runtimes, and a human-onl
Bridges need a VERIFIED local-vs-relay origin signal (and a shared consent primitive) for credential-reveal verbs
pup just shipped pup_credential_reveal (pup-bridge v2.0.368), a per-host plaintext credential reveal for LOCAL desktop assistants (the Grok Bot use case: it calls adom-bridge-cli natively on the desktop and sometimes needs a saved login from the adom-you vault). Building it exposed one gap only ab can close, plus one pattern worth copying back into credhelper.
The gap: pup cannot verify local vs relayed
pup's verb refuses relayed callers with relay_forbidden, but the only signal it has is X-Adom-Caller-Container, which is SELF-REPORTED attribution. Verified live today (ab 2.0.95, pup 2.0.368, target AdomLapper): a genuine container-relayed call sailed past the check because no container header arrived at pup, and it STILL arrived empty when the caller exported ADOM_CONTAINER_NAME before the call. So today a bridge cannot see container identity even when the caller volunteers it, let alone when it lies. ab is the one component that knows the verified transport: it holds the relay websocket, so it knows with certainty whether a /command arrived over the relay or from a local process. pup's relay_forbidden is therefore a tripwire, not a boundary; the real gate is the user's consent click on a toast. ab already enforces true local-only for desktop_decrypt_browser_credentials, so the knowledge exists, it just isn't exported to bridges.
Ask 1: a verified origin header
Stamp a verified origin on every /command ab forwards to a bridge, e.g. X-Adom-Verified-Origin: relay | local (set by ab itself, stripped/overwritten if a caller supplies it). Then any bridge can enforce local-only honestly, the way ab does internally, instead of trusting self-reported caller headers.
Ask 2: a shared consent primitive
pup hand-rolled its consent gate out of notify_user {buttons, wait:true, scenario:"reminder"}: a sticky toast naming the caller, the host, the username and the caller's stated reason, with Reveal/Deny buttons and a 120s timeout, secret released only on an explicit Reveal click. That works, but every bridge that needs consent will reinvent it with different wording and different failure modes. Consider a first-class consent_request {title, body, scope, timeoutSec} verb: blocking, returns the click, standard look, standard audit line. Then every reveal/permission moment across the fleet looks identical to the user, which is what trains them to actually read it.
One thing worth copying FROM pup into credhelper
desktop_decrypt_browser_credentials returns the ENTIRE browser store per call. pup's verb is deliberately one host per call, never bulk: the caller must name the host and a reason (min 10 chars), both shown verbatim on the consent toast, and gets exactly one credential back. A per-host scope on credhelper would let a user approve exactly what an assistant needs and nothing more, and would make the consent dialog say something a human can actually evaluate ("reveal github.com login" vs "decrypt all browser passwords").
Context: pup's audit line logs host, username, caller and decision but never the secret; the response carries a _hint telling the caller the secret was released once and must never be logged or echoed.