Skip to content

feat(desktop,doctor): live Status dashboard + receiver controls - #88

Merged
pyramation merged 1 commit into
mainfrom
feat/status-dashboard
Aug 8, 2026
Merged

feat(desktop,doctor): live Status dashboard + receiver controls#88
pyramation merged 1 commit into
mainfrom
feat/status-dashboard

Conversation

@pyramation

Copy link
Copy Markdown
Contributor

Summary

wavegrid doctor becomes a live screen in the app instead of a terminal command — and the diagnostic logic moves out of the CLI so both render the same snapshot.

New @wavegrid/doctor (moved out of packages/cli/src/commands/doctor-checks.ts, which no longer exists): the pure checks, the two probes, and one collector that returns diagnostics as data:

const diag = await collectDiagnostics({ store, project, resolved, serverUrl? });
// { checks, overall, devices, sync{enabled,revision,entryCount,divergent,fromServer},
//   server: SystemStatus | null, serverUrl, serverError }

serverError distinguishes not-running (nothing on the port) from unauthorized / timeout / refused / not-wavegrid, which is what makes "brain down" actionable. runDoctor is now only rendering — plus the one case the collector can't express (no project to diagnose). --json now emits the collector's shape.

Desktop Status route. doctor:report adapts the snapshot in main (range/SystemStatus formatting stays out of the renderer, so no node deps cross the bridge). Layout follows the lesson from the Lights debugger: fixed-height page, two independently scrolling columns, nothing below the fold on a short window. Left = the show (brain version/layout/mode/uptime, connected receivers with shard + layout-mismatch flag, coverage gaps/overlaps, registered devices, sync divergence); right = this laptop's checks, sorted failures→warnings→passes, each with its remedy. Refreshes every 5s with a Live/Paused toggle.

Receiver controls. The receiver reads its OSC target, shard, and light map at startup, so a config change previously needed a full brain restart. brain.ts now owns the receiver handle independently:

startLocalReceiver()  // dials into the already-running brain
stopLocalReceiver()   // server + laser UI + connected clients stay up

Restart in the UI is stop+start. BrainStatus gains receiverRunning.

No protocol change: the report is read with the existing system_status request over an authenticated socket, exactly as the CLI already did.

Link to Devin session: https://app.devin.ai/sessions/972698f89f494b86828010666a002b8f
Requested by: @pyramation

Extract the doctor checks into @wavegrid/doctor and collect them as data, so
the CLI and the desktop app report the same health from one implementation.
Desktop gains a Status route (brain, connected receivers + shard coverage,
device registry, sync divergence, and this laptop's checks with remedies) and
receiver-only start/stop, which applies an OSC/shard/light-map change without
dropping the server or the laser UI.
@pyramation pyramation self-assigned this Aug 8, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@pyramation
pyramation merged commit f0fc90d into main Aug 8, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant