5.4.3 rebuilt the titlebar folder picker around a custom presenter that could leave the panel unsheeted, so clicking Open Folder sometimes did nothing
The picker now uses the plain system open panel again and presents it as a sheet on the main window; Open creates a workspace rooted at the chosen folder, Cancel creates nothing
v5.4.7
Adding a project no longer crashes
The folder picker handed the chosen directory to the workspace builder, which registered its new terminal surface in an Objective-C weak table; a plain Swift object in that table crashed it once enough surfaces had piled up
The registry now uses Swift's own weak references, which cannot hit that path
v5.4.3
Context usage, finished turns, and sign-in stay honest
The context chip uses the latest request instead of adding every tool-loop request together, so a 128k model no longer shows 518k / 128k
Reloading a finished conversation returns it to queued instead of leaving the changes panel on running
An expired sign-in falls back to guest. Running out of quota still shows upgrade, switch-account, and bring-your-own-key hints, and does not sign you out
Signing out is remembered across the release app and a tagged dev build, so a revoked session is not adopted again
Open Folder confirms the highlighted project when recents or search left the browser on the starting directory
v5.4.4
Open Folder adds the highlighted project
Picking a folder from Recents or search and clicking Open still created a workspace for the panel's starting directory, usually Documents, or the click did nothing
The highlighted folder is now the directory that gets added, and Open selects that folder instead of stepping into it
v5.4.5
Open Folder stays open when you click it
The folder panel was presented during the same click that asked for it, so that click dismissed the panel and no workspace was added
The panel now appears after the click, as its own window, instead of a sheet under the terminal
v5.4.6
Adding a project now shows the project
The workspace was created correctly all along, but Dashboard and Notifications render over the terminal column, so the new workspace was built behind that page and the click looked like it did nothing
Creating a workspace now leaves that page, in the window that owns it; a window you left on Dashboard keeps showing Dashboard
v5.4.0
Agent shell commands can no longer write into the primary checkout
`imux_terminal_exec` runs with cwd in the thread worktree, but absolute paths in the command text still resolved to the primary checkout, so redirects could write the real tree
Commands are now rewritten before execution: absolute primary paths, `~`-relative paths, case-variant paths on case-insensitive volumes, symlinked checkout aliases, pure `..` climbs like `cd ../../..`, and `$VAR`-prefixed paths using variables defined in the inherited environment
Variables assigned inside the command, undefined variables, nested expansion, and `file://` URLs are deliberately left untouched; worktree parent directories are pre-created so moved redirects do not fail
Turn-honesty classification, capability scheduling, and the read-only shell classifier were also tightened this round
v5.4.1
New Workspace no longer freezes the app
Creating a workspace triggers semantic re-indexing; remote embedding batches waited on an unbounded semaphore and `embedAll` had no deadline on its group
A completion handler that never fires — DNS, PAC, or proxy stall — parked a dispatch thread permanently, and sixteen concurrent batches exhausted the pool so every click stopped responding
Each batch now waits at most `requestTimeout + 10`, cancels its task on timeout, and the group wait is bounded as well
Open Folder now falls back to an app-modal panel when the host window already has a sheet, instead of being queued invisibly by AppKit
Rail settings menu items run again: the popover reports its own window, so a menu click is no longer mistaken for an outside click
Title bar simplified: the folder path became an icon with the full path in its tooltip, and the command palette is an icon-only segment beside Go to Workspace
v5.4.2
Opening a project on an external disk lands in that folder
Volumes under /Volumes start the shell in the home directory so the first terminal does not stall on a slow disk, then send a follow-up cd
That cd was a paste. Once the shell enables bracketed paste, a newline is not submitted, so the workspace was named for the project while the prompt stayed at ~
The cd is now Ghostty startup input and runs as the shell starts
Open Folder from the dashboard empty state, the command palette, the title bar, and Agent Chat reveals the new workspace's terminal, and the chosen folder is recorded as a recent project
v5.3.5
Chinese safety matching restored; the web suite runs again
Membership safety rules wrapped every Chinese keyword in \b(...)\b. A word boundary never holds next to CJK (both neighbours are word characters), so each Chinese alternative was dead — no error, no failing test: 制作炸弹 / 儿童色情 / 教我自杀 passed content safety, 儿童色情 / 银行卡盗刷 passed search, 修复 missed dev-intent, 美女 missed segment labelling, 裸女 / 一键脱衣 / 习近平画像 passed the image and video prompt gate
Chinese branches now sit outside the boundary group. image-safety.ts also regained normalizeImagePrompt and evaluateImagePromptRules, restoring leet / zero-width / dotted evasion folding (n.u.d.e girl, p0rn poster) and the cosmetic-nude allowlist (nude lipstick, nude heels), with prompts matched raw and normalized
imagine-segments.ts had lost 13 concept rules (dog, earbuds, robot, fox, dragon, perfume, watch, sky, clouds, hills, necklace, coat, charging case), 11 META_TAGS entries (showcase, product, chibi, portrait, haze, logo, street, enhance, editorial, fantasy, family) and STYLE_NOISE_RE / SHOWCASE_QUALITY_TAIL_RE in the same rewrite, so showcase stills were labelled with whole lighting clauses
Six test files imported vitest, which is in no lockfile here — the repo runner is tsx --test — so they had never executed, which is why a dead safety layer survived. Ported to node:test with every assertion preserved: app/lib/**/__tests__/*.test.ts is now 224/224 green (was 221 pass / 3 fail)
v5.3.6
Add project responds again; the Open Folder panel always appears
Every Open Folder entry point (sidebar header, empty sidebar, File menu ⌘O, dashboard, Agent Chat) funnels into AppDelegate.openFolderFromTitlebar(), which called NSOpenPanel.runModal() synchronously from a SwiftUI button action
When imux was not the active app, or the key window was a panel/popover, the panel was never brought forward, so the click produced nothing at all — not even a visible cancel
The path now activates the app, resolves a visible main terminal window (keyWindow → mainWindow → orderedWindows, skipping auxiliary panels) and presents the panel as a sheet, falling back to an async begin() when no host window exists
The File menu entry reuses the same function instead of its own runModal(); the two sidebar entries switch to the workspaces list from the panel's completion handler, since the old synchronous tabs.count comparison cannot fire after an async panel
v5.3.7
Dashboard Open Folder now reveals the workspace it created
5.3.6 made the folder panel asynchronous and moved the sidebar callers into its completion handler, but the Dashboard entry still compared tabs.count immediately after the call
That comparison read the pre-panel count, so a successful add left the user on the dashboard with the new workspace hidden underneath — indistinguishable from a no-op
The count is now compared inside the completion handler, matching the two sidebar entries; every other caller does not need the result of the call
v5.3.4
Adding a project no longer deadlocks the app
Session autosave wrote the window-geometry blob to UserDefaults from the background sessionPersistenceQueue; UserDefaults.set synchronously posts UserDefaults.didChangeNotification, which SwiftUI answers on the same thread with UserDefaultObserver -> Update.begin() -> _MovableLockLock
That lock has to be taken from the main thread's layout context, so the background queue wedged permanently — and every later sessionPersistenceQueue.sync (new workspace, quit, update install, last-window-close) blocked the main thread behind it
Reproduced on 5.3.3: the persistence thread sat inside _MovableLockLock for the whole 3 s sample window (2311/2311 samples, same thread id across three samplings 32 minutes apart) while the main thread was idle
Geometry writes now run on the caller's thread (AppDelegate is @MainActor); the background queue only performs file I/O. Regression shipped in 5.3.0
v5.3.3
Sidebar module extracted; status line survives compact widths
Workspace monitor logic and sidebar cards move out of the ContentView monolith into Sources/Sidebar (WorkspaceSidebarMonitor + WorkspaceSidebarCard), monolith budgets ratchet down
The per-row supplementary status line (state · goal) now renders on the selected row at compact sidebar widths, instead of vanishing under the 250pt threshold
Four new branch tests pin blocked/failed routing, reviewing-activity ordering, dirty/running signal placement, and per-primary detail progress
v5.3.1
Agent Chat hardened: no headless freezes, honest turn verdicts
Host gates no longer freeze headless turns: a trajectory_pause on highErrorRate / passiveRead / unverifiedWrites auto-continues with a repair nudge under bypassApprovals instead of waiting on a confirmation card nobody can click
Multi-line and heredoc commands are refused by the live pane and routed to the background helper (/bin/zsh -c), so long commands stop burning a full timeout per attempt
Recovered failures no longer paint a false "not done": a failed call the same tool later answered successfully is not a turn failure, and read-only terminal runs no longer inflate the change count
Completion claims are judged on user-visible prose only — a private <thinking> line can no longer flip a correct answer into "unverified"
Chat notices are tiered receipt / action / internal, so host bookkeeping and machine verdicts stay in the transcript and journal but out of the visible timeline; raw error refs are opt-in
A down specialty upstream falls back to the main model: search 503 and OCR 504 now re-issue the same job instead of failing the turn, on the IDE, web chat, and mobile
Remote workspaces reach full UI parity: screenshots, file tools, AX tree observation (helper-first, JXA fallback), and UI actions via the one-shot helper; goal verifiers run remotely so local state can no longer fake a pass
Four read-only agent tools ship: imux_automation_runs (append-only run ledger), imux_automation_list (schedule + daemon heartbeat), imux_task_timeline (checkpoints + verification receipt evidence), imux_inbox_audit (spool backlog + open proposals)
Large release binaries (2.1GB/1.5GB zips + 71 dmg/apk artifacts) removed from git history; they now ship exclusively through the website download surface
v5.2.6
Proposal notifications to phone, mobile 0.2.10, Windows 5.2.6
Proposed-action cards (automation_due, ci_wake) now trigger an outbound notification to the phone when the app is not active. Previously they only appeared in the Mac inbox and cloud projection; phone users had to open the app and wait for the next poll
imux-mobile 0.2.10 adds proposal deep-links (/activity) and an attention-loop that polls listDevices for new proposals, with per-proposal seen-tracking to avoid duplicate notifications
Windows channel bumped from 5.2.3 to 5.2.6, aligning with macOS
v5.2.5
Tool output no longer dropped under load, tool cards read as prose
Command output larger than the ~64 KiB pipe buffer could be truncated or lost entirely. The process-exit handler closed both pipe read ends before the buffered bytes had been forwarded, and the drain wait was capped at 1 s — short enough that scheduling under load could expire it first. Every git and CLI call that goes through this runner inherited the risk, worst of all the Agent Chat gate receipt, which read a passing gate as `no output captured`
The exit handler now leaves the pipes alone and the main path waits for EOF, falling back to an explicit teardown so a call can neither hang nor leak a file descriptor
Agent Chat tool cards and the run inspector show tool results as labelled lines instead of raw JSON envelopes: protocol scaffolding (`ok`, `runner`, `imux.repair`, pagination cursors) is dropped, and a body with nothing readable in it is omitted rather than printed as `{}`. Non-object payloads — markdown research, plain stdout, multi-line diffs — pass through untouched, and field names stay verbatim so a report remains greppable against the raw output
Declining a confirmation with `user_skipped` now classifies as denied rather than failed: it is a deliberate choice, so it no longer paints a red chip or inflates the run's failure count
The confirmation sheet drops the numbered 1/2/3 rows and the hotkey legend that duplicated the buttons beside them. Short single-line commands render inline instead of inside a bordered box that mostly held empty space, and sandbox scope and the risk warning share one row, since that is what the user is approving
v5.2.4
Membership image calls resolve their upstream key per host
Image calls to the membership relays sent a single credential to every upstream host. The hosts serving `z-image*` and the hosts serving the edit models are separate instances with separate token stores, so the cluster-first attempt failed authorization on a host that did not serve that model before ever reaching the one that did
The key is now resolved per host on both the generations and edits routes; with no explicit vision key configured it falls back to the previous single-key behaviour, so single-host setups are unaffected
Checked against the live relays: the turbo, image-edit, and portrait paths are each served by the host that holds their key, so this removes a wasted attempt rather than restoring a missing engine
v5.2.3
Agent Chat pauses once on a spinning turn, atomic multi-file apply
A spinning turn now gets one confirmation instead of running to the hard ceiling: 12 reads with no edit, 10 edits with no test or lint, or an error rate above 40% in the last 8 calls triggers the pause. Three late successes count as recovery
The agent loop ceiling moved from 12 iterations to 24, matching Clavue CLI `maxTurns`; the second-to-last iteration still forces a final answer, and explore subagents stay shorter at 8
Accepting a multi-file diff is one write instead of one write per file: the selected hunks compose into a single patch, so a failure writes nothing and reports no affected paths
`imux_glob` finds files by name without walking one directory at a time — read-only, same path authorization as `imux_list_files`, `*` stays in one component and `**` crosses directories
Windows channel now ships 5.2.3, aligned with macOS 5.2.3 (clean repack, EV dual-signed)
v5.2.2
Agent Chat judges its own turns with jev
Every turn is graded against the trajectory before it closes: a stalled run, an unsupported success claim, or a done-claim that contradicts failed tools can no longer be reported as done
The verdict renders as a quality badge on the turn, so the user sees why a turn was held open instead of guessing
Available as a manual `imux_judge` tool and on automatic per-turn judging
Windows channel promoted 0.2.6 → 0.3.2 on the clean-repacked, EV dual-signed installer and portable builds
v5.2.0
User-defined slash commands, grouped / menu
Any markdown file in a workspace .imux/commands/, the app support commands dir, or ~/.clavue/commands/ becomes a / command
Frontmatter supplies name, description, and argument-hint; bodies support $ARGUMENTS and $1…$9, and append the argument when no placeholder is present
The / menu groups rows into Commands, Skills, Custom, and MCP, and each section caps at three rows behind its own Show N more
A project command file shadows a user file with the same slug
Expanding a section keeps the highlight on the same row instead of shifting it onto a different command
v5.2.1
Compaction keeps both ends of a turn, drops the four-turn cap
The summary that replaces old history previewed each turn from its opening only; that text is the model's sole record of the turn, so a head-only cut deleted every long turn's conclusion
Turns are now bounded head+tail around an explicit omission marker — 1,200 characters for user turns, 2,000 for assistant turns
Compaction no longer keeps just the last four assistant turns; earlier decisions the user may still reference are carried
A truncated turn now says how much was omitted instead of reading as a complete one
v5.1.25
Inbox reclaim for leftover AI sessions, lease-based replay prune
One Inbox card for closed sessions whose processes still hold RAM; reclaim is user-confirmed and gated on pid plus start time, never pid alone
A live pane, tracked agent, missing close intent, or unreadable identity is warn-only — the card reports it and the button stays off
Launch drops unreferenced scrollback replay files; a file the restore shell has not consumed yet is kept
v5.1.24
Chat groups by project, honest controls, single-copy retry
History search sections conversations by project; the Agents list grows project headers once it spans more than one
⌥⌘L to focus the composer is a real setting — the overflow row and the key monitor read the same live binding
Retry re-runs the same turn instead of appending a second copy of your question; closing a tab confirms before deleting a transcript
Tool elapsed ticks while running and freezes from timestamps when done; disabled icons always dim
Official clavue-2.1* turns return native tool calls; inspect-only workspace questions force a first-hop tool; a gateway 502 fails after one retry
Streaming stays pinned, thinking shows live, edit-and-resend stays in-thread, and the composer morphs Send / Queue / Stop
Opening Notebook resyncs the Ghostty portal; the floating attention capsule is opt-in and no longer covers a running terminal
v5.1.21
Colored code, lint before Keep, Cursor-shaped explorer menu, imuxd
Syntax coloring in Agent Chat diffs, transcript code blocks, and the file editor (20 languages)
Changes runs swiftlint / eslint / ruff over changed files and badges findings per file; Fix with Agent hands them to the composer without sending
Explorer context menu: Open in Integrated Terminal, Open Folder as Workspace, Add to (New) Agent Chat, Find in Folder, Copy/Paste files, Copy Relative Path
imuxd LaunchAgent watches .imux/automations/*.md schedules while imux is closed and puts a card on the Inbox; Approve runs it as one turn
Failed tool results are valid JSON again; 152 strings that only had a Chinese default now ship in four languages
v5.1.22
Bring your setup from other clients
First-run step and Settings → Agent → Import scan Cursor / VS Code / Claude Code / Codex read-only; tick projects, rules, MCP servers, theme, keybindings
Rules land in .imux/rules/imported-*.md with provenance; MCP servers are added disabled with env values blank; credentials are never copied
Each row shows Direct or Partial fidelity; chat databases, extensions, and Cursor's skill pack are listed as not applicable with the reason
Cursor agent transcripts appear in External Sessions (read-only) and can be continued in Agent Chat
v5.1.20
Stay in imux for review; unblock clock on Inbox
Keep/Drop remains the only accept/reject for agent file mutations; hunk chrome is not a second review UI
Waiting-for-you Inbox rows stamp waiting→decide seconds in memory; CLI waiting without a sample is dropped
Monolith line-count budget is green after splitting ContentView, AppDelegate, Workspace, TerminalController, explorers, and Agent Chat store/tools
v5.1.19
Cursor-shaped @ mentions and a quieter composer
Empty @ shows recents plus Files & Folders, live Terminals, Past Chats, Branch, and Browser
CLI plan Import/Inspect lives in the message column; quota and rush-grab stay in Account
Status-strip layout cluster is icon-only; the titlebar drops the always-on GUI pill
v5.1.16
Blank terminals rebind instead of staying empty
Switching tabs or workspaces rebinds the terminal portal and redraws the selected surface
A shell that already exited no longer leaves a dead empty pane
v5.1.12
Installer helper timeout is no longer a permissions error
Sparkle 4005 after a successful download is an installer-agent timeout, not “move to Applications”
Sparkle 2.9.6 probes the installer agent on launch; extraction progress is throttled
5.1.5 still needs one manual DMG from https://www.iccjk.com/download; later in-app updates then use 2.9.6
v5.1.11
Proposed Action cards and Keep/Drop as the default path
CI/PR cards are the same on Inbox, Agent Chat, and imux Mobile; Approve does not start a silent loop
After agent file edits, Review comes forward with Keep (stage) and Drop (restore HEAD)
New Agent Chat threads use Serious Engineering until you pick Fast Chat or Scout
v5.1.8
Deliver isolated worktree changes from Composer
Composer Changes shows Isolated + Deliver when the agent wrote in a worktree; Keep All still only stages that tree
Titlebar GUI ↗ installs or opens Clavue; phone and chat confirm, then open the official installer
v5.1.9
Official star icon restored
macOS AppIcon uses the star monogram again; 5.1.8 had shipped the legacy im lettermark
Website Clavue diamond and imux star marks restored after a rsync overwrite
v5.1.10
Updater no longer hides a found release
Sparkle feed hits are remembered even when the silent download does not finish
A 10s Check for Updates timeout no longer shows No Updates Available if a newer item was already found
v5.1.6
Optional Clavue host worktree
Default remains a local isolated tree under .imux/worktrees
Host file tools use public match, tree, and blob APIs; shell and git stay on this Mac
v5.1.7
Chrome and secrets survive restart
Agent Chat pane visibility, detail sidebar collapsed state, and preferred browser profile restore with the session
Password, supervisor API keys, and Ghostty extra config prefer Application Support/imux/ first
v5.1.1
Honest turn close · shared verify rule
Turn close refuses unverified, stalled, or dishonest completion claims; Mission loops hold once then continue
Verify evidence: git inspect only with a successful mutation; a failed test is still verify; a failed edit is not a mutation
Sparkle appcast and latest.json on 5.1.1 (build 336)
v5.1.2
Honest transcript · clickable work
Host receipts and preamble-only closes stay out of the assistant hero
Read/Edit paths and backtick citations open in the imux editor; one primary diff card
Sparkle appcast and latest.json on 5.1.2 (build 337)