Changelog -- wakamex/wakterm fork¶
All changes relative to upstream wakterm/wakterm main at 05343b387.
Features¶
Agent Harnesses¶
-
Add pane-owned agent identity and persistence (dcd1d10) Agents (Claude, Codex, Gemini, OpenCode) are first-class mux panes with identity, state tracking, and persistence across server restarts.
-
Add agent lifecycle commands (9def1d0)
wakterm cli agent start|stop|listfor managing agent harness panes. -
Add agent runtime, send, and client-side badges (58ddee7) Send prompts and interrupts to running agents. Tab badges show agent status (waiting/working/your turn).
-
Add native harness watch and observer-backed PTY runtime (10e219e)
wakterm cli agent watchandwakterm cli agent list -ffor live progress across running harnesses. -
Fix raw input path for gemini agent sends (fbe9ccd)
Tab Management¶
-
Add prompt rename tab action (86e661f) New
PromptRenameTabaction lets users rename tabs interactively. -
Add default shortcut for prompt rename tab (01d3ab0) Bound to Ctrl+Shift+< by default, later moved to Shift+Comma (f249f9f).
-
Add move-tab bracket shortcuts (de89169) Ctrl+Shift+[ and Ctrl+Shift+] to reorder tabs.
-
Preserve user-set tab titles from escape sequences (63c30dc) Titles set via
PromptRenameTabor the Lua API are no longer overwritten by terminal escape sequences. -
Add safe tab effective title for Lua (1624be0) Exposes a Lua-accessible effective title that respects user overrides.
GUI¶
-
Remember window position and size on macOS (05ed9a7) Uses native
NSWindowautosave so window geometry persists across restarts. -
Make tab reordering atomic (946d01b) Tab drag-reorder is now a single atomic operation, avoiding intermediate invalid states.
-
Clip pane glyphs to pane bounds (d16d9b4) Glyphs that extend past a pane's edges are now clipped instead of bleeding into adjacent panes.
-
Invalidate line quads when pane width changes (3c82389) Fixes stale rendered content after pane resizes.
-
Repaint window on tab resize (7f4a541)
-
Improve
wakterm cli listtable layout (a5a9966)
Docs Site¶
-
Replace colorscheme index pages with interactive browser (839988a) Removed hundreds of static colorscheme pages and replaced them with a searchable, filterable browser with live previews.
-
Modernize docs site (839988a) Dropped legacy asciinema player, mdbook assets, and custom CSS. Trimmed global page load cost.
Bug Fixes¶
Resize / Split Tree¶
-
Sync divider drags via atomic ResizeTab batches
resize_split_by()now sends the same tab-levelResizeTabbatch used by full window resizes, so dragging a split divider updates the mux server coherently instead of leaving client-only pane widths behind. -
Fix spawn sizing across entry points
wakterm cli spawn, delegation into an already-running GUI instance, and existing-window mux spawns now use the live tab size instead of falling back to tiny server defaults. -
Fix client ResizeTab pane id mapping Batched resize messages now translate client-local pane ids back to remote mux pane ids before sending them to the server, fixing fresh-session tabs that stayed at
80x24despite correct pane sizes. -
Fix nested split pane sizes diverging after window resize (de54b07) Per-pane
Pdu::Resizemessages interleave during rapid resizing, causing the mux server's tree to diverge. Addedreconcile_tree_sizes()-- a top-down constraint enforcement pass after every tree mutation. 14 unit tests covering 6 layout patterns. Fixes #6052, #5011, #5117 -
Fix infinite loop on extreme window shrink (80447df)
adjust_y_size/adjust_x_sizeloop forever when both split children reach 1 row/col. Added early return when no progress is made. Fixes #4878 -
Batch per-pane resize PDUs into atomic ResizeTab message (f39b4cc) Eliminates the root cause of resize interleaving. New
ResizeTabPDU (codec type 63) sends all pane sizes atomically. IndividualPdu::Resizestill sent as fallback for older servers. -
Stop sending individual Pdu::Resize, rely on batched ResizeTab (5adbc17)
-
Fix split-pane race by sending tab size with SplitPane PDU (5d94a78)
-
Force tab resize after split_pane to sync PTY sizes with tree (fffb3f8)
-
Clamp tiny resize geometry to at least 1x1 cells (8968ff4) Prevents zero-dimension resize requests from reaching the mux layer.
-
Restore tab size after top-level split (9b04ef8)
split_and_insertwithtop_level=truedidn't restoreself.sizeafter pre-resizing, causing subsequent splits to fail with "No space for split!". Fixes #7654, #2579, #4984 -
Focus new pane after split (1fa85af)
Multi-Client Stability¶
-
Break resize feedback loop (76a1695) Client no longer resyncs on
TabResized, breaking the loop where resize -> resync -> resize spiralled. -
Suppress self-echo TabResized, forward from other clients (daa899b) Server no longer echoes
TabResizedback to the client that triggered it. -
Restore TabResized resync after self-echo filtering (ec0250f) With self-echo gone, resync on
TabResizedfrom other clients is safe again. -
Debounce resync storms instead of dropping (039980c)
-
Avoid pane focus feedback loops across clients (cae82e4)
-
Make active tab state client-local (ff0b2a5) Each connected client tracks its own active tab instead of fighting over a shared global.
-
Avoid reentrant window lock when moving tabs (0a05f94)
-
Fix mux client registration handshake ordering (d3993c2)
Session Persistence¶
-
Rewrite session restore with recursive tree walk (26cc34b) Replays the exact split tree instead of reconstructing from flat pane rectangles.
-
Use percentage splits for session restore (d81bd83) Proportional sizing instead of absolute cell counts, so restores adapt to different window sizes.
-
Heal degenerate splits before saving, clamp to 10-90% (27dc63d)
-
Use generous initial size for session restore (42299768)
-
Reconcile tree after session restore to fix column height mismatches (6cb68dc)
-
Preserve active tab selection in manual and automatic restore
ListPanesResponsenow carries the active tab per window,wakterm cli save-layoutrecords it, manual restore focuses the saved tab after rebuilding the window, client attach/resync tracks it, and built-in mux session restore reapplies the saved active tab. -
Add Rust
wakterm cli save-layout/restore-layoutand removewez-tabsManual layout snapshots now use the real mux pane tree instead of reconstructing split order from flat pane rectangles. Restore replays exact split cells, preserves tab/window grouping, titles, workspaces, active tab selection, per-tab active pane selection, and zoom state.
Mux Protocol / Server¶
-
Fix OOM from unbounded SynchronizedOutput buffer When a TUI app enables SynchronizedOutput (
CSI?2026h) and crashes or gets stuck without disabling it, the mux server accumulated parsed actions without bound. Over days, this grew to 25GB+ and triggered the OOM killer. Added a 4MB safety valve that force-flushes the buffer during hold. Also added 60-second memory reporting (RSS + per-pane action buffer sizes) at INFO log level. -
Reject oversized PDUs before allocation (e1e8510) Both
decode_rawanddecode_raw_asyncallocated buffers from untrusted wire data without bounds. AddedMAX_PDU_SIZE(64 MiB) check. Fixes #7527 -
Fix deadlock in domain_was_detached (1a9b10d) Held
windows.write()while calling intotab.kill_panes_in_domain(), creating a lock-ordering deadlock with the GUI render path. Downgraded towindows.read()and released before operating on tabs. Fixes #7661 -
Add RotatePanes PDU (3ebe927)
rotate_clockwise/rotate_counter_clockwisewere local-only -- the server's tree diverged after rotation. AddedRotatePanesPDU (codec type 64) to keep server in sync. Fixes #6397 -
Pass --attach flag through try_spawn (f283ee0)
wakterm start --attach --domain Xdelegated to an existing instance but always spawned a new tab, ignoring--attach. Now checks for existing panes and skips spawning. Fixes #7582 -
Clarify stale mux server version mismatch errors (55f3de1)
-
Log client version on connect (95d16ce)
Codec¶
-
Accept legacy tab title PDUs without badge (9eceae0) Backward compatibility for older clients that don't send the agent badge field.
-
Restore codec version 46 (1a16da1) Both client and server are built from the fork, so the intermediate version bump was unnecessary.
Parser / Misc¶
-
Fix tmux CC parser error on empty line during detach (701b950) Empty lines during tmux
-CCdetach caused parser errors in the debug overlay. Fixes #7656 -
Add chrono clock feature (6e5b38a) The workspace chrono dependency was missing the
clockfeature, preventingUtc::now()from compiling.
Observability¶
-
Add mux observability for layout issues The mux server logs hard errors for
ResizeTabpane-count mismatches, unknown pane ids, and split-tree invariant failures. -
Add
check-pane-layout.pylive layout validator Validateswakterm cli list --format jsonoutput against a legal split tree so offscreen panes, overlaps, gaps, and degenerate rectangles are easy to catch from a live session. -
Track .git/HEAD and refs/heads for version string freshness (dcd417b)
Compatibility¶
The mux protocol has diverged from upstream. wakterm clients and servers must be the same build; connecting to an upstream wezterm mux server is not supported.
Test Coverage¶
26 tests added (17 mux, 9 codec) covering: - 6 layout patterns (L-shape, T-shape, grid, deep-nested, first-pane-stale, column-width) - Interleaved PDU scenarios from rapid resize events - Pane removal, split+resize, extreme shrink/grow cycles - Oversized PDU rejection - tmux CC empty line handling - Top-level split tab size preservation - Tab rename title fallbacks - Headless agent watch smoke test - SetClientId handshake regression
For changes before the fork, see the upstream WezTerm changelog.