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
ab assigns bridge ports inside Windows RESERVED port ranges, then crash-loops forever (pup dead on AdomLapper today)
On John's AdomLapper today, the puppeteer bridge went permanently down and every pup_* verb failed. Root cause is on ab's side of the boundary (ab owns port assignment and the supervisor).
What happened
- ab assigned
runtimePort: 64230to the puppeteer bridge (manifestPort: 0, so ab picked it). - Windows has that port inside a reserved exclusion range. From the machine:
netsh int ipv4 show excludedportrange protocol=tcp
63860 63959
63960 64059
64060 64159
64160 64259 <-- 64230 lives here
64278 64377
These blocks are grabbed at boot by Hyper-V / WinNAT (WSL2, Docker, and the Windows container stack all trigger it), so which ports are reserved changes from boot to boot.
- The bridge therefore got
EACCESonlisten, exited, ab respawned it on the same port, and it failed again. After 3 failures ab went into backoff:Failed to spawn bridge 'puppeteer': bridge 'puppeteer' is backing off after 3 fa....bridge_pause+bridge_resumedid not re-pick the port (runtimePortstayed 64230), so there is no user-visible recovery short of an elevatednet stop winnat && net start winnator a reboot.
Asks (ab side)
- Avoid reserved ranges when assigning a port. Read
netsh int ipv4 show excludedportrange protocol=tcp(or callGetExtendedTcpTable/bind-probe) and never hand a bridge a port inside an exclusion. - React to a child's
EACCESby RE-PICKING the port, not by respawning on the same one. A bind failure with EACCES on loopback is a reserved-port signal, not a transient. - Surface the real reason in
bridge_list/ readiness. Today the only clue isfatal listen error (EACCES)in the bridge log;pup_readinesssays "backing off after 3 failures", which points the reader at the bridge rather than at the port assignment.
What pup did on its side (shipped 2.0.231)
pup can't fix routing (ab owns the port), but it no longer fails silently: on EACCES it reads the excluded ranges, logs which range swallowed its assigned port, prints the elevated WinNAT remedy, and binds a fallback port so its dashboard/health stay reachable, recording the real port in pup-bridge-port.json ({port, assignedPort, fallback:true}). If ab ever wants to discover a fallback, that file is the handshake.