Shell Pilot 1.15.1
August 2, 2026
Reliability, performance, and security release
This release is a comprehensive hardening pass across the terminal engine, autocomplete, SSH remote-tree integration, updater, and licensing backend.
Terminal fixes
- Fixed a hidden-echo filter bug that could drop real terminal output bytes and, in edge cases, swallow output after a hidden command — it also made large output chunks quadratic when a stale echo was pending. Echoes now expire.
- Escape-sequence parsing now only accepts true
ESC ] OSC sequences (no more forged CurrentCommand events from ordinary output), raises the payload cap from 1000 to 4096 bytes (command tracking previously never delivered), and decodes UTF-8 correctly.
Autocomplete
- Incremental training now merges into the model instead of wiping it on every command — suggestions stay accurate between background retrains.
- zsh extended-history entries (
: ts:dur;cmd) are parsed correctly, and the newest history entries are kept instead of the oldest.
- Full retraining moved off the main thread; no more UI stalls at launch or every 5 minutes.
Performance & power
- SSH-readiness checks no longer serialize the full scrollback for every session every second — only sessions that ran an interactive
ssh command are watched, and only the last 120 buffer rows are scanned instead of the whole 10,000-line scrollback.
- CPU/RAM metric sampling now runs its process-tree walk on a background queue instead of the main thread, and pauses entirely while the app is backgrounded (resuming with a fresh sample when you return).
- Autocomplete retraining is skipped unless your shell history actually changed — no more re-parsing and rewriting the model every 5 minutes.
- The Metal terminal renderer drops to 30 fps while idle (60 fps only during full-screen TUIs like vim or opencode).
- Session persistence is debounced and written in the background for selection changes and every
cd, instead of a synchronous save per event.
- File-tree watcher reloads coalesce into one listing pass per change batch and no longer drop directories during build-event storms.
- Semantic search precomputes lowercase indexes and stops early; CPU-metric baselines no longer show fake 100% spikes.
SSH & remote trees
- Hidden command injection requires a pending interactive ssh command and an idle session, capped at 2 attempts — no more accidental
eval from matching output text.
- Injected commands are hidden from remote shell history (
HIST_IGNORE_SPACE).
- Remote directory listings use a single subprocess (was: one
base64 subprocess per entry) and stop re-listing forever when nothing changes; symlinks no longer masquerade as folders.
Security
- Custom shortcuts can no longer hijack system shortcuts like ⌘Q or ⌘C.
- Downloaded updates are verified with
codesign and a bundle-id check before installing; hashing no longer freezes the app.
- Licenses are revalidated against the server on launch and stored in Keychain.
- Backend: license keys can no longer be fetched by email alone, rate limiting is keyed and bounded, checkout URLs can't be redirected, refunds now revoke licenses, and keys are stronger (16 hex chars).
Fixes & polish
- Man pages auto-hide when you stop typing a matching command.
- Rename a session and click away — it cancels cleanly; remote tree expansion survives scrolling.
- Accepting a semantic suggestion sends Ctrl+U + the command instead of backspace-counting (no more input corruption).
- Suggestions are navigable with the keyboard (arrow keys / Return / Esc).
- Drop a file or folder whose path contains an apostrophe — escaping is now correct.
- Git history viewer, file-watch refresh, and sidebar accessibility improved.