CC Manager UI 0.5.0
Mostly about the app misreading a failure and then doing the wrong thing about it: a few-second server hiccup filed as your five-hour rate limit, a liveness check that kept finding itself, and a resume monitor that could only see work it had started.
Fixed
- A 529 overload was treated as your rate limit, so the run died instead of retrying.
529 Overloadedmeans Anthropic's servers are saturated and it clears in seconds. A session limit means your own 5-hour allowance is spent and only time fixes it. Both wear the word "limit", and dispatch matched them with one pattern list, so a run killed by a brief server hiccup was parked against a reset that had nothing to do with it. They are now told apart, and a transient overload is retried automatically: three tries over about 35 seconds, backing off, before giving up as its own newoverloadedstatus, which is neitherfailed(nothing is wrong with the run) norrate_limited(your quota is fine). The retry only fires when the run produced no output first, so it can never silently redo work you already paid for, and it survives a daemon restart mid-backoff. Ambiguous text still classifies as a quota wall, the conservative default, and a migration relabels rows the old detector mis-filed. - A run could be stuck "running" forever after a crash, and cancelling it could kill an unrelated program. On restart the app re-adopts runs that outlived it, and it is careful not to trust a dead runner's recorded process id, because Windows recycles those numbers. That care never actually happened: the liveness probe searched running processes for the run's spec file by command line, and the search itself carried that text in its own command line, so it always found itself and always answered "still alive". Every Windows reattach therefore trusted a stale id. If that id had been recycled by a live program, the run waited on it forever and pressing Cancel would have killed that innocent program. The probe now excludes itself, and a failed reattach ends the run cleanly with its work still on disk.
- Stray console windows could flash on an ordinary click. Spawning a console program on Windows allocates a console unless the spawn says otherwise, and nothing here said otherwise. It stayed invisible only because the tray happens to launch the daemon with a window-less console that child processes inherit. Started any other way (from a terminal, from Explorer, as the portable exe) the same clicks flashed a real window. The worst of them was the periodic usage check, which runs on a timer, so on machines where
clauderesolves to a.cmdbatch file it was a CMD window blinking on a schedule with no click to blame. Every such spawn now states its intent explicitly, and a repo guardrail enforces both directions of the rule. - The composer claimed "this session is busy" the moment you hit send, with nothing running. Submitting awaits a queue refresh, and the server does not answer until the run is already marked running, so the banner flipped on within the same click and then announced that the message "will queue and start on its own" about one that had just started immediately.
Added
- The auto-resume monitor now finds rate-limited sessions it never launched. It used to look only at queue rows the daemon itself had spawned and tailed, so a session you started yourself (a bare
claudein a terminal, or the desktop app) that died on a 5-hour limit had a transcript on disk, no queue row, and no path into the resume list. The list said "Nothing to resume right now" while real sessions sat at the wall. It now also looks on disk: transcripts touched in the last 12 hours whose tail is the CLI's own limit notice with nothing after it, which is exactly what "still stopped" looks like. Found stops go through the same rails as any other (the weekly usage gate, the per-session attempt cap, the resume buffer, the idempotency check) and carry a Found badge so they never read as something you queued. Still behind the monitor's off-by-default switch. - Downloaded transcripts are named after the session, not its UUID.
Save a copynow writes<session title>.jsonl, falling back to the id only when a title has nothing filesystem-safe left in it. One shared helper backs both the download link and the server'sContent-Dispositionheader, because the browser honours the link's name only same-origin and the header only cross-origin, so fixing one alone would have left the other broken. It strips characters Windows rejects, refuses reserved device names (CON,COM1), trims the trailing dots Windows drops silently, and sends the header as RFC 5987 so an emoji or non-Latin title names the file properly instead of throwing. - Copy the session file to the clipboard. A button beside "save a copy" puts the
.jsonlfile itself on the clipboard, not its text, so pasting into a folder, a chat or an email pastes the actual file under the session's name. A web page cannot do this at all, by design, so the daemon does it. Windows and macOS only, since Linux has no cross-desktop convention for it. - A 10-minute stepper in the composer's "queue for later". The hours stepper now sits beside a minutes one that steps in 10s, and a single button queues the combined delay. With both, the fixed In 15 min and In 1 hour presets were redundant, so they are gone. In 5 hours and Tomorrow remain.
- The scheduler status chip in the header is now a link to the setting it reports on.
- CI actually typechecks now, and it covers the tests too. The job had been named "lint, typecheck, build, test" since day one while never running a typecheck, and something had already slipped through: three portable-window exports went undeclared for two commits because nothing looked.
tests/was outside every tsconfig for the same reason, so a test could only fail at runtime. Wiring it in immediately caught a real error in a new fixture.
Changed
- Pink means "you can click this now". In the composer's "queue for later" popover, Queue for then was pink even before a date was picked, when it did nothing. It is grey until you pick one, and the hours/minutes button beside it follows the same rule at 0h 0m.