v0.4.0
A meaty release — the entire tabs + split-pane layout has been rebuilt on dockview (the fragile detached-terminal overlay is gone), the sidebar got pinning + drag-reorder + a proper active-agent highlight, per-provider permission modes replace the old autonomousMode boolean, Claude Usage now tracks the account you're logged into via read-only OAuth, and the terminal feels meaningfully faster under heavy output.
🪟 New layout engine — dockview, with kept-alive terminals
The biggest architectural ship in this release. The old binary-tree split-pane plus hand-positioned terminal overlay (a recurring source of geometry desyncs on resize/drag/sidebar-toggle) is gone, replaced by dockview with its panels mounted-always. xterm.js terminals now survive any drag/resize/reorder without remount.
- 🏗️ #263 — Tabs + split-pane rebuilt on dockview, default on. Layout topology is now owned by dockview (model + toJSON/fromJSON); Zustand keeps content. Drag-to-edge splits, native tabs per group, command-bar header. The hidden
groupsworkspace-swap behavior is gone — one canonical layout, no surprise rearrangements when you click an agent. (Breaking change for anyone who relied on the workspace-swap behavior.) - 🧹 #266 — Removed the legacy layout engine entirely. ~1,500 lines of binary-tree, detached overlay, geometry-sync, and groups-slice machinery — gone. dockview is now the only layout engine; the
layoutEngineflag is removed.
📑 Sidebar overhaul — easier to find what you're talking to
Make the agent list usable when you have a lot going on.
- 🌳 #249 — Default to the hierarchical view. New users + anyone who hadn't explicitly picked now lands on the org-chart view first. The show-exited-agents toggle (and the exited list it surfaced) is gone — exited agents stop cluttering your sidebar.
- 📌 #250 — Pin agents + drag-reorder. Flat view now has a pinned section (top) and unpinned section (below). New agents land at the top of unpinned; pin/unpin moves them between sections; drag to reorder within either section. Survives reloads.
- ✨ #248 — Brighter active-agent highlight. A gold ring + soft glow makes the currently-displayed agent immediately findable — even in a long list. Works in both flat and hierarchical views; theme-aware (navy+gold in Midnight, amber in Daylight); coexists with the notification badge so you can still see "this agent has new activity" on the one you're watching.
- 📍 #255 — Vertical pin icon in flat-view rows. Small visual polish on the hover-reveal pin button.
🛡️ Per-provider permission modes
The old autonomousMode: boolean flag was too coarse for three providers with different permission semantics. Replaced with a per-provider enum that maps to each provider's native flags — and the default is now fail-closed.
- 🎚️ #257 — Pick a permission mode per provider. Four modes:
default(ask on every tool use),auto(auto-accept edits),plan(read-only investigation),bypass(skip all prompts). Settings hold a global default; the create-agent panel lets you override per spawn. Each provider maps to its native flags under the hood (--permission-modefor Claude,approval_policyfor Codex,--approval-modefor Gemini). OldautonomousModesettings are scrubbed-and-warned on read. - 🔒 #261 — Default permission mode is
default, notbypass(fail-closed). New agents now ask for permission unless you explicitly opt into a more permissive mode. Safer default; existing built-in templates updated to match. - 🏷️ #265 — Clearer permission-mode labels. "Ask" instead of
default, "Accept edits" instead ofauto— the dropdown now reads in plain English instead of internal enum names.
🔑 Claude Usage knows which account you're logged into
Claude Usage now auto-detects your current Claude Code account — even when you switch logins.
- 🪪 #264 — Read-only OAuth account detection. The plugin reads CC's own OAuth token from your keychain and asks
claude.ai/api/oauth/usagedirectly. Works on a clean install (no live session needed), surfaces full per-model + extra-credits breakdown, and never refreshes the token (refreshing would invalidate CC's own session). Manual session-key paste still wins as an override. Removes ~946 lines of earlier cookie-scan machinery in the process. - 🔄 #258 — Switch accounts when a new Claude session is detected. Intermediate mechanism shipped earlier in this release cycle — server scanned running
claudeprocesses and adopted the freshest external session's cookie. Superseded in this same release by #264, which doesn't need a live session.
⚡ Terminal performance under heavy output
Long-running output (npm install, make build, busy agent streams) now feels faster.
- 🏎️ #260 — Server-side frame coalescing on by default. Multiple PTY chunks within a short window collapse into one WebSocket frame — fewer frames, less overhead per byte, smoother streaming.
- 🔬 #253 — Frame coalescing, flag-gated + ablation harness. The mechanism + a measurement harness; #260 flips the flag default after the data was clean.
🩹 Reliability + tooling fixes
- 🔁 #254 — Resume agents after self_exit.
self_exitwas hard-deleting the agent record, making "resume" fail with "resumeAgentId not found." Now self_exit soft-exits (record kept withreason: "self_exited"), symmetric withkill_agent— resume works on any exited agent regardless of how it exited. - 📋 #244 — Release notes include every changeset. The release-notes consolidator was reading only one package's CHANGELOG and silently dropping entries from changesets that didn't list it. Now reads all per-package CHANGELOGs, dedups by PR, and renders one line per PR.
- 🚧 #259 — Quarantined the
usage-queue-sim-integrationflake. Test is exposed to a known auto-trust ↔ TUI-stdin race (ADR-036). Skipped pending a proper fix; other CI signal preserved.
📦 Install: curl -fsSL https://raw.githubusercontent.com/aterrylu/autonomOS/main/scripts/install.sh | sh && autonomos start
🖥️ Desktop app: download the universal DMG from the assets below
🔄 Auto-update users (v0.3.0): the desktop app will update itself on next launch
Thanks for using autonomOS! 💛