feat(ui,desktop): explain a red connection dot, follow the project in use, normalize OSC loopback - #92
Merged
Merged
Conversation
…n use The artist UI's dot was a bare boolean: no reason, no retry. It now diagnoses a drop against /api/config + /api/me (server unreachable / session expired / socket rejected / restarting) and reconnects with backoff. Startup failures were swallowed. The server handle exposes a ready promise so a port clash surfaces as an actionable message instead of a show that reports running with nothing listening, the brain records the failure in its status, and the Show route prints it — plus a separate receiver-failed-but-brain-up warning. Switching the project in use now takes every panel with it: the pinned config project is dropped and a live brain restarts onto the new project, reloading the embedded artist UI (same origin, so it kept the old layout). OSC hosts normalize loopback aliases to 127.0.0.1 — localhost can resolve to IPv6 while BEYOND listens on IPv4, and UDP drops the packets silently. The Output route gains a This machine button and a host help toggle.
Contributor
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
This was referenced Aug 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three failure modes that were all silent: a red dot with no reason, a "running" show with nothing listening, and OSC packets dropped into the void.
The dot now diagnoses itself.
useSocketthrew the close code away, never retried, and rendered one boolean. It now probes the two endpoints that separate the possible causes and reconnects with backoff:Amber while connecting/reconnecting, red once down, and the reason renders next to it.
StatusDotis the only UI addition — the dot's position, size and colours are unchanged.Startup failures now reach the operator.
startServeronly calledlisten, which is async, so a port clash produced a show that reported running while nothing was bound — the actual cause of a red dot with no explanation.ServerHandlegainsready, the brain awaits it, and both the CLI (awaitBind) and the desktop surface the message.BrainStatuscarries the outcome instead of it dying in a console:Receiver failure stays non-fatal (the show still runs console-only) but is now reported as its own amber warning rather than looking healthy.
"Use project" moves every panel. Project-scoped hooks refetch on their
projectargument, but two things didn't follow: a project pinned by Config on a row kept overriding the active one, and the embedded artist UI is served on the same origin whichever project runs, so itsWebContentsViewnever reloaded.projects:usenow drops the pin and restarts a live brain onto the new project;brain:startinvalidates the laser view. Saving config does the same, since the brain resolves its config once at startup.did-fail-loadalso clearsloadedUrlso a failed first load isn't remembered as loaded.OSC loopback. OSC is UDP, so a wrong host fails with no error at all — and
localhostis the trap: it can resolve to IPv6::1while BEYOND/FB4 listens on IPv4.normalizeOscHostrewrites every loopback alias to127.0.0.1wherever a host is stored (CLI wizard, flags, desktop), the BEYOND wizard defaults to it, and the Output route gets a This machine button plus a?explaining host vs. LAN IP.Receiver, socket and OSC protocols are untouched.
Link to Devin session: https://app.devin.ai/sessions/972698f89f494b86828010666a002b8f
Requested by: @pyramation