# adom-desktop features the native-browser bridge needs

Running tracker of AD fixes/features surfaced while building this bridge. Status as of 2026-06-19.

## Shipped
- **1.8.148** — WGC per-window recorder (`desktop_record_window_*`); foreground-steal fix;
  spawn-storm backoff; `send_files` honors `dest`; `pull_file` path resolution.
- **1.8.149** — control-API discovery contract (`ADOM_DIRECT_API_URL` env injected into spawned
  bridges; `~/.adom/direct-api-port` = `host:port`); `bridge_install` cache-lock retry.
- Containment **Phase 1** green-lit (kill-switch + `--safe-mode` + crash-loop guard + headroom gate).

## Open — first-class verbs to kill `shell_execute` inline-quoting friction
The #1 time-sink integrating this bridge is shell-quoting through JSON→bash→cmd→PowerShell.
Each verb below replaces a class of quoting pain hit repeatedly this session:
1. **`run_script`** {interpreter: powershell|cmd|node|python, body, args?, cwd?} → {stdout,stderr,exitCode}.
   AD writes `body` to a temp file + runs it. THE big one — I currently `send_files` a `.ps1` then
   `shell_execute -File` it as a workaround, every time.
2. **`read_file` / `write_file`** (text or base64, absolute path, resolved in AD's own context —
   fixes intermittent `%USERPROFILE%` non-expansion in `shell_execute`).
3. **`registry_get/set/delete`** (HKCU/HKLM) — replaces `reg query/add/delete` backslash-escaping
   (native-messaging host registration was painful + error-prone).
4. **`process_list`** {nameFilter?, pidFilter?} → [{pid,name,commandLine,parentPid,handles,memory}].
   Replaces `tasklist`/`wmic`/`Get-Process`; `wmic` CommandLine returned empty (privilege). Needed
   the whole incident debug. (Also feeds the Phase-2 watchdog.)
5. **`process_kill`** {pid|name}.
6. **`net_stats`** → {tcpTotal, listening, established, timeWait, ephemeralHeadroom, perPid:{...}}.
   Replaces `netstat`/`Get-NetTCPConnection` counting; identical to what the containment watchdog needs.
7. **`launch_process`** {path, args:[], env?, cwd?, window?} → {pid}. Args as an ARRAY (no quoted-string
   parsing); replaces `Start-Process` arg-array pain.

## Open — bridge lifecycle question
- Does AD keep an on-demand-spawned bridge **alive**, or tear it down when idle with no connected
  client? The `native-browser` bridge must **persist** so the Chrome-launched native host can dial it
  (host.json port). Observed: after an `nbrowser_*` call the bridge process is gone (node=0), which
  may be why the extension's host can't establish a steady connection. Need the contract.

## Bridge-side TODO (mine, not AD)
- Wire `ADOM_DIRECT_API_URL` env discovery (1.8.149 contract) into the bridge's `discoverAdDirectPort`.
- Harden the host singleton: a stale `host.pid` whose PID was **reused** by a non-host process caused
  every new host to exit (false positive). Verify the incumbent PID is actually a node/native-host
  process before deferring; otherwise take over.
