Releases: LunarWerxs/AgentHydra
Release list
CC Manager UI 0.13.0
Added
- Quick instance mode opens a compact Claude/Codex instance launcher without starting the
session scanner, database, queue, scheduler, monitor, usage refresh, settings sync, or updater.
Launch it withCCManagerUI.exe --instances,bun run instances, the generated
CCManagerUI Instances shortcut, or the shortcut action in Settings.
Fixed
- The Sessions list no longer stalls the app on first load. Every transcript it showed was being
read and parsed from scratch on each daemon start, all of them at once. On a store of ~1,100
transcripts that meant a 4.6-second wait for the first list and a jump from 101 MB to 3.1 GB of
memory. Parsed transcript metadata is now cached on disk, so a restart is warm; the list reads at
most a dozen transcripts at a time instead of two hundred; and the daemon warms the newest ones in
the background at startup. Same store, same list: 0.35 seconds and a bounded footprint. - Sessions list latency no longer grows with the size of your transcript folder. Building the file
index globs the whole store and stats every file, and that ran inside requests, so each refresh
paid a folder-sized tax (145 ms for 1,255 transcripts, and rising). The index is now served from
the last snapshot and re-swept in the background, which takes routine refreshes from ~150 ms to
~3 ms. Looking up a session that is genuinely missing still re-sweeps, at most once every two
seconds, so a newly created transcript is still found straight away.
CC Manager UI 0.12.2
Changed
- Resuming a Claude Desktop chat now automatically uses the desktop instance that owns that chat,
rather than an unrelated ambient CLI login. The composer makes that default visible and lets you
deliberately choose the ambient login, another signed-in desktop or CLI instance, or a saved
credential account. - Archived conversations are shown by default, session source badges are easier to distinguish,
and the composer makes scheduling the primary Queue action while keeping immediate queueing one
click away.
Fixed
- Weekly Claude quota walls are now recognized from the CLI's structured rate-limit event and
human notice, so affected runs are parked as rate-limited and can be resumed after reset instead
of being reported as ordinary failures. - Composer and queue-builder option menus no longer render empty model, effort, or permission
entries.
CC Manager UI 0.12.1
Added
- Codex Desktop instances can now run side by side. Each managed Codex instance launches the
desktop app with its ownCODEX_HOMEandCODEX_ELECTRON_USER_DATA_PATH, so work, personal, and
client OpenAI logins have independent windows and local state. The Instances view reports which
desktops are running and can open, focus, or quit each one; CLI launch/login remains available on
the same row. - Provider settings and manual ChatGPT handoff. Claude Desktop, Claude CLI, Codex Desktop, and
Codex CLI surfaces can be shown independently. An opt-in composer action creates a bounded,
secret-screened repository context attachment, copies the task prompt, and opens ChatGPT without
automating the user's account or submission.
Changed
- Version tags now publish their tested platform bundles automatically using the matching
versioned changelog section. Release retries update the existing release in place instead of
deleting it or leaving another unpublished draft. - Windows releases now expose an icon-bearing, single-file GUI executable while retaining a
compact ZIP for automatic updates. The web UI is embedded, so no loosewebornode_modules
folders are needed beside the executable. - Connections settings sync now uses the multi-device-safe 1.2 engine, with atomic first-account
seeding, conflict-safe nested patches, token-isolated caching, and a five-second final flush that
cancels a stuck token or network request instead of delaying shutdown indefinitely.
Fixed
- Codex sessions now match the chats shown by Codex Desktop: canonical sidebar titles come from
session_index.jsonl, while subagent rollout files no longer appear as separate sessions with
duplicated titles and forked chat history. Child-agent rollouts remain implementation details of
their parent chat. - Release builds now honor both spaced and
--option=valuearguments, so every platform compiler
writes into the versioned one-executable bundle that the smoke and publication jobs validate.
CC Manager UI 0.11.1
CC Manager UI 0.11.1
This is a focused maintenance release following the larger 0.11.0 provider-session update. It
does not change configuration or require a data migration.
Reliability
- Windows shortcut validation is no longer timing-sensitive on cold machines. The real
PowerShell andWScript.Shellintegration test now has a bounded 20-second allowance instead of
Bun's five-second default. This prevents correct.lnkcreation from being reported as a failure
when PowerShell or COM needs a few extra seconds to initialize.
Session-mapping safety
- Consolidated the verified Claude Desktop/CLI session-sharing rules into the maintained reference
and the scanner's source comments:- Desktop metadata is matched to transcripts only through
cliSessionId. - Both the default Claude store and isolated CC Manager UI instance stores are scanned.
claude://resumeis explicitly treated as a lossy import, not a way to refresh a live chat.- Desktop activity timestamps are not trusted for externally appended turns.
- Desktop metadata is matched to transcripts only through
Documentation
- Expanded the reference with the instance-appearance storage contract: labels, icons, and colors
live in~/.ccmanagerui/instance-meta.json, while profile folders remain stable even when an
instance is renamed. - Removed completed research and release-process notes after moving their lasting constraints into
the live reference and source.
Upgrade notes
- No settings changes.
- No database migration.
- No action is required beyond installing or updating to 0.11.1.
CC Manager UI 0.11.0
Added
- Claude, Codex, and OpenCode conversations now share one Sessions view. Every row is
source-tagged and the list, full-body search, transcript tail, done marks, REST API, and MCP
session tools all understand provider identity. Codex reads active and archived rollout JSONL;
OpenCode CLI and Desktop are both covered through the SQLite store they share. Injected Codex
runtime blocks and provider reasoning records stay out of the human transcript. - Codex CLI instances can be managed alongside Claude instances. Create an isolated
CODEX_HOME, opencodex loginfor the user, launch it in a terminal, rename it, or delete it
with exact-name confirmation. The REST API and MCP expose the same lifecycle.
Changed
- Provider browsing cannot leak into Claude execution. Queue/session composers, rate-limit
discovery, and Desktop-instance filtering remain explicitly Claude-only, while Codex and
OpenCode are read-only conversation sources. OpenCode's database is never offered as a raw
transcript download. - OpenCode full-body search now filters and extracts text inside SQLite. Large tool payloads
are no longer loaded and parsed in JavaScript; against the 260 MB local store this reduced the
measured search allocation from roughly 49 MiB to 5 MiB. - Development now uses Bun's native parallel workspace runner. Removing
concurrently
eliminates a redundant dependency and its shell-command dependency chain. Biome, Hono, Vue,
Tailwind, Lucide, and other compatible dependencies move to their current non-breaking releases. - Manually added dispatch credentials remain portable SQLite values. The app briefly sealed
this one column with Windows DPAPI during the pre-release hardening pass, but that added
machine/user coupling without changing the local database threat model enough to justify it.
A compatibility migration converts any such rows back when the same Windows user can decrypt
them; the per-user state directory and database still receive restrictive filesystem modes. - The completed Codex/ChatGPT/OpenCode research note and the original merge plan were removed after
their work was implemented and verified.
Fixed
- Session metadata caching now replaces an active transcript's previous parse instead of retaining
one cache entry for every appended turn. - Scheduler and monitor numeric settings are finite and bounded, and changing the scheduler poll
interval now updates the live timer immediately rather than waiting for a restart. - Filesystem containment uses resolved path components instead of string prefixes, preventing a
sibling such asinstances-elsewherefrom being treated as a child ofinstances. - Queue writes reject malformed statuses, booleans, positions, account references, and launch
options before they can create invalid persisted state or reach a terminal command. - A selected dispatch account that cannot be read now fails the run instead of silently falling
back to the ambient login. - Child-process tests use the exact Bun executable running the suite, avoiding Windows
bun.cmd
quote loss in updater fixtures.
Security
- The passwordless daemon now refuses every non-loopback bind host, and OAuth callback origins are
restricted to the same loopback set. API bodies are capped at 2 MiB. - User-supplied session-search regular expressions are length-bounded and structurally checked
before execution, preventing synchronous catastrophic backtracking from bypassing the search
deadline. - Terminal launch model and effort values are allowlisted before crossing the shell boundary.
- GitHub Actions defaults to read-only repository contents; only the release job receives write
access.
CC Manager UI 0.10.0
Highlights
Copy the exact session file path. The transcript header and the session right-click menu now
have Copy the session file location to the clipboard. It copies the original absolute .jsonl
path as text, resolved by the daemon rather than reconstructed in the browser.
Shut down the whole app from Settings. The new two-click power control exits the daemon and
signals the tray host to quit, so the watchdog cannot immediately revive an app you intentionally
stopped.
Settings is quieter and more direct. Theme selection and shutdown live in the panel header;
tooltips and the transcript-editor override sit under Appearance → Advanced. The version number is
now both update status and control: green when current, amber when an update is ready, red when
blocked, with a tooltip explaining the state and a click to check or apply.
Added
- Plain-text copying of the original absolute session transcript location.
- Full-app shutdown from the Settings header, protected by a two-click confirmation.
- A verified scoping document for future Codex/ChatGPT/OpenCode session and instance support.
bun run screenshots, a synthetic-data screenshot pipeline that fails on missing fixtures,
page errors, broken view state, or any attempted real API request.- Opt-in drag-and-drop path forwarding in the shared Windows tray launcher.
Changed
- The Instances Plan column now treats a generic live Anthropic tier as Free instead of upgrading
from stale historical Max/Pro flags left behind after a subscription expires. - Appearance settings prioritize everyday controls and tuck specialist options under Advanced.
- Update state and actions are consolidated into the current-version display.
- The README's Sessions, Instances and Queue screenshots were recaptured on the current theme using
synthetic data; captions now match the Plan column and finished-run state shown.
Validation
- CI passed on Ubuntu and Windows: lint, typecheck, i18n, guardrails, production build, and the full
test suite. - Release bundles compiled for Windows x64, macOS x64/ARM64, and Linux x64/ARM64.
- Native Windows, macOS and Linux bundles passed boot/health/SPA smoke tests; Linux ARM64 also passed
its QEMU launch canary.
Full Changelog: v0.9.0...v0.10.0
CC Manager UI 0.9.0
Highlights
The interface now follows Claude's own surfaces. The window used to be a single near-black sheet: every region painted the same token and leaned on hairline borders for structure, so there was effectively one shade on screen. There are now three grounds, using Claude's values directly.
| Chrome (top bar + session list) | #181817 |
| Working area | #1a1a19 |
| Cards, popovers, table headers | #232321 |
| Search + composer fields | #2c2c2b |
| Accent | #d06c74 |
The accent is no longer painted as a background wash. The selected session row and your own chat bubbles were tinted with the accent at 10-15%, which composites over a dark ground into a muddy maroon rather than reading as a highlight. Both are the neutral raised grey now, and the rose is kept for things that are actually accents (Send, Queue, checked states).
Text fields paint their own surface. The kit draws them at 30% alpha, so the token never reached its real value: the search and composer boxes came out darker than intended and had no visible edge. They now paint the surface outright and carry a real outline.
Fixed
- The release workflow no longer trips GitHub's Node 20 deprecation warning:
upload-artifact,download-artifactandsetup-qemu-actionmove to their current majors.
Full Changelog: v0.8.0...v0.9.0
CC Manager UI 0.7.0
Mostly a cleanup release: the session list was full of things that were not really sessions, and the auto-resume monitor was full of work that had already finished.
The session list should look markedly cleaner
- Sessions are named after what you asked, not after a warning notice. The list used to repeat "<local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond..." over and over. On the machine this was found on, that was the title of 103 of the newest 200 sessions. Titles fall back to your first message, and nothing checked whether that message was the CLI talking to itself.
- Transcripts that were never conversations are no longer listed. Checking your remaining quota sometimes has to launch
claudeto ask, and that launch wrote a roughly 3 KB session containing a caveat, a/usageline and nothing else. 127 of the newest 300 sessions were these. They are no longer listed, no longer written among your real sessions, and cleaned up after the check. - New time period filter, set to the last 24 hours. In the
...menu, alongside the instance and archived filters. Widen it to 7 days, 30 days or all time whenever you need to reach further back.
Auto-resume monitor shows only what still needs you
Rows were written when a resume was scheduled and then never looked at again, so resumes that had finished, been cancelled, or whose queue entry was long gone still reported "Scheduled, resumes ~09:14" indefinitely. They are now reconciled against what actually happened. A failed resume is kept and flagged; sessions you have archived are excluded, and auto-resume no longer picks those up at all.
Queue and scheduler
- Clear finished runs in one click, instead of deleting each card by hand.
- "Run at" uses the chat composer's picker: in 5 hours, tomorrow at your configured time, hour and 10-minute steppers, or an exact date. It has also moved up beside Account, since when a run happens is a decision you make up front.
- The scheduler indicators are clickable. The on/off indicator in the queue drawer and the header chip both open Settings at the scheduler, which pulses on arrival so you can see where you landed.
- Fixed: Advanced options was quietly broken. Its three "Default" dropdown entries threw, and the failure took out everything rendered after them in that section.
Instances and Settings
- Instances and CLI instances are collapsible, and the choice is remembered.
- The instance editor applies as you type: the row behind the dialog updates live, so the in-dialog preview is gone and the button says Done.
- The transcript editor setting now shows which editor will actually open a transcript, with the path field tucked behind it.
- Settings dropped the Accounts section, which only ever told you to go to the Instances tab, and gained back a missing gap above the auto-resume monitor.
Full details in CHANGELOG.md.
Full Changelog: v0.6.0...v0.7.0
CC Manager UI 0.6.0
A sessions-list release: the list gains a right-click menu, done marks and an archive scope. It also fixes a menu that quietly froze the entire app.
Fixed
- "Filter by instance" opened nothing and froze the whole app. Clicking it appeared to do nothing, and then no other control responded until you pressed Escape. Both halves were the same bug. reka positions a popup by walking the Vue component tree for the nearest popper root, and the menu was wrapped around its own tooltip, so the tooltip claimed the anchor and the menu's popper never got one. The menu really did open. It just rendered at floating-ui's unpositioned
translate(0, -200%), which is off-screen above the window. Being a modal menu, it also setpointer-events: noneon the page while it was "open", which is what made everything else stop responding. The popper root now lives inside the tooltip, so each anchors to its own element. The advanced-search popover next to it was broken in exactly the same way and had simply been failing in silence, because a popover is not modal and so froze nothing. It is fixed too. A repo guardrail now fails the build on that nesting, and it is tested against both the broken and the fixed shape, because the previous guard for this encoded the wrong cause and crashed on import without ever running. - "Open the session file" asked which app to use instead of just opening.
.jsonlhas no file association on a stock Windows machine, so handing the path to the OS default handler made Windows pop its "How do you want to open this file?" picker. The app now names an editor itself: the first one it finds (VS Code, Cursor, Notepad++, Sublime), falling back to Notepad, which always exists, so the picker can never appear. macOS opens the default text editor. A new Transcript editor setting overrides the choice, and a path that points at nothing falls back to auto-detect rather than leaving the button silently dead.
Added
- Right-click a session. The sidebar list has its own context menu now: mark as done, open the transcript, open or copy the session file, and copy the title, folder or id. Right-clicking acts on the row under the pointer without selecting it, so it never loads a transcript you did not ask for.
- Mark a session as done. A way to say "I have dealt with this" without losing it. The row keeps its place in the list and just stops competing for attention (a check, a struck-through title, dimmed). Marks are stored by the app rather than in the browser, so they survive a cleared browser store. Deliberately not a filter. "Clear all done marks" appears in the list menu once anything is marked.
- Archived sessions are recognised, and hidden by default. The app now reads Claude's own archive flag. Archived is the large majority of a real transcript store, so including them buries the live work. That same ratio is why the control is three-way (Hidden, Shown, Only archived) rather than a checkbox, since finding one archived session in a mixed list is hopeless. The scope is applied before the newest-N cap, so hiding archived returns a full list of live sessions instead of the handful that survived the cap.
- One list-options menu. The sessions toolbar had grown a row of icon buttons, and each new toggle squeezed the search field. Refresh, multi-select, the instance filter and the archive scope now live in a single "..." menu, which lights up whenever something is narrowing the list, so a filter set once and forgotten can no longer read as an empty list with no visible cause.
- A CI guard against vendored-library export drift, so the break this release had to fix cannot recur silently.
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.