Releases: OpenSource03/harnss
0.21.5
fix: enable shell mode for ACP agent spawn on Windows On Windows, `npx` is a `.cmd` batch wrapper. Node's `spawn()` doesn't resolve `.cmd` extensions, causing ENOENT even when npx is on PATH. Adding `shell: true` on win32 lets cmd.exe handle the resolution. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
v0.21.4 — Agent Control, Transcripts & Streaming Performance
What's New
🤖 Background Agent Control
- Stop running agents — a stop button now appears next to each running background agent, letting you cancel them at any time
- Live progress summaries — agents now show AI-generated descriptions of what they're working on, updated in real time
- Current tool indicator — see exactly which tool an agent is using right now and how long it's been running
📄 Agent Transcripts
When a background agent completes, you can now view its full transcript — every tool call, result, and text response — in a detailed modal. Great for understanding what the agent did and debugging unexpected results.
⚡ Faster Streaming
Streaming responses during long conversations are noticeably snappier. Invisible content updates (like thinking) now run at a fraction of the rate, and several rendering hot paths have been optimized to reduce unnecessary work during active streams.
Full Changelog: v0.21.3...v0.21.4
v0.21.3 — Codex Permissions, Terminal & Edit Display Fixes
Changes
⚙️ Codex Permission Policies
Codex sessions now respect your chosen approval and sandbox policies. Previously these settings weren't forwarded — now they're applied from the first message onward.
🐛 Bug Fixes
- Fixed the terminal replaying garbled text after switching between spaces — historical output no longer triggers stray escape-sequence responses
- Fixed multi-hunk edits to a single file incorrectly displaying as "N files" in collapsed tool cards and the changes panel
Full Changelog: v0.21.2...v0.21.3
v0.21.2 — Multi-File Codex Edits & Queued Message Fixes
Changes
🐛 Bug Fixes
- Multi-file Codex edits now show all files — when Codex edited multiple files at once (e.g. updating both a Hebrew and English translation file), only the first file's changes appeared in the UI. All files in the edit are now rendered individually with their own diff viewers.
- Queued messages stay visible above the input bar — previously, messages waiting to be sent could end up hidden behind the input area. They now appear correctly in the message list alongside other messages.
Full Changelog: v0.21.1...v0.21.2
v0.21.1 — Chat Virtualization Fixes
Changes
🐛 Bug Fixes
- Fixed chat content sometimes appearing misaligned or overlapping after switching sessions
- Fixed switching between spaces occasionally triggering a race condition that could show the wrong session
- Fixed streaming text from a previous session briefly flashing when opening a new chat
- Fixed message bubbles and tool summaries occasionally breaking out of their expected layout
Full Changelog: v0.21.0...v0.21.1
v0.21.0 — Virtualized Chat, Mermaid Diagrams & Shared Lib Extraction
Warning
This is a pre-release and can only be downloaded manually due to potential issues found out after testing.
What's New
⚡ Much Faster Chat
Long conversations are dramatically faster now. We replaced the old rendering approach with a proper virtualized list — only the messages you can actually see are rendered at any time. Previously, a 500-message chat would keep hundreds of React components in memory. Now it's just the ~20 visible ones, regardless of how long the conversation gets. Scrolling is smoother, switching sessions is snappier, and the app uses less memory overall.
📊 Mermaid Diagrams #29
When Claude draws a diagram using a mermaid code block, it now actually renders as a visual diagram — flowcharts, sequence diagrams, pie charts, git graphs, and more. Diagrams adapt to your light/dark theme automatically and are cached so they don't re-render on scroll. While Claude is still typing, you see the raw source; once the message is complete, the diagram appears.
📂 Deep Folder Inclusion (@#)
You can now use @#foldername in the composer to include the full contents of a folder — not just the file tree, but every file inside it. Regular @folder still gives you the structure overview. Use @# when you want Agent to actually read everything in a directory. If the folder is large (over ~50k tokens), Harnss will warn you before sending.
⌨️ /clear Command #15
Type /clear in the composer and hit Enter to instantly open a fresh chat. Quick way to start over without reaching for the sidebar.
🛡 Better Error Feedback
Permission prompts (allow/deny tool use) now show a notification if something goes wrong responding to them, instead of failing silently. Fixes several edge cases where permission state could get stuck.
🐛 Bug Fixes
- Fixed a bug where switching out of plan mode could sometimes reset the permission level incorrectly
- Fixed markdown characters occasionally getting eaten during streaming (apostrophes, backticks, etc.)
- Clipboard copy now works correctly in all cases including sandboxed contexts
- Codex web search cards now show meaningful details (queries used, URLs opened) instead of blank tool inputs
- And many other small irritating bugs I don't remember to mention
Full Changelog: v0.20.0...v0.21.0
v0.20.0 — Startup Performance & Draft Preservation
What's New
⚡ Startup Performance
- Flash-free window launch — window starts hidden (
show: false) and appears only afterready-to-show, eliminating the white flash on startup - Non-blocking analytics init — PostHog initialization in the main process is now fire-and-forget instead of
await-blockingapp.whenReady() - Deferred analytics sync — renderer-side
syncAnalyticsSettings()moved from module-level to auseEffectso IPC calls don't block first paint - Lazy model cache revalidation — model list revalidation (which spawns a Claude SDK subprocess) is deferred by 3 seconds, reducing startup IPC contention while cached models serve the initial render
- Relaxed session prefetch timing — idle callback timeout raised from 1.5s → 5s and fallback timeout from 250ms → 3s, with 50ms yields between sequential loads to let the main process event loop breathe
🎨 Draft Preservation
- BottomComposer component — new wrapper keeps the InputBar always mounted (hidden via
aria-hidden+inert) while a permission prompt is active, preserving any unsent text the user was composing - Test coverage — static-render tests verify both states: InputBar visible when no permission is pending, and InputBar hidden-but-mounted alongside the PermissionPrompt
Full Changelog: v0.19.1...v0.20.0
v0.19.1 — Streaming Stability & Thinking Animation Fix
Changes
🐛 Streaming Stability
- Overlap-tolerant chunk merging — new
mergeStreamingChunk()handles cumulative snapshots, overlapping deltas, and exact replays from upstream without duplicating text - Background session streaming — background Claude handler now uses the same merge logic, preventing text duplication when switching between sessions
🎨 Thinking Animation
- Extracted thinking animation state machine — moved from inline ThinkingBlock logic into a pure, testable
thinking-animation.tsmodule - Removed coalescing timer — the v0.19.0 interval-based chunk coalescing caused replay/duplication under rapid thinking updates; replaced with a simpler append-only model
Full Changelog: v0.19.0...v0.19.1
v0.19.0 — Session Prefetch, Scoped Permissions & Dark Theme Overhaul
What's New
⚡ Session Prefetch & Switching Performance
- Session payload cache — prefetches up to 6 recent sessions via
requestIdleCallbackso switching is instant with no disk I/O - Metadata sidecar files — session listing reads tiny
.meta.jsonfiles instead of parsing full multi-MB session files - Async session I/O — migrated all
fs.existsSync/readFileSynccalls tofs.promises.*for non-blocking session operations - Consolidated metadata sync — merged 4 separate
setSessions(prev => prev.map(...))effects into a single batched update startTransitionwrapping — session switch state updates are wrapped in React transitions for smoother UI
🔐 Scoped Permission Rules
- "Always allow" dropdown — split button on the permission prompt with per-destination scope (session, local project, shared project, user-global)
- Permission rule forwarding —
updatedPermissionsflows through the SDK permission bridge so rules persist to the chosen settings file - Local settings source — all SDK query paths now include
"local"insettingSourcesfor.claude/settings.local.jsonsupport
🎨 Dark Theme & Glass Morphism Overhaul
- Light glass tuning — separate gradient math for light glass mode with softer titlebar veils, adjusted shadow opacity curves, and
color-mix(in oklab, white 97%, var(--background) 3%)surface color - Refined top scroll fade — lighter, shorter gradient (h-20/h-24), reduced radial shadow spread, and fine-tuned opacity breakpoints for both island and flat layouts
- Transparency toggle —
glass-enabledclass now respects aharnss-transparencylocalStorage key, applied early in preload before React mounts - Darker window background — Electron window base color changed from
#18181bto#040404for true dark appearance - ShadCN Select component — new Radix-based
<Select>replaces all native<select>elements in settings panels for consistent styling
🛠 Tool & UI Polish
- Bash output truncation — long bash results (200+ lines) collapse with a "Show full output" toggle
- Engine icons in sidebar — session items show per-engine/agent icons instead of generic message bubbles
- AskUserQuestion redesign — tighter spacing, smaller type scale, and cleaner answer display
- Icon picker fix — dropdown-to-popover transition uses
onCloseAutoFocusprevention instead of fragilesetTimeout - Message unqueue — new
unqueueMessageaction lets users remove queued messages before they're sent
📜 Scroll System Refactor
getTopScrollProgresshelper — extracted smoothstep scroll-progress calculation to a pure, tested function inchat-scroll.ts- Synchronous viewport sync — programmatic scrolls (jump-to-bottom, prepend anchor restore) now immediately update top-progress and scrolled-from-top state
useLayoutEffectfor session reset — scroll position resets happen in layout phase to prevent flicker on session switch- Stale viewport ref guard —
getViewport()checksisConnectedto avoid operating on detached DOM nodes
🐛 Bug Fixes
- Git status loading race — separate
loadingRequestIdRefprevents stale requests from clearing the loading spinner - Switch request guard —
switchRequestIdRefdiscards late-arriving disk loads when the user rapidly switches sessions - Non-blocking save on switch —
saveCurrentSession()is now fire-and-forget (void) during session switches to avoid blocking the UI
Full Changelog: v0.18.1...v0.19.0
v0.18.1 — Project Switch Performance Fix
Changes
⚡ Performance
- Async file listing — converted synchronous
readdirSynccalls to asyncfs.promises.readdirwith periodic event-loop yielding every 25 directories, preventing main-process freezes on large projects - Single recursive watcher — replaced per-directory watcher swarm (up to 5,000 individual
fs.watchhandles) with a singlefs.watch(cwd, { recursive: true })per project, leveraging native FSEvents (macOS) and ReadDirectoryChangesW (Windows) for near-zero overhead - Lazy panel loading — Project Files panel now skips all file fetching and watcher setup when the panel is not visible, avoiding unnecessary I/O during project switching
📦 Dependencies
- SDK bump to
@anthropic-ai/claude-agent-sdk0.2.72
Full Changelog: v0.18.0...v0.18.1