Skip to main content
CHANGELOG

What shipped

Released versions only, generated at build time from the product Keep a Changelog file. Unreleased work is not listed here: if it is not in a version heading, it has not shipped.

Latest released v3.23.4 · · 61 releases

Currently downloadable v3.25.2-preview.1 · preview channel

Those are two different questions. This page lists versions that have been released, from the product changelog. The download page serves whatever the live preview channel points at, which moves ahead of the last released version with every build. Download the current build from /download. Channel and exact version always come from the live release manifest.

Releases 11–15 of 61

Page 3 of 13

v3.15.0

Added

  • You can now tell agents apart in a channel. Every message shows the sender's pane identity chip (Claude Code · w26-1(claude)) plus a per-workspace color badge (round = a human seat, square = an agent pane); human posts read "Me · ", and the roster labels only YOUR row "Me" (another workspace's human seat reads as its workspace name). Previously every Claude pane rendered as an identical "Claude Code" and every workspace's human row read "Me".
  • Hand-typed @mentions now deliver. Typing @w1-2(claude) without picking it from the dropdown used to send as plain text with no warning. Typed tokens that match a live agent pane are promoted to real mentions — including when typed flush against Korean text or punctuation (확인요@…, cc:@…) — and tokens that match nobody get an inline "didn't match anyone" warning instead of a silent drop. An empty @-dropdown now says "No agents to mention" (dismissible with Escape) instead of rendering nothing.
  • The mention nudge now tells the agent exactly how to acknowledge (wmux channel ack <channel> <seq>), so the wake worker stops re-nudging an agent that has actually consumed the mention.

Fixed

  • Mentioning an agent no longer delivers twice. The renderer's paste and the daemon wake worker now share one nudge ledger per (channel, member) — an attached codex/opencode pane used to get the mention pasted AND nudged again ~10s later, then falsely escalate "handing off to humans". One paste covering several queued mentions debits the ledger once.
  • Agent greeting loops are cut at the source. The nudge no longer forces a reply (agents are told to reply only to real questions/tasks, never to greetings), and a message aimed at the human seat can structurally never be pasted into an agent terminal — the two dogfood root causes of the endless greeting loop. Rate-capped mention storms now raise a one-shot "possible loop" toast instead of failing silently.
  • A mention no longer vanishes when its target agent restarts. When the pinned pane went away and the workspace has exactly one live agent pane, the mention is delivered there instead of sitting as a badge forever. Genuinely workspace-level mentions stay badge-only.
  • A mention held while you reload the app is no longer lost. Routed-but-undelivered mentions re-route after a reload (durable delivered-set, split from the routed-set), and mentions that arrived while the app was closed are routed on the next boot. One-time caveat: mentions already held at UPGRADE time are treated as delivered by the migration seed (they were unrecoverable before this fix anyway).
  • A hung agent can no longer hold a mention hostage forever. An agent stuck reporting "running" with no terminal output for 3 minutes is treated as stale and the mention delivers; genuinely thinking agents (which keep repainting) are never interrupted, and idle TUIs answering cursor probes no longer count as activity.

v3.14.0

Added

  • Channel mentions now reach agents in any workspace, not just the one you're looking at. A mention addressed to a pane in a background workspace used to sit undelivered until you switched to that workspace. The renderer now polls the event stream across all local workspaces in a single request (union scope), so a cross-workspace mention lands on its target pane immediately and the agent answers without you having to switch.

Fixed

  • Reattaching no longer floods a reused shell with cursor-position replies (CPR feedback storm). On reattach the daemon replayed persisted scrollback verbatim and xterm re-executed the one-shot terminal queries (DSR/CPR, DA, DECRQM, OSC color, DCS) a prior TUI had emitted, each firing a live auto-reply into the fresh shell. A pane left running while detached could accumulate thousands; reattach answered them all at once, pinning zsh and the daemon near 100% CPU. Query sequences are now stripped from the replay before xterm sees them; live output is untouched.
  • A mention to an idle background agent now delivers instead of hanging until an unrelated repaint. An agent idle since its pane attached never re-emits a status pattern, so its status stayed unknown and the paste gate held it busy forever. Unknown status is now held only for a short grace window, then delivered, guarded so a genuinely running-but-quiet agent is never pasted mid-turn (an output-quiet check plus a hard hold ceiling).
  • Splitting a pane no longer crashes zsh on macOS. The zsh shell-integration prompt marker (OSC 133;B) was appended without a %{...%} zero-width guard, so zsh's line editor miscounted the prompt width and could crash (SIGBUS in zle) during the resize sweep a split triggers. The marker is now width-guarded, matching the bash and PowerShell integrations.

v3.13.0

Added

  • Agent panes are now first-class channel members (R2 Principal registry). The channel roster lets you add a specific agent pane (e.g. w8-1(claude)) as a member directly, not just a workspace. The roster reads as "you + agent panes", each agent showing a live/stale dot for whether its pane is alive. Previously every member was an anonymous local-ui row, which caused the "I added it as a member — why doesn't it hear me?" confusion.
  • New daemon Principal registry (principals.json) that unifies every actor (human / pane-agent) under one address space. On daemon restart, pane-agents are backfilled to stale (the daemon cannot prove a pane is still alive) and only a renderer re-registration flips them back to live — this structurally blocks the stale-read-as-live class of state drift.

Changed

  • The channel wake worker now targets a member's pane PTY directly via its principal coordinate. This fixes a defect where the auto-name memberId (w8-1(claude)) never matched the old agent-slug heuristic, so per-pane mentions now reach the exact pane.
  • Removed the internal local-ui token from message senders and the roster — it now renders as "you" (the on-disk schema stays backward compatible).

Fixed

  • Added a channel-membership cleanup hook on workspace/pane deletion — dead-workspace member rows no longer linger in the channel roster forever.

v3.12.4

Fixed

  • Dev only: npm start no longer opens to a blank, flickering window on macOS. Electron loaded the renderer from http://localhost:5173, which macOS resolves to IPv6 (::1) first, while the Vite dev server listens on IPv4 (127.0.0.1) — so the load failed and Electron retried in a loop. The dev-server URL is now normalized to 127.0.0.1. No effect on packaged builds.

v3.12.3

Fixed

  • Splitting panes no longer randomly kills shells. Splitting a pane (or reattaching after a reboot) could kill a pane's shell with a bus error, leaving "[process exited]" — seemingly at random. The real trigger: during a split or layout transition the pane is momentarily only a few characters wide, and resizing zsh below 7 columns crashes it outright (a macOS zsh 5.9 bug, reproduced 100%). wmux now never applies a terminal size below a safe floor (10 columns), and skips resize signals that don't change the size. Verified: the same narrow-resize test kills 5/5 shells on the old build and 0/5 on this one.