← Commit history
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)+![Adom Desktop main window](docs/main-view.png)++- πŸ–₯️ **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++![Architecture](docs/arch-flow.svg)++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). -![Adom Desktop GUI](docs/screenshot-gui.png)+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 -![KiCad driven by Adom Desktop](docs/screenshot-kicad.png)+![Bridge cards](docs/bridge-cards-pup-fusion.png) -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++![Shell approval bar](docs/approve-bar.png)++**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++![Core vs bridge verbs](docs/core-vs-bridge.svg)++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 &lt;name&gt;  Β·  --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 &lt;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:&lt;port&gt; ⇄ 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:&lt;ephemeral&gt;  Β·  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:&lt;stable&gt;</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:&lt;dynamic&gt;</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">&lt;prefix&gt;_*   (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": [