- feat(share): host-consented interactive terminal over the relay. The host shares
a real PTY shell (core/pty_session.py); the guest renders it with pyte and sends
keystrokes (gui/terminal_widget.py) — vim/top/tab-completion/Ctrl-C work. Runs as
the host's user (never root). The host reads along live and can type too, e.g. a
sudo password, which stays local and is never sent to the guest. Off by default.
Guest also pulls inventory on join (req_full).
- fix(gui): style all form controls (QLineEdit/QPlainTextEdit/spin boxes/combo/
terminals) dark-on-light-text — Fusion defaulted them to unreadable light-on-light.
- replaces the command/response shell with the full PTY; adds pyte to the gui extra.
Verified end-to-end against the deployed relay (guest keystroke ran on host PTY).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a Share tab that hosts or joins a read-only live session through the
rigdoctor-relay over WebSocket (QtWebSockets), gated by the Gitea access token.
- gui/share_page.py: Start shared session (host: get a code, stream snapshot +
health + inventory) and Enter share code (guest: view a host's data read-only)
- core/share.py: host_full_frame / host_snapshot_frame + guest_html renderer
- config: relay_url (default wss://rigdoctor.jesseyvanofferen.com)
- setup: token now powers updates AND sharing — hint asks for read:user +
read:repository scopes (relay validates the account via Gitea)
- main_window: Share nav tab + socket cleanup on close
- tests for the relay frame builders and guest HTML
Verified end-to-end against the deployed relay (host code -> guest frame).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- feat(alerts): desktop notifications (notify-send) for overheat (GPU/CPU past a
configurable threshold), GPU-lost, and a new-version-available alert (once per
version). Edge-triggered with cooldown so it doesn't spam (core/alerts.py)
- feat(gui): Notifications page to configure alerts (enable, GPU/CPU thresholds,
Send test); changes apply live and persist via config.save_config/update_config
- feat(gui): ship a RigDoctor icon; the GUI self-registers the icon + .desktop on
launch and sets the Wayland app-id, so the dock shows it after an update + relaunch
(no installer re-run); installer/uninstaller updated to manage the icon
- config: alerts_enabled, gpu_temp_alert, cpu_temp_alert; flat-TOML writer
- tests for the alert monitor and config round-trip
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>