Aquesta és una versió anterior. La versió actual és la 4.10.0. wmux 4.10.0 · Data de publicació:
Fitxers d’instal·lació 3.34.0
| Arquitectura | Tipus | Àmbit | Mida del fitxer | Baixa | SHA256 |
|---|---|---|---|---|---|
| 64 bits | EXE | Usuari actual | — | github.com | VirusTotal |
L’enllaç i l’SHA256 provenen del manifest comunitari del Gestor de paquets del Windows. Convé comparar el hash del fitxer baixat abans d’executar-lo.
Notes de la versió
Added
- Choose your browser backend: built-in panes, or your real browser (#517). A new Settings → Terminal option, "Browser backend", decides where browser opens land. The default (Built-in) keeps today's behavior exactly: an embedded browser pane opens inside wmux and the full automation toolset works on it. Switching to External routes every open — an agent's browser_open / browser_navigate, and your own clicks (the pane's browser button, the command palette, the keyboard shortcut, a workspace's port badge, a link clicked inside a terminal) — to your OS default browser instead. wmux spawns no embedded Chromium at all, so a workspace that opens pages costs wmux zero browser memory, whether the page was opened by an agent or by you. External mode is deliberately fire-and-forget: wmux gets no handle on the opened tab, so tabs aren't tracked, listed, or closable from wmux, and deep-automation tools (click, screenshot, extract, …) fail with a clear "backend is external" error instead of a confusing target-miss — agents are told exactly why and what to use instead. Opens land in your real, signed-in browser, from any workspace — that reach is the point, and the Settings copy says it plainly. The choice is read by the main process at boot (no startup race: the very first open after launch already honors it) and applies immediately when changed.
Fixed
- wmux web notifications now show the message instead of the word "Notification" (#597). When a pane emitted a desktop notification, the banner in the phone browser read the literal string "Notification" and the actual text — "Build finished, 3 tests failed" — was dropped on the floor: the page was reading a field name the daemon never sends. The banner now renders what the pane actually said, for every notification flavor (OSC 9, which carries only a body; OSC 777 and OSC 99, which carry a title and a body), and the parsed notification travels to the browser whole — source, title, body and timestamp — so nothing is lost between the pane and your phone.
- wmux web no longer loses attention events when the connection drops, or while nothing is watching (#598). Approval requests and pane notifications were fired at whoever happened to be connected at that instant and then forgotten: lock your phone, walk through a dead spot, or simply have no browser open, and the alert was gone for good — the pane sat waiting on an answer you were never shown. The daemon now keeps a short rolling record of fleet attention events (the last 100, up to 30 minutes) and serves it on a dedicated stream that survives reconnects: your phone resumes exactly where it stopped, and events raised while you had nothing open are delivered the moment you reconnect. Reloading the page picks up from the same place. When the record can't be lined up with what you already saw — a fresh device, or a daemon restart — you get one "N events while you were away" summary and the affected panes light up in the fleet strip, instead of a stack of banners for alerts you may already have dealt with. Duplicates are suppressed, so nothing is shown twice.
- wmux web now survives a daemon restart, so phone access no longer dies while you are away from the desktop (#596). Your sessions already survived a crash, a reboot, or the one-click update flow; the server that serves them to your phone did not. Nothing recorded that you had turned it on, so the port simply stopped answering, the phone showed nothing but "reconnecting…", and the only fix was to walk back to the desktop and run wmux web again — in exactly the situation phone access exists for. wmux now remembers an explicit wmux web (the bind address, --allow-input, --allow-host, the port) and brings the server back with the daemon, with the same access token, so a browser you left open reconnects on its own with nobody at the keyboard. Carrying the token also fixes the smaller version of this: re-running wmux web to add --allow-host for a tailscale serve front no longer locks out a phone that already paired. Turning it off is remembered too — wmux web --stop keeps it off across restarts and revokes the token, and a new wmux web --new-token rotates the token on demand when you want to revoke every paired device without stopping the server. Nothing changes if you have never run wmux web: the daemon still listens on nothing until you ask, a restore is logged (loudly, when it puts a network-exposed writable terminal back), and a corrupt state file falls back to "off" rather than blocking daemon boot. On the phone, a rejected token is now told apart from a server that is merely restarting — EventSource reports both as the same silent retry — so an expired session lands on the pairing screen instead of spinning on "reconnecting…" forever.
- Relaunching wmux while the daemon is still restoring your sessions no longer kills it mid-restore (#546). When wmux starts, it looks for a daemon that is already running and reuses it. A daemon that is busy restoring a large session set can't answer that check yet — it writes its PID the moment it starts, but only opens its control channel once every session is back, which takes ~19-23 seconds for 30-35 sessions. The launcher waited 1.9 seconds for an answer, decided the daemon was wedged, and killed it. The replacement then started the same slow restore from the top, and could thrash through the respawn budget until wmux gave up and fell back to local mode, where every pane creates its own session — the duplicate-sessions symptom from #537. The daemon now leaves a "still booting" marker for exactly the span where it cannot answer, and the launcher waits it out (up to the same 90-second ceiling the spawn path already used) instead of killing a daemon that is provably making progress. The marker is trusted on the PID it names being alive, deliberately not on a freshness timestamp: recovery is one long chain of awaits, so a busy moment could delay a heartbeat and re-create the exact bug. A daemon that crashes mid-restore leaves a marker naming a dead PID, which is ignored, and a genuinely hung boot still gets killed at the ceiling. The ordinary case — a daemon that really is wedged — is untouched and pays no extra wait, because the marker isn't there at all.
- A clean daemon handoff no longer dead-ends on machines where anti-virus slows down process checks (#545). When wmux replaces an outdated daemon, it asks it to shut down, then confirms it's gone before starting a fresh one. That confirmation ran entirely through tasklist, which — by design, to prevent two daemons ever running at once — reports "unknown" rather than "dead" whenever the check itself fails or times out. On a machine where those checks are slow or blocked, "unknown" is the only answer that ever comes back, so a daemon that shut down cleanly milliseconds earlier was polled for the full 5 seconds, failed the follow-up verification for the same reason, and the whole handoff dead-ended. wmux now also accepts a second, independent proof: the daemon's control channel no longer accepting connections, which only happens after it has saved your sessions, released its lock and closed its terminals. A process that is positively seen running is still never treated as finished, and without a shutdown acknowledgement the new signal is ignored entirely, so nothing here can start a second daemon next to a live one. Measuring the original report along the way: the daemon leaves the process table 7-12 ms after acknowledging shutdown across 10 and 35 live terminals, so the reported multi-second linger did not reproduce; a timestamp is now logged immediately before exit so a recurrence in the field arrives with the evidence this needed.
- Dragging your mouse across a terminal during a workspace switch no longer throws a recurring uncaught error. Selecting text in a terminal registers document-level mouse listeners (so a drag that leaves the terminal can still be released), and on a remount — a workspace switch, a reconnect — Terminal.dispose() nullified xterm's internal render service before those listeners came down. A mouseup landing in that gap read dimensions off a half-torn-down instance and threw TypeError: Cannot read properties of undefined (reading 'dimensions'), dozens of times per session. wmux now tracks whether a drag is active on any terminal and defers only the internal dispose() until the mouse is released, closing the race without patching xterm internals; all PTY listeners are already torn down at that point, so no new data arrives while disposal waits. A drag that outlives a window switch (Alt+Tab mid-selection) stays guarded, a drag released outside the window is replayed to the terminal as the release it never saw (so the terminal tears its own listeners down instead of being left half-armed), and a button that never reports release is force-disposed after 30 seconds with a console warning so the rare fallback is traceable rather than silent. The redundant back-to-back reconciliation runs visible on load are now numbered in the console — so "one cycle walking four workspaces" is distinguishable from "four cycles" — and the dev-only Electron "Insecure Content-Security-Policy" warning is suppressed in development (Vite's HMR requires unsafe-eval; the production CSP remains strict with no unsafe-eval).