- Device labels: lowercase, no whitespace, only a-z 0-9 - _ (enforced at config time)
- Session IDs removed: device label is the sole identifier
- Routes changed: /sessions/:id → /devices/:label
- Removed commands: click, type, find-window, wait-for-window, label, old version, server-version
- Renamed: status → version (compares relay/remote.py/client commits)
- Unified screenshot: takes 'screen' or a window label as argument
- Windows listed with human-readable labels (same format as device labels)
- Single instance enforcement via PID lock file
- Removed input.rs (click/type functionality)
- All docs and code in English
- Protocol: Hello.label is now required (String, not Option<String>)
- Client auto-migrates invalid labels on startup
- Remove \t-based alignment (fixes emoji spacing inconsistencies)
- New display.rs module: table rows with dynamic terminal-width columns
- Columns: action_emoji | name (14ch) | payload (55%) | status_emoji | result (45%)
- cmd_start() prints 🔄 spinner, cmd_done() overwrites line in-place via ANSI cursor-up
- Payload and result truncated to column width with ellipsis
- Consistent 2-space gaps after every emoji (no tab stops)
- Add terminal_size crate for dynamic width (fallback: 120)
On Windows, cmd.exe echoes the full prompt before the command output,
so the sentinel line looks like:
C:\Users\Moritz\Desktop>__HELIOS_DONE__0\r\n
starts_with(SENTINEL) never matched. Switching to contains() + finding
the sentinel position fixes detection on both Windows and Unix.
The prompt_config() function used print!() without flushing stdout,
causing all prompts to be buffered and invisible to the user. The
program appeared to hang silently after 'No config found — first-time
setup'.
Changes:
- Add std::io::stdout().flush().unwrap() after each print!() prompt
- Style prompts with cyan '→' prefix to match CLI conventions
- Show default values in square brackets for relay URL and label
- Use hostname() as default label (was previously Optional/None)
- Add blank line after prompts before '✓ Config saved'