- 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>