app
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
← Commit history
Publish 1.9.85
9 files changed
+324−29
README.md+66−28@@ -1,59 +1,97 @@ # Adom Desktop -A Tauri v2 desktop application for Windows that bridges Adom's cloud AI tools to local desktop applications: KiCad, Fusion 360, real Chrome (Puppeteer), native shell, file transfer, screenshots, notifications β plus a Hydrogen Desktop proxy. One install gives Claude every desktop verb it needs.+**The bridge between a cloud AI and your real Windows desktop.** A Claude agent in an Adom container β or Hydrogen Desktop running locally β connects to Adom Desktop over an encrypted relay and drives your *actual* machine: your signed-in browser, KiCad, Fusion 360, the shell, files, window automation, screenshots. **Bridges** extend that reach to any app. You stay in control β every command is visible in the Activity Log, side-effecting commands can be gated behind a one-click approval, and it binds to `127.0.0.1` only, so nothing off your machine can reach it. -## Install (in an Adom container)+++- π₯οΈ **Full desktop control** β windows, input, screenshots, UI Automation, the shell, files, the registry, WSL.+- π **Bridges** β first-class mini-apps: Puppeteer (browser), KiCad, Fusion 360, your real signed-in browser, Blender, or your own.+- π **You're in control** β localhost-only, an install-consent trust model, a visible activity log, and an approval gate for the remote cloud-AI path.+- π **Multi-machine** β one relay can hold many desktops; address any of them by name, or fan a command out to all.+- π **Self-updating & signed** β every release is Azure code-signed and auto-updates from this page.++## How it works++++The cloud AI never touches your machine directly. It sends a verb to the **relay**; Adom Desktop β connected out to that relay from your desktop β executes it against Windows or forwards it to a bridge, and streams the result back. A co-resident sibling app (Hydrogen Desktop) can skip the relay and POST straight to the **loopback HTTP API** at `127.0.0.1`. ```-adompkg install adom-desktop+Adom container (this package) User's laptop+ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ+β adom-desktop CLI + skillsβ β relay β β Adom Desktop GUI (Tauri) β+β (Claude drives verbs) β β KiCad Β· Fusion Β· Chrome β+ββββββββββββββββββββββββββββ β shell Β· files Β· screens β+ ββββββββββββββββββββββββββββ ``` -That installs the **container-side** pieces:+## Install (in an Adom container)++```+adom-wiki pkg install adom/adom-desktop+``` -- the `adom-desktop` CLI binary (downloaded from this page's blob store, SHA256-verified against the bundled `version.json`)-- the Claude skill bundle into `~/.claude/skills/`:+That installs the **container-side** pieces β the `adom-desktop` CLI (SHA256-verified against this page's `version.json`) and the Claude skill bundle into `~/.claude/skills/`: | Skill | What Claude learns | |---|---| | `adom-desktop` | the main verb catalog β screenshots, files, shell, windows, notifications | | `adom-desktop-pup` | real-Chrome (Puppeteer) automation: sessions, tabs, eval, recording | | `adom-desktop-notify` | native Windows toasts β progress bars, sticky reminders, buttons that round-trip |-| `adom-desktop-bridge-sdk` | author your own bridge: bridge.json, health/describe/rich-hint contracts, lifecycle verbs |+| `adom-desktop-bridge-sdk` | author your own bridge: `bridge.json`, health/describe/rich-hint contracts, lifecycle | | `adom-desktop-bridge-ownership` | the boundary β what AD core owns vs what a bridge author owns | | `adom-desktop-multi-ad` | address multiple Adom Desktops on one relay (`--target`, fan-out) |-| `adom-desktop-eagle` | EAGLE commands for Fusion 360 Electronics (`fusion_electron_run`) | | `adom-desktop-direct-api` | the loopback HTTP API for sibling apps |-| `adom-desktop-installer` | how to drive the Windows installer (silent flags, logs) |-| `adom-desktop-windows-host` | driving the Windows host from Claude Code (AppContainer sandbox escape) |-| `adom-desktop-discovery` | how a fresh container finds + refreshes the CLI |+| `adom-desktop-installer` Β· `adom-desktop-windows-host` Β· `adom-desktop-discovery` | install/host/discovery details | -> The **KiCad** and **Fusion 360** bridge skills (`adom-desktop-kicad`, `adom-desktop-fusion`) install from their own cloud-owned bridge pages, not this bundle.+`adom-wiki pkg update` keeps it current. The **KiCad** and **Fusion 360** bridge skills install from their own cloud-owned bridge pages. -## What it looks like+## The laptop GUI -The desktop app, connected to two containers, with the bridge bar and live activity log:+The **Windows GUI** installs separately β a signed NSIS installer served from this page (*Download for your machine* above; Hydrogen Desktop installs it automatically). It installs to `%LOCALAPPDATA%\Adom Desktop\`, adds a tray icon, starts on login, and **auto-updates itself** from this page's `version.json` (prompt by default; every 4h + on launch). -+The main window (top) puts everything on one surface β **Connections** (each relay + the other Adom Desktops on it as peers), the **Activity Log** (every command, badged by source + type, filterable), the **Bridges sidebar** (installed bridges as mini-app cards), the provisioned **Runtimes**, and the footer approval bar. -Driving KiCad end-to-end from the container β symbol, footprint, 3D model, schematic, board, gerbers:+## Bridges -+ -The **laptop-side GUI** installs separately on the user's Windows machine β a signed NSIS installer served from this page (the package manifest's `assets` map / `version.json` carry the exact URL + SHA256; Hydrogen Desktop's setup installs it automatically). Once installed, the GUI auto-updates itself from the wiki's `version.json` manifest (prompt by default, every 4h + on launch).+Each bridge is a small, independently-versioned process the app spawns, supervises, health-checks, and auto-updates from its own wiki page: -## How it fits together+| Bridge | What it drives |+|---|---|+| **Puppeteer** (`browser_*`) | A dedicated Chrome-for-Testing (or Edge) β open, drive, screenshot, record. |+| **Native Browser** (`nbrowser_*`) | Your *real* signed-in Chrome/Edge profile, for logins & forms. |+| **KiCad** (`kicad_*`) | Schematic + PCB automation, DRC/ERC, gerber/STEP export, 3D render. |+| **Fusion 360** (`fusion_*`) + **APS** (`aps_*`) | Modeling scripts, exports, indexed cloud-file search. |+| **Blender** (`blender_*`) | Headless Python scripting + renders. |+| **Hydrogen Desktop** (`hd_*`) | The local dev-environment app AD can embed into. | -```-Adom container (this package) User's laptop-ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ-β adom-desktop CLI + skillsβ β relay β β Adom Desktop GUI (Tauri) β-β (Claude drives verbs) β β KiCad Β· Fusion Β· Chrome β-ββββββββββββββββββββββββββββ β shell Β· files Β· screens β- ββββββββββββββββββββββββββββ+Install a third-party bridge by pasting its manifest URL, or `bridge_install {"manifestUrl":"β¦"}`. Build one with the [Bridge SDK](https://wiki.adom.inc/adom/adom-desktop-bridges).++## Security & the approval gate++++**The trust boundary is install-consent + the localhost bind.** Installing the app (and each bridge) is you granting permission for the AI to drive your machine β if you don't want that, uninstall. And the app plus every bridge binds `127.0.0.1` **only, never `0.0.0.0`**, so a caller must already be a program you installed on your own machine to reach it. No network attack surface by construction.++On top of that, the **remote cloud-AI path is approval-gated.** Verbs that run code or change the machine (`shell_execute`, `run_script`, `launch_process`, `write_file`, `registry_*`, `process_kill`, β¦) require a human grant when they arrive over the *relay* β **+1hr / +24hr** (time-boxed), **Bypass** (indefinite), or **Revoke**. The grant is human-only; local callers (your CLI, HD, bridges) are trusted by transport and never prompt; read-only verbs are never gated.++## Verbs++++AD-core owns the generic verbs (`desktop_*`, `shell`, `ui_*`, files, `notify_user`, multi-AD). Each bridge owns its own prefix and ships its own verbs; the app relays them verbatim and stays generic. Invoke the same way on every transport, for identical JSON back:++```bash+adom-desktop screenshot_window '{"hwnd": 12345}' # CLI (relay / direct API)+adom-desktop --target AzureVM list_windows # target a named machine+curl -s -X POST 127.0.0.1:47200/command \+ -d '{"command":"notify_user","args":{"title":"Hi"}}' # loopback direct API ``` -The CLI talks to the user's GUI over the Adom relay (or the direct HTTP API when co-resident). Verbs: `desktop_*`, `browser_*` (pup), `kicad_*`, `fusion_*`, `hd_*`, `shell_execute`, file transfer, and more β run `adom-desktop help` after install.+`adom-desktop help` and `GET /commands` are the live discovery surfaces for the full verb set. ## Versioning -This adompkg version tracks the Adom Desktop release version (`X.Y.Z`). The package itself is a small scaffold; the multi-MB binaries live as blobs on this page and are fetched at install time with SHA256 verification β the package manifest's `assets` map carries server-computed checksums per platform.+This package version tracks the Adom Desktop release. The scaffold is small; the multi-MB binaries are fetched at install time with SHA256 verification (the manifest's `assets` map carries server-computed checksums per platform).
docs/approve-bar.pngadded⋯ 1 unchanged line ⋯
docs/arch-flow.svgadded+161@@ -0,0 +1,161 @@+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1120 1440" font-family="'Familjen Grotesk','Satoshi',-apple-system,'Segoe UI',sans-serif">+ <defs>+ <marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">+ <path d="M0 0 L10 5 L0 10 z" fill="#2dd4bf"/>+ </marker>+ <marker id="arrUp" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">+ <path d="M0 0 L10 5 L0 10 z" fill="#64748b"/>+ </marker>+ <style>+ .box{rx:14;stroke-width:1.5}+ .h{fill:#e2e8f0;font-weight:700}+ .t{fill:#94a3b8;font-size:14px}+ .mono{font-family:'JetBrains Mono',ui-monospace,monospace;fill:#5eead4;font-size:12.5px}+ .lbl{fill:#64748b;font-size:12px;font-style:italic}+ .tier{fill:#2dd4bf;font-size:12px;font-weight:700;letter-spacing:2px}+ </style>+ </defs>++ <rect x="0" y="0" width="1120" height="1440" fill="#0b0f14"/>+ <text x="560" y="46" text-anchor="middle" class="h" font-size="26">Adom Desktop β how it works</text>+ <text x="560" y="72" text-anchor="middle" class="t">One local bridge between Adom's cloud AI and your Windows machine Β· v1.9.79</text>++ <!-- TIER 1: CLOUD -->+ <rect x="360" y="100" width="400" height="72" rx="14" fill="#0e1a2b" stroke="#1e3a5f"/>+ <text x="560" y="132" text-anchor="middle" class="h" font-size="16">Adom Cloud β Claude Code / AI</text>+ <text x="560" y="154" text-anchor="middle" class="t">runs in your Docker workspace container</text>++ <!-- arrow 1->2 -->+ <line x1="560" y1="172" x2="560" y2="212" stroke="#2dd4bf" stroke-width="2" marker-end="url(#arr)"/>+ <line x1="600" y1="212" x2="600" y2="172" stroke="#64748b" stroke-width="1.3" marker-end="url(#arrUp)"/>+ <text x="620" y="196" class="lbl">commands, files, notifications β results</text>++ <!-- TIER 2: RELAY -->+ <rect x="300" y="216" width="520" height="86" rx="14" fill="#101826" stroke="#334155"/>+ <text x="560" y="246" text-anchor="middle" class="h" font-size="16">Adom Relay Β· Docker (e.g. galliaApril)</text>+ <text x="560" y="268" text-anchor="middle" class="t">routes by <tspan class="mono">clientName</tspan> β one relay β many desktops</text>+ <text x="560" y="288" text-anchor="middle" class="mono">--target <name> Β· --target all Β· ambiguous_target guard</text>++ <!-- arrow 2->3 -->+ <line x1="560" y1="302" x2="560" y2="344" stroke="#2dd4bf" stroke-width="2" marker-end="url(#arr)"/>+ <text x="580" y="328" class="lbl">WebSocket wss:// (auth: clientName + token, 15s keepalive)</text>++ <!-- TIER 3: ADOM DESKTOP -->+ <rect x="40" y="348" width="1040" height="516" rx="18" fill="#0d1420" stroke="#2dd4bf" stroke-width="2"/>+ <text x="64" y="384" class="h" font-size="19">ADOM DESKTOP</text>+ <text x="235" y="384" class="t">Tauri v2 Β· Rust Β· signed Β· runs in your tray</text>++ <!-- INBOUND column -->+ <text x="70" y="420" class="tier">βΈ WHAT CONNECTS TO AD</text>+ <g>+ <rect x="70" y="432" width="470" height="70" rx="10" fill="#111c2e" stroke="#1e3a5f"/>+ <text x="86" y="458" class="h" font-size="14">Relay WS client</text>+ <text x="86" y="480" class="t">the cloud path β ws_client.rs, auto-reconnect <5s</text>+ <text x="86" y="496" class="mono">wss:// β relay β cloud AI</text>++ <rect x="70" y="510" width="470" height="70" rx="10" fill="#111c2e" stroke="#1e3a5f"/>+ <text x="86" y="536" class="h" font-size="14">Direct HTTP API</text>+ <text x="86" y="558" class="t">sibling apps (Hydrogen Desktop) + the CLI's auto-route</text>+ <text x="86" y="574" class="mono">127.0.0.1:47200 (host.docker.internal:47200 from HD's container)</text>++ <rect x="70" y="588" width="470" height="70" rx="10" fill="#111c2e" stroke="#1e3a5f"/>+ <text x="86" y="614" class="h" font-size="14">Control API β sugar routes</text>+ <text x="86" y="636" class="t">HD drives embedded mode + AD's auto-update</text>+ <text x="86" y="652" class="mono">POST /embedded/enterΒ·release /update/statusΒ·checkΒ·apply</text>++ <rect x="70" y="666" width="470" height="70" rx="10" fill="#111c2e" stroke="#1e3a5f"/>+ <text x="86" y="692" class="h" font-size="14">TCP tunnels + RDP</text>+ <text x="86" y="714" class="t">reach a cloud-only service through the laptop</text>+ <text x="86" y="730" class="mono">127.0.0.1:<port> β relay β upstream Β· tunnel open|rdp</text>+ </g>++ <!-- OUTBOUND column -->+ <text x="586" y="420" class="tier">βΈ WHAT AD DRIVES</text>+ <g>+ <rect x="586" y="432" width="470" height="150" rx="10" fill="#0f1d1a" stroke="#134e4a"/>+ <text x="602" y="458" class="h" font-size="14">Your Windows OS Β· core verbs</text>+ <text x="602" y="482" class="mono">shell / run_script / wsl_exec</text>+ <text x="602" y="502" class="mono">send_files Β· pull_file</text>+ <text x="602" y="522" class="mono">screenshot_window Β· screenshot_screen</text>+ <text x="602" y="542" class="mono">ui_click Β· click Β· type Β· press_key (UIA + SendInput)</text>+ <text x="602" y="562" class="mono">notify_user (toasts) Β· tray Β· caption Β· taskbar</text>++ <rect x="586" y="590" width="470" height="68" rx="10" fill="#0f1d1a" stroke="#134e4a"/>+ <text x="602" y="616" class="h" font-size="14">Managed runtimes Β· no UAC, no firewall</text>+ <text x="602" y="638" class="t">AD provisions Node + Python for bridges</text>+ <text x="602" y="654" class="mono">system-first, else portable download β ~/.adom/adom-runtimes</text>++ <rect x="586" y="666" width="470" height="70" rx="10" fill="#0f1d1a" stroke="#134e4a"/>+ <text x="602" y="692" class="h" font-size="14">Bridges Β· spawned children</text>+ <text x="602" y="714" class="t">routed by verb prefix β HTTP on a stable internal port</text>+ <text x="602" y="730" class="mono">127.0.0.1:<ephemeral> Β· ADOM_BIND_HOST=127.0.0.1</text>+ </g>++ <!-- arrow 3->4 -->+ <line x1="820" y1="736" x2="820" y2="792" stroke="#2dd4bf" stroke-width="2" marker-end="url(#arr)"/>+ <text x="840" y="770" class="lbl">spawns + supervises Β· stable port Β· auto-update from the wiki</text>++ <!-- TIER 4: BRIDGES -->+ <text x="70" y="912" class="tier">βΈ BRIDGES (each ships its own verbs; see the core-vs-bridge diagram)</text>+ <g font-size="13">+ <!-- pup -->+ <rect x="40" y="928" width="200" height="118" rx="12" fill="#101826" stroke="#334155"/>+ <text x="58" y="954" class="h">Puppeteer</text>+ <text x="58" y="974" class="t">Node Β· AD-owned</text>+ <text x="58" y="996" class="t" font-size="12">drives a fresh</text>+ <text x="58" y="1012" class="t" font-size="12">automation browser</text>+ <text x="58" y="1034" class="mono" font-size="11">browser_*</text>++ <!-- kicad -->+ <rect x="256" y="928" width="200" height="118" rx="12" fill="#101826" stroke="#334155"/>+ <text x="274" y="954" class="h">KiCad</text>+ <text x="274" y="974" class="t">Python Β· cloud-owned</text>+ <text x="274" y="996" class="t" font-size="12">7/8/9/10 side-by-side</text>+ <text x="274" y="1012" class="t" font-size="12">EDA automation</text>+ <text x="274" y="1034" class="mono" font-size="11">kicad_*</text>++ <!-- fusion -->+ <rect x="472" y="928" width="200" height="118" rx="12" fill="#101826" stroke="#334155"/>+ <text x="490" y="954" class="h">Fusion 360</text>+ <text x="490" y="974" class="t">Python Β· cloud-owned</text>+ <text x="490" y="996" class="t" font-size="12">CAD + EAGLE PCB</text>+ <text x="490" y="1012" class="t" font-size="12">+ APS cloud search</text>+ <text x="490" y="1034" class="mono" font-size="11">fusion_* Β· aps_*</text>++ <!-- native-browser -->+ <rect x="688" y="928" width="200" height="118" rx="12" fill="#101826" stroke="#334155"/>+ <text x="706" y="954" class="h">Native browser</text>+ <text x="706" y="974" class="t">extension Β· cloud-owned</text>+ <text x="706" y="996" class="t" font-size="12">your REAL Chrome/Edge</text>+ <text x="706" y="1012" class="t" font-size="12">β logged-in sessions</text>+ <text x="706" y="1034" class="mono" font-size="11">nbrowser_*</text>++ <!-- hd -->+ <rect x="904" y="928" width="176" height="118" rx="12" fill="#101826" stroke="#334155"/>+ <text x="922" y="954" class="h">Hydrogen</text>+ <text x="922" y="974" class="t">external-http</text>+ <text x="922" y="996" class="t" font-size="12">proxies HD's</text>+ <text x="922" y="1012" class="t" font-size="12">control API</text>+ <text x="922" y="1034" class="mono" font-size="11">hd_*</text>+ </g>+ <text x="40" y="1076" class="t" font-size="13">+ third-party bridges installed with <tspan class="mono">bridge_install {manifestUrl}</tspan> β same contract, auto-updated from their own wiki page.</text>++ <!-- ENDPOINTS LEGEND -->+ <rect x="40" y="1110" width="1040" height="290" rx="16" fill="#0d1420" stroke="#334155"/>+ <text x="64" y="1146" class="h" font-size="17">Exposed endpoints (all loopback / localhost only)</text>+ <g font-size="13">+ <text x="64" y="1182" class="mono" font-size="14">127.0.0.1:47200</text>+ <text x="330" y="1182" class="t">Direct HTTP API β <tspan class="mono" font-size="12">POST /command</tspan>, <tspan class="mono" font-size="12">GET /status</tspan>, <tspan class="mono" font-size="12">GET /ping</tspan>. Sibling apps + the CLI auto-route here.</text>+ <text x="64" y="1214" class="mono" font-size="14">127.0.0.1:47200</text>+ <text x="330" y="1214" class="t">Control sugar β <tspan class="mono" font-size="12">/embedded/enterΒ·release</tspan>, <tspan class="mono" font-size="12">/update/statusΒ·checkΒ·apply</tspan>. HD drives these.</text>+ <text x="64" y="1246" class="mono" font-size="14">127.0.0.1:47210</text>+ <text x="330" y="1246" class="t">ad-relauncher HTTP β swap-binary-and-restart state (dev/update path).</text>+ <text x="64" y="1278" class="mono" font-size="14">127.0.0.1:<stable></text>+ <text x="330" y="1278" class="t">Per-bridge HTTP β internal, persisted to <tspan class="mono" font-size="12">~/.adom/bridge-ports.json</tspan>. Callers never touch it; go through verbs.</text>+ <text x="64" y="1310" class="mono" font-size="14">127.0.0.1:<dynamic></text>+ <text x="330" y="1310" class="t">Tunnel listeners β one per open tunnel; bytes pumped over the relay WS to a cloud-side upstream.</text>+ <text x="64" y="1342" class="mono" font-size="14">wss:// (outbound)</text>+ <text x="330" y="1342" class="t">Relay client β AD dials OUT to the cloud relay; nothing inbound from the internet. Discovery file: <tspan class="mono" font-size="12">~/.adom/direct-api-port</tspan>.</text>+ <text x="64" y="1378" class="lbl" font-size="12.5">Ports are picked ephemerally and written to discovery files β never hardcoded (Hyper-V/Docker silently reserve fixed ranges). See skills/PORTS.md.</text>+ </g>+</svg>
docs/bridge-cards-pup-fusion.pngadded⋯ 1 unchanged line ⋯
docs/core-vs-bridge.svgadded+96@@ -0,0 +1,96 @@+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1120 900" font-family="'Familjen Grotesk','Satoshi',-apple-system,'Segoe UI',sans-serif">+ <defs>+ <marker id="a2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">+ <path d="M0 0 L10 5 L0 10 z" fill="#2dd4bf"/>+ </marker>+ <style>+ .h{fill:#e2e8f0;font-weight:700}+ .t{fill:#94a3b8;font-size:13px}+ .mono{font-family:'JetBrains Mono',ui-monospace,monospace;font-size:12.5px}+ .tier{font-size:12px;font-weight:700;letter-spacing:2px}+ </style>+ </defs>+ <rect x="0" y="0" width="1120" height="900" fill="#0b0f14"/>+ <text x="560" y="46" text-anchor="middle" class="h" font-size="25">Core verbs vs bridge verbs β the line of demarcation</text>+ <text x="560" y="72" text-anchor="middle" class="t">AD OWNS + IMPLEMENTS core verbs. For bridge verbs, AD is a transparent RELAY β it routes by prefix and forwards args verbatim.</text>++ <!-- CORE side -->+ <rect x="40" y="100" width="480" height="710" rx="18" fill="#0f1d1a" stroke="#134e4a" stroke-width="2"/>+ <text x="64" y="138" class="tier" fill="#2dd4bf">βΈ AD CORE (AD implements these)</text>+ <text x="64" y="162" class="t">Built into the Tauri app. Touch the OS directly. Gated verbs need shell-approval.</text>++ <g class="mono" fill="#5eead4">+ <text x="64" y="200" class="h" font-size="14" fill="#e2e8f0">Desktop / OS</text>+ <text x="64" y="224">desktop_list_windows Β· screenshot_window Β· screenshot_screen</text>+ <text x="64" y="246">desktop_click Β· type Β· press_key Β· hover Β· cursor (SendInput)</text>+ <text x="64" y="268">desktop_ui_click Β· ui_set Β· find_control Β· ui_tree (UIA)</text>+ <text x="64" y="290">desktop_open_url Β· open_folder Β· bring_to_front Β· find_window</text>+ <text x="64" y="312">caption Β· taskbar Β· flash_window Β· display</text>++ <text x="64" y="352" class="h" font-size="14" fill="#e2e8f0">Shell / scripts (gated)</text>+ <text x="64" y="376">shell_execute Β· run_script Β· wsl_exec Β· wsl_exec_async</text>+ <text x="64" y="398">wsl_recover Β· wsl_import Β· wsl_export Β· wsl_list</text>++ <text x="64" y="438" class="h" font-size="14" fill="#e2e8f0">Files</text>+ <text x="64" y="462">send_files Β· pull_file</text>++ <text x="64" y="502" class="h" font-size="14" fill="#e2e8f0">Notify / approvals</text>+ <text x="64" y="526">notify_user Β· notify_response Β· shell_auto_approve Β· revoke_approvals</text>++ <text x="64" y="566" class="h" font-size="14" fill="#e2e8f0">Connectivity</text>+ <text x="64" y="590">server_add Β· server_list Β· targets Β· tunnel (open|rdp|check)</text>++ <text x="64" y="630" class="h" font-size="14" fill="#e2e8f0">Bridge lifecycle (AD manages the bridges)</text>+ <text x="64" y="654">bridge_install Β· bridge_list Β· bridge_info Β· bridge_kill</text>+ <text x="64" y="676">refresh_bridges Β· bridge_check_updates Β· restart_bridge Β· runtimes</text>++ <text x="64" y="716" class="h" font-size="14" fill="#e2e8f0">Sibling apps</text>+ <text x="64" y="740">aps_* (Autodesk cloud OAuth β AD-native) Β· timeouts Β· commands</text>+ </g>+ <text x="64" y="784" class="t" font-size="12">These never leave AD β no bridge involved. AD authors their result + <tspan class="mono">_hint</tspan>.</text>++ <!-- THE LINE -->+ <line x1="560" y1="110" x2="560" y2="800" stroke="#334155" stroke-width="2" stroke-dasharray="6 6"/>+ <rect x="500" y="420" width="120" height="60" rx="10" fill="#0b0f14" stroke="#2dd4bf"/>+ <text x="560" y="446" text-anchor="middle" class="h" font-size="13">route by</text>+ <text x="560" y="466" text-anchor="middle" class="mono" fill="#5eead4" font-size="13">verbPrefix</text>++ <!-- BRIDGE side -->+ <rect x="600" y="100" width="480" height="710" rx="18" fill="#101826" stroke="#334155" stroke-width="2"/>+ <text x="624" y="138" class="tier" fill="#93c5fd">βΈ BRIDGE VERBS (the bridge implements these)</text>+ <text x="624" y="162" class="t">AD forwards the FULL args object verbatim to the bridge over HTTP. AD never</text>+ <text x="624" y="180" class="t">strips, reshapes, or interprets them β the bridge validates + owns its verbs.</text>++ <g>+ <rect x="624" y="200" width="432" height="86" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="226" class="h" font-size="14">Puppeteer Β· AD-owned</text>+ <text x="642" y="248" class="mono" fill="#93c5fd">browser_open_window Β· navigate Β· eval Β· screenshot Β· record_*</text>+ <text x="642" y="270" class="t">β a fresh Chrome-for-Testing (or your Edge) automation browser</text>++ <rect x="624" y="298" width="432" height="86" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="324" class="h" font-size="14">KiCad Β· cloud-owned</text>+ <text x="642" y="346" class="mono" fill="#93c5fd">kicad_open_board Β· install_symbol Β· run_drc Β· export_*</text>+ <text x="642" y="368" class="t">β KiCad 7/8/9/10 side-by-side</text>++ <rect x="624" y="396" width="432" height="86" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="422" class="h" font-size="14">Fusion 360 Β· cloud-owned</text>+ <text x="642" y="444" class="mono" fill="#93c5fd">fusion_start Β· import_step Β· export_gerbers Β· board_info Β· walk_cloud_tree</text>+ <text x="642" y="466" class="t">β Fusion 360 CAD + EAGLE electronics</text>++ <rect x="624" y="494" width="432" height="86" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="520" class="h" font-size="14">Native browser Β· cloud-owned (extension)</text>+ <text x="642" y="542" class="mono" fill="#93c5fd">nbrowser_open Β· nbrowser_eval Β· nbrowser_status</text>+ <text x="642" y="564" class="t">β your REAL logged-in Chrome / Edge</text>++ <rect x="624" y="592" width="432" height="70" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="618" class="h" font-size="14">Hydrogen Desktop Β· external-http</text>+ <text x="642" y="640" class="mono" fill="#93c5fd">hd_status Β· hd_api Β· hd_launch Β· hd_ship</text>+ <text x="642" y="656" class="t">β relays HD's own control API</text>++ <rect x="624" y="672" width="432" height="88" rx="10" fill="#0d1420" stroke="#334155"/>+ <text x="642" y="698" class="h" font-size="14">Third-party Β· bridge_install</text>+ <text x="642" y="720" class="mono" fill="#93c5fd"><prefix>_* (blender_* Β· rdp_* Β· anything you publish)</text>+ <text x="642" y="742" class="t">β same contract; declares detect / timeouts / statusVerb in bridge.json</text>+ </g>+ <text x="624" y="792" class="t" font-size="12">A bridge adds/renames args with ZERO AD change. See skills/BRIDGE_SDK.md.</text>+</svg>
docs/main-view.pngadded⋯ 1 unchanged line ⋯
docs/runtimes.pngadded⋯ 1 unchanged line ⋯
docs/settings.pngadded⋯ 1 unchanged line ⋯
page.json+1−1@@ -1,6 +1,6 @@ { "slug": "adom-desktop",- "version": "1.9.84",+ "version": "1.9.85", "type": "app", "description": "Laptop bridge: file transfer, screenshots, notifications, KiCad + Fusion 360 control, real-Chrome (Puppeteer) automation, and Hydrogen Desktop proxy. One install gives Claude every desktop verb it needs.", "keywords": [