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.33.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
- wmux web — reach your terminal panes from a phone browser (read-only, local-only by default). A new command starts a small web server, hosted inside the daemon, that serves your live panes to a browser: run wmux web --expose, open the printed http://<tailnet-ip>:7681/?token=… link on your phone (same Tailscale tailnet or LAN), pick a pane, and watch its output stream in real time. It reuses the daemon's own PTY data (initial screen from the same ring-buffer flush the desktop uses, then a live tee of terminal output), so it never fights the desktop GUI for a pane and it keeps working even after you close the desktop app — the agents are still supervised by the daemon. Safe by default on two axes: it is read-only (the browser can watch but cannot type — pass --allow-input to opt in) and it binds loopback only (127.0.0.1 — pass --expose to bind all interfaces, or front it with tailscale serve for HTTPS). Even read-only, a viewer sees the selected pane's full scrollback, so don't serve panes showing secrets. Access is gated by a fresh random token minted on each start (the daemon's own control token never touches the network; API calls authenticate with a Bearer header rather than a query string, except the SSE output stream, which must carry the token as a query parameter because EventSource cannot set headers), and nothing listens until you run the command. The page is installable: iOS "Add to Home Screen" works over plain HTTP, and full PWA install (Android) plus offline app-shell caching work behind HTTPS. Options: --port (default 7681), --expose, --host <addr>, --allow-input, --status, --stop.
- wmux web is now usable from a phone, not just viewable — and it starts from the titlebar. The browser surface gained the things a touch device actually needs. A key bar puts the keys a phone keyboard cannot produce one tap away (Esc, Tab, Ctrl, Alt, arrows, | / ~ - _, Home/End/PgUp/PgDn); tap a modifier to arm it for the next key, double-tap to lock it. A second row carries the keystrokes you actually need when an agent is waiting on you — Shift+Tab, Ctrl+C, yes, continue, /compact, /clear, /resume. Text size is adjustable, with two view modes: fit-the-whole-width for a glance, or 1:1 with sideways scroll when you need to read (previously the pane was always squeezed to the viewport, which on a phone meant unreadable). Notifications arrive in the page: when a pane asks for approval of a sensitive action, or emits a desktop notification, a banner appears — even while you are watching a different pane — and tapping it jumps there. A fleet strip shows every pane's status at a glance, with an attention dot on panes that called for you. Pairing no longer means typing a 36-character token on a phone keyboard: the server prints a 6-character code (/pair, valid 10 minutes, single use, 5 attempts) that the phone exchanges for the token. And the whole thing can be started without a terminal — a quiet web control in the titlebar opens a popover with Allow-input / Expose-to-network opt-ins, the scrollback warning, and one Start button; while running it shows the bind address, viewer count, a copyable URL, and the pairing code in large type. Read-only remains the default and is enforced server-side at the pty.write boundary, so a read-only server refuses input even if the page is tampered with.
- A "welcome home" briefing when you open a workspace. The Command Deck now greets you at the top of the orchestrator thread with a one-shot, deterministic summary of what the judgment engine already knows: what changed while you were away ("2 finished, 1 now blocked on you"), what is blocked on your decision, how the fleet stands right now ("1 needs you, 2 running"), and — the "look at this first" answer — the single pane most worth your attention, named and one click from its terminal. It deliberately doesn't repeat the Fleet roster sitting directly above it. It is a pure read of existing state: no brain turn is spent, nothing is throttled, and it stays current in every autonomy mode including off, where no orchestrator turn ever runs. It stays a quiet one-line affordance and only auto-expands when there is something worth surfacing (a cold start, a newly-raised decision, or a pane that just became blocked — including one that spawns straight into a permission prompt, and one that recovers and blocks again), so it never nags on an ordinary workspace switch — and once you have expanded or collapsed it by hand it stays that way, re-opening itself only when something genuinely new becomes actionable, never on the routine refreshes that fire while your agents work. The "while you were away" summary is cleared only once you have genuinely seen it — expanded, scrolled into view, in a window you are actually looking at — so a delta that lands while you are on another tab, scrolled down the thread, or away from the machine is still waiting when you come back. Only live agent panes count: a workspace holding nothing but an empty split, a browser tab or an editor has nothing to report and the card doesn't render at all. Toggle it (and its auto-expand) in Settings → Orchestrator; the toggle takes effect immediately on an already-open deck.
- Pin an agent and model to each pane role, and wmux enforces it on the launches it assembles. A pane role (Builder / Reviewer / Tester / Planner) used to be a soft routing hint the orchestrator could read but nothing acted on. You can now bind each role to an agent + model in Settings › Orchestrator — e.g. Reviewer → codex with a cheap model — and the agent launches wmux itself puts together for a pane carrying that role are transparently rewritten to use the bound model. That covers three points: launches the orchestrator issues (terminal_send("claude") becomes claude --model haiku), the seeded launch command of a project pane, and the per-pane resume command (so a bound model survives a reboot instead of silently dropping). A launcher you type into the terminal yourself is not rewritten — your keystrokes go straight to the shell, and the Settings copy says so. The rewrite is loud and reversible: you see the real command in the pane, a muted agent · model chip in the Fleet roster, and a model badge on the pane — and those two only appear when the binding really is being applied, never for one that is configured but inert. It never fights an explicit --model you put on the line (a manual override wins for that one launch; the binding re-asserts on the next respawn), and it only ever fires on something that is recognizably an agent invocation — a shell command, or an instruction sent to an already-running agent, comes through untouched even when its first word happens to be claude. A model is only injected when the role also names the agent it belongs to, since --model grammar is per-agent; Settings flags a row that can't do what it looks like it does. Roles are unbound by default, and agents whose model-flag grammar isn't verified (only claude and codex are today) get an advisory note rather than a guessed flag. Per-role budgets and token metering are not part of this change.
- A wmux.json pane can declare its role, so a project layout's panes launch under the binding you meant them to. Applying a layout rebuilds the pane tree from scratch, which means a pane created by it has no role to inherit — a "role": "Reviewer" on a layout leaf is how it gets one. The role is assigned for real (it shows in the Fleet dropdown, persists, and the orchestrator sees it), and the leaf's command launches under that role's binding, including a supervised (restart) leaf's command. Only the four built-in role names are accepted, and anything else rejects the layout rather than quietly producing a pane that looks assigned and enforces nothing. The approval screen lists a declared role next to the command it belongs to, since a bound role means the line you approve is not quite the line that runs.
Assigning a role is the operator's, and only the operator's. Now that a role selects which agent and model a pane runs, letting agents set it would hand policy selection to the very agents the policy governs — an agent could rename its own role to something unbound and fall back to the expensive default, point your binding at a pane you didn't intend, or change a sibling pane's role so that pane launches differently. Agents can no longer assign, reassign, or erase a pane's role over the API: the key is dropped from their metadata writes (the rest of the write still applies, and the reply tells them what was refused), preserved through a wholesale replace or clear, and the refusal is logged. The Fleet dropdown is unaffected — it never used that API.
Changed
- When the shared MCP broker can't serve, agents fall back to the full MCP bundle instead of a dead shim. With the broker enabled, wmux points each agent CLI at a thin shim that connects to a single resident broker process. If that broker never comes up — a missing script, a crash loop, a permissions failure — the old behavior left every agent on a shim that gives up after a few seconds and takes all wmux tools (browser, terminal, a2a, channels) down with it. Registration now waits briefly for the broker to accept a connection and, if it doesn't, registers the self-contained bundle so tools keep working. The wait is bounded and never blocks startup beyond its timeout, and this only changes behavior when the broker is enabled — the default configuration is untouched. Re-registering from the Settings screen or during first-run onboarding makes the same live check, so clicking "re-register" while the broker is down writes the working bundle rather than re-installing a shim that can't connect.