Repository navigation
v0.4.0
A smoother session experience
This update fixes a few frustrating session and seat-management issues. Rate limits no longer unnecessarily kill your session, /switch now changes credentials without restarting Claude, and seats consistently keep their identity.
Keeping sessions alive when all seats are busy (#48, #50)
Previously, hitting a rate limit would stop Claude before checking whether another seat was actually available. If every seat was already in use, the session would be killed for no reason — taking your prompt history and any running background subagents with it.
Even worse, the seat that was expected to reset first could sometimes be the seat currently running the session, leaving nowhere to move it.
Now, the availability check happens before Claude is touched.
If there is nowhere to move the session, it is simply parked. Claude stays running, you can keep typing, and your next prompt will move the session to an available seat when possible.
If you leave the session unattended, it can still be resumed automatically when a seat becomes available. That's the one case where restarting is useful, since auto_message can only interact with a fresh process.
cux sessions now also makes this distinction clear: you'll be able to see whether a session is parked or stopped and waiting for a reset.
/switch now switches in place
Previously, /switch and /cux:switch would stop Claude and start it again with --resume.
There was already support for switching credentials without restarting, but the prompt hook was handling the command before that code could actually run.
That's fixed now. /switch changes the active seat in place, so your conversation continues without restarting Claude.
Manual switches also no longer resume into auto_message. If you're sitting at the keyboard and manually switching seats, there is no reason to start an automatic turn that you didn't ask for.
If a prompt was intercepted by the threshold hook before the switch, it will still be replayed normally.
Seats now keep their identity
There was also a subtle issue with how seats were identified.
Seats whose account UUIDs hadn't been recorded in state.json were identified using their email address, while the active login used uuid|org. Because those two formats didn't match, the system could sometimes treat the same seat as two different seats.
This could cause a few problems:
/switchcould switch back to the same seat instead of rotating to another one.- Automatic switching could do the same when the usage cache was cold.
- Two seats using the same email address — for example, a personal plan and an organization plan — could share the same usage-cache entry and overwrite each other's usage data.
All of these paths now resolve the active login to its managed seat consistently.
On the next usage poll, missing account UUIDs are automatically filled in from each seat's stored OAuth information. The usage cache is also re-keyed without losing the existing usage data.
Terminal state after killing Claude (#58)
Killing Claude could leave the terminal in an unusual state, with things like the alternate screen, mouse tracking, or keyboard modes still enabled.
When Claude was launched again, it inherited that state and could start without an input bar until the terminal window was resized.
This was reported, investigated, and fixed by @Orbita-Media.
A few other fixes
/switchis now rejected immediately when there is no available seat to switch to, instead of accepting the command and silently doing nothing.- The capacity check used by
/switchand the pre-check now use the same logic, so they can't disagree about whether a switch is possible. wait_for_resetnow behaves more clearly: if you're actively using a session, it keeps the session open instead of putting it to sleep while waiting for a reset.
Upgrading
Nothing special is required.
After upgrading, the first usage poll will automatically add any missing account UUIDs to state.json and re-key the usage cache.
Both changes remain compatible with 0.3.x, so you can downgrade if needed.