Releases: OpenSource03/openacpui
Releases · OpenSource03/openacpui
v0.9.1 — Codex Reliability, Type Safety & README Overhaul
Changes
🔧 Codex Engine Fixes
- Image attachment wire format — Codex image turns now correctly convert
ImageAttachment[]to the Codeximage/localImageinput format via a newimageAttachmentsToCodexInputs()helper. Previously images were passed raw and would fail silently. send/sendRawsplit —sendRawis now a real low-level path (no user-message append, returnsboolean, resets processing state on failure). Previously it was aliased tosend, which caused duplicate messages in queued flows.- Queue drain routing — Queued messages for each engine now send directly via IPC with the correct session ID and effort level, instead of routing through hook methods with potential stale closures.
- Stuck processing state —
setIsProcessing(false)is now explicitly called on queue send errors so the input bar never stays locked after a failure. - Live send path —
displayTextand typed image inputs are now forwarded correctly on live Codex sends; removed unsafeas unknown[]casts. - Client info version — Codex app-server handshake now reports the real runtime
app.getVersion()instead of a hardcoded"0.1.0".
🏗️ Type Safety
useClaudereturn shape —setIsProcessingis now exported, completing the engine contract shared by all three engines.title-gen/commit-genIPC — Engine parameter type widened from"claude" | "acp"to include"codex".- Preload types —
codex.sendimages typed asCodexImageInput[];codex.logintype narrowed to"apiKey" | "chatgpt". - Plan step status normalization —
codexPlanToTodosnow handlesinProgress,in_progress, andin-progressvariants.
🧹 QoL
- Removed stale
console.logdebug calls fromuseSessionManager.
📄 README
- Reflects the three-engine architecture (Claude Code, Codex, ACP) with a requirements table.
- Agent management now points to Settings → ACP Agents with Agent Store and My Agents tabs — manual
agents.jsonediting removed. - Added: Spaces, git worktrees, voice input (native + Whisper), OS notifications, auto-updates, session search, MCP panel, Changes panel.
- Added note about unsigned binaries and how to bypass OS warnings.
- Added Windows ARM64 to the install table.
- Removed outdated Glass UI mention and stale "documentation coming soon" note.
Full Changelog: v0.9.0...v0.9.1
v0.9.0 — Codex Engine, Plugin Architecture & Reasoning Effort
What's New
🔌 Engine Plugin Architecture
- EngineId type system — replaces boolean
isACPdispatch with proper"claude" | "acp" | "codex"enum - PermissionBehavior / RespondPermissionFn — shared permission types across all engine hooks
- EngineHookState interface — canonical contract between engine hooks and session manager
- Tri-engine dispatch — session manager cleanly routes to useClaude, useACP, or useCodex
🤖 OpenAI Codex as First-Class Engine
- Codex app-server integration — full JSON-RPC 2.0 protocol over stdio (JSONL)
- 355 auto-generated TypeScript types from
codex app-server generate-tsfor complete protocol coverage - JSON-RPC transport layer — request/response tracking, server-initiated request bridging, notification dispatch
- 11 IPC channels — start, send, stop, interrupt, approval response, compact, list-models, auth-status, login, resume, set-model
- Binary auto-download — resolves codex binary from system PATH, known locations, or auto-downloads via npm
@openai/codex - Auth dialog — API key input or ChatGPT OAuth browser flow on first use
- Session revival —
thread/resumewith persistedcodexThreadIdfor seamless session restoration
🧠 Per-Model Reasoning Effort
- Effort dropdown — select reasoning effort per model: none, minimal, low, medium, high, xhigh
- Model-aware options — each Codex model advertises its supported effort levels with descriptions
- Default effort — automatically set from the model's
defaultReasoningEffort - Effort passed to turn/start — applied on every message send
🛡️ Enhanced Approval System
- "Allow for Session" button — Codex approval prompts offer one-click session-wide permission
- Server-initiated request bridging — Codex JSON-RPC approval requests properly bridged to the permission prompt UI
- Background session approval routing — non-active Codex sessions route approvals to the background store
📦 Codex Model Selection
- Dynamic model list — populated from Codex
model/listresponse, not hardcoded - Engine-aware model dropdown — shows Codex models when Codex is active, Claude models when Claude is active
- Model validation — server-side
pickModelIdvalidates requested model against available models
🔧 Background Session Support
- handleCodexEvent — background session store accumulates Codex events for non-active sessions
- Streaming in background — agent message deltas, tool calls, and reasoning all tracked while session is inactive
- Exit handling — Codex process exit properly triggers session cleanup and UI state reset
Full Changelog: v0.8.1...v0.9.0
v0.8.1 — Linux arm64 + CI fixes
Fixes
- Linux arm64 support: Sequential x64/arm64 builds with merged
latest-linux.ymlmanifest (single--x64 --arm64invocation fails due to AppImage cross-arch vendor binary conflicts) - Linux config: Removed hardcoded arch from targets — CLI controls architecture per build
- Removed mica-electron: Cleaned from all configs (asarUnpack, platform file exclusions, tsup externals, package.json)
Full Changelog: v0.8.0...v0.8.1
v0.8.0 — Git Worktrees, ACP Utility Sessions & Streaming Polish
What's New
🌳 Git Worktree Management
- Create, remove, and prune worktrees directly from the Git panel
- Automatic worktree discovery — detects linked worktrees alongside primary repos and sub-repos with
wt/main/subbadges - Agent Worktree selector — per-project dropdown to point sessions at an isolated worktree instead of the main repo
- New IPC channels:
git:create-worktree,git:remove-worktree,git:prune-worktrees
🔌 ACP Utility Sessions
- Title and commit message generation now route through the active ACP agent connection — no separate SDK process needed
- Ephemeral utility sessions run on the existing connection with auto-denied permissions (text-only prompts)
- New
acp-utility-prompt.tsmodule for one-shot prompts over an existing ACP connection
✨ Streaming UI Overhaul
- TextShimmer component (powered by
motion) replaces the CSS-only wave animation for tool calls, thinking indicators, and subagent steps - "Thinking..." shimmer at the session level when the model is working but hasn't started outputting text or tools
- Sticky auto-follow scroll — chat stays pinned to bottom during streaming, unlocks only on manual upward scroll
- Hardened streaming text reveal against unbalanced markdown backticks and code block transitions
- Removed blinking cursor placeholder for empty assistant messages
🎨 ChatHeader Redesign
- Model badge, permission mode, cost, and session ID consolidated into a single info tooltip (ℹ️ icon)
- Processing spinner shows model and permission mode on hover
- Cleaner, less cluttered header
🏗️ Build & Platform
- Linux arm64 builds (AppImage + deb)
- Windows arm64 installer with arch-specific filenames to prevent collisions
- Unified per-platform CI jobs — each platform builds both architectures in a single job to prevent
latest*.ymlrace conditions - Removed
mica-electrondependency (replaced bymotionfor animations) - Simplified icon handling — packaged builds use the platform bundle icon
📁 ACP File Operations
readTextFilenow supportslineandlimitparameters for partial readswriteTextFileauto-creates parent directories- Both accept
pathoruriparameter (backward compatible)
Full Changelog: v0.7.4...v0.8.0
v0.7.4 — Windows arm64 support
Changes
- Proper Windows arm64 support: Both x64 and arm64 NSIS installers are now built in a single CI job, producing arch-specific filenames (
OpenACP-UI-Setup-0.7.4-x64.exe,OpenACP-UI-Setup-0.7.4-arm64.exe) and a unifiedlatest.ymlso auto-updater serves the correct architecture. - Unified CI structure: Each platform (macOS, Windows, Linux) now has its own dedicated build job — no more matrix races on update manifests.
v0.7.3 — Fix updater arch mismatch on macOS
Fixes
- Auto-updater serves wrong architecture on macOS: The arm64 and x64 CI jobs raced to publish
latest-mac.yml— whichever finished last overwrote the other, causing half of macOS users to download the wrong binary. Now both architectures build in a single job solatest-mac.ymllists both ZIPs and electron-updater picks the correct one. - Auto-updater manual install cache path (from v0.7.1):
findUpdateZip()looked in~/Library/Application Support/Caches/...instead of~/Library/Caches/....
v0.7.2 — Test release
Test release to verify auto-updater works correctly after the cache path fix in v0.7.1.
v0.7.1 — Fix auto-updater cache path
Fix
- Auto-updater manual install fallback: Fixed incorrect cache directory path in
findUpdateZip()— was resolving to~/Library/Application Support/Caches/...instead of~/Library/Caches/..., causing the manual macOS install fallback to fail with "ZIP not found in cache" after Squirrel.Mac rejects unsigned builds.
Details
The root cause was path.join(app.getPath("userData"), "..", "Caches", ...) only navigating up one level from ~/Library/Application Support/OpenACP UI/ to ~/Library/Application Support/, not to ~/Library/. Fixed by using path.dirname(app.getPath("appData")) which correctly resolves to ~/Library/.
v0.7.0 — Notifications, Cached ACP Config & Cross-Space Navigation
What's New
🔔 Notification System
- OS notifications + sounds for permission requests, plan approval, user questions, and session completion
- Per-event configuration with three trigger modes: Always, When Unfocused, Never
- New Notifications settings panel in Settings for fine-grained control over each event type
- Clicking an OS notification focuses the app window
⚡ Cached ACP Config Options
- ACP agent config dropdowns now persist between sessions — when you select an agent, it shows the last-known configuration values before the session starts
- New
agents:update-cached-configIPC channel for fire-and-forget cache updates from the renderer
🔀 Cross-Space Navigation
- Switching to a session in a different space (e.g. clicking a permission toast) now automatically switches to the correct space
Full Changelog: v0.6.2...v0.7.0
v0.6.2
What's New
- Live model switching — Change models mid-session without restarting via SDK
setModel(), with proper persistence and error handling - Model resolution — New utility maps between runtime model names (e.g.
claude-opus-4-20250514) and picker aliases (e.g.default) using family/variant matching - Streaming animation overhaul — Replaced React state-based chunk animation with DOM-level
useLayoutEffectfor per-token fade-in while always rendering full markdown (no more plain text → markdown flash) - Unsigned macOS updater — Manual install path for unsigned apps: extracts ZIP, swaps
.appbundle, strips quarantine xattr, and relaunches (falls back to GitHub release page on failure) - Streaming race condition fixes — Captures
messageIdbeforesetStateupdater runs, clearsisStreamingon text snapshot, safety net on result event - InputBar UX — Permission mode dropdown always accessible during processing, thinking toggle gets proper disabled state, context gauge uses click guard