Allows per-container customization of the auto command. For example:
WEBTERM_DOCKER_AUTO_COMMAND='tmux new-session -ADs {container}'
This creates a tmux session named after the container instead of using
a fixed session name for all containers.
When a container has no labels, Docker returns {"Labels": null} in the
inspect response. The code was using .get("Labels", {}) which only
returns the default when the key is missing, not when it's null.
This caused _has_webterm_label() to raise TypeError, which was silently
caught by the event watcher's exception handler, causing it to reconnect
and miss the container start event.
Fixed by using .get("Labels") or {} pattern in:
- _handle_event() when processing start events
- _get_container_command() when extracting command label
- _get_container_theme() when extracting theme label
Added test for null labels case.
On iPad with a hardware keyboard, keybar modifiers were cleared without
being applied if the textarea wasn't focused. Now keybar Ctrl/Shift
intercepts document-level keydown events, applies the modifiers to the
pressed key, sends the correct sequence, and then clears the modifiers.
Remove debug logging, ensure modifiers clear after input events, and clear
keybar modifier state when physical keyboard input occurs outside the
mobile textarea. This prevents Ctrl/Shift from remaining stuck on iPad
hardware keyboards.
Use window.open with target, then call focus() when available to switch to
an existing session tab. Fall back to same-tab navigation if the popup is
blocked or focus is unavailable.
Ctrl input can stop working if the browser window loses focus. Add a
window focus listener to re-focus the terminal whenever the window is
activated, restoring keyboard modifiers without requiring a reload.
Pass per-theme background, foreground, and 16-color palettes into the SVG
exporter so screenshots match the active session theme (including ANSI colors).
Adds theme palette mappings and updates screenshot tests to validate themed
backgrounds and palette-aware color conversion.
When opening a session via the typeahead floating results panel, clear the
search query and active selection so the panel dismisses immediately.
Adds a test assertion ensuring the dashboard HTML includes the dismissal
logic after opening a tile.
Introduce per-route send queues and dedicated sender tasks so terminal output
does not await slow WebSocket clients. Output is buffered up to a bounded
queue; when full, the oldest data is dropped to keep sessions responsive.
Sender tasks enforce a send timeout and close slow/broken sockets, preventing
terminal run loops from stalling indefinitely.
Tests updated/added to verify:
- queued output instead of direct ws.send_bytes
- sender timeout closes sockets
- queue overflow drops oldest
- session close stops sender task
Modifiers should be cleared regardless of whether the key came from:
- Physical keyboard (Ctrl+letter combinations)
- Soft keyboard (letters via input event)
- Special keys (Enter/Backspace/Delete via beforeinput)
- Navigation keys (arrows, Tab, Escape via keydown)
- Keybar buttons
Previously, some code paths had conditional clearing (deactivate flag)
or early returns without clearing. Now ALL key presses unconditionally
call deactivateModifiers() to ensure modifiers never stay sticky.
Modifiers (Ctrl/Shift) were staying active ('sticky') after pressing
Enter, Backspace, or Delete keys on the mobile soft keyboard.
The beforeinput event handler was sending the key sequences but not
calling deactivateModifiers(), unlike the input handler (for regular
text) and keydown handler (for arrow keys).
This caused modifiers to remain highlighted and active until the user
typed a regular letter, making the keyboard feel unresponsive.
Now modifiers are properly cleared after all soft keyboard keys.
When entering or refreshing a webterm session running tmux, the text '1;10;0c'
was appearing on screen. This was caused by tmux sending a DA2 (Secondary Device
Attributes) query (ESC[>c) to detect terminal capabilities.
The filtering code only handled DA1 responses (ESC[?...c) but not DA2 (ESC[>...c)
or DA3 (ESC[=...c) responses. Updated the regex patterns to match all three variants:
- DA1 (Primary): ESC[?...c - already worked
- DA2 (Secondary): ESC[>...c - now fixed (tmux uses this)
- DA3 (Tertiary): ESC[=...c - added for completeness
The fix applies to:
- Live terminal output filtering
- Replay buffer filtering on reconnect
- Partial escape sequence buffering
All 342 tests pass with the updated patterns.