* fix: preserve unsent prompt when adding editor context in VS Code
* fix: append Add to chat selections as markdown blocks with stable spacing
Convert selected assistant content to markdown before appending
Wrap each Add to chat selection in an `md` fenced block
Preserve multiline composer formatting across repeated appends
* fix: normalize persisted Windows paths to prevent identity mismatches
* fix: hide Windows subprocess console popups across server tasks
Hide OpenCode startup and shell command child windows in the web server
Apply windowsHide to cloudflared and skills-catalog git subprocesses
Cover remaining git service exec paths that could surface console windows
* fix: restore chat auto re-pin when reaching bottom
Re-pin now triggers when scrolling back into the bottom zone, not only via the button.
Upward user scroll intent still unpins immediately and is not overridden by re-pin.
Unified bottom/re-pin threshold logic to reduce sensitivity mismatches.
* fix: restore chat scroll release on mobile during streaming
Restores pinned-scroll release on touch scroll up so mobile users can leave auto-follow while streaming.
Improves re-pin behavior near bottom to avoid sticky or inconsistent pin states.
Includes related chat UI and dependency updates in the same change set.
* fix: hide daemon startup probe consoles on Windows
* fix: prevent pinned scroll tug-of-war during streaming
* fix: prefer git.exe to avoid Windows diff popup flashes
* fix: prefer git.exe discovery in Windows git flows
* fix: avoid where probes in Windows git resolution
* fix: avoid update-check subprocess flashes on Windows
* fix: normalize read file path labels
* feat: add OpenChamber defaults and improve theme ports
Add new OpenChamber light and dark themes
Regenerate imported themes with stronger surface mapping
Set OpenChamber themes as the default top options
* fix: stabilize chat pin and unpin behavior during streaming
Restores reliable unpin on upward wheel and touch gestures while auto-follow is active.
Prevents immediate re-pin while the user is actively scrolling upward near the bottom.
Keeps smooth follow-to-bottom behavior while reducing scroll tug-of-war.
* fix: suppress Windows command popups in VSCode runtime processes
Hide spawned git and server process windows in VS Code runtime
Extend hidden-window handling to server port cleanup and reveal commands
Keep behavior unchanged on non-Windows platforms
* fix: polish activity tool rows and message spacing
Show each tool call as its own row in live and activity views
Keep tool descriptions inline with truncation and cleaner read-file paths
Tune spacing, todo counts, and bash timing display for clearer chat flow
* fix: refine activity tool rows and truncation behavior
Make activity collapse behavior consistent across modes and rename default mode label to Expanded
Show tool descriptions inline with improved spacing and one-row-per-tool rendering
Fix read/edit path truncation to clip from the start while keeping edit filenames highlighted
* fix: resolve chat activity lint regressions
Remove unused activity render mode state in message body
Mark path helper animation arg as intentionally unused to satisfy lint
* refactor: add canonical turn projection pipeline for chat
Centralizes turn/activity/summary derivation, migrates render consumers to shared projection sources, and adds projector regression coverage for retries, malformed parent fallbacks, and activity segmentation.
* refactor: stream assistant text live in turn-first render path
* refactor: complete phase-3 turn timeline history/navigation
* refactor: complete phase-4 turn pipeline cutover
Remove legacy grouping adapters and lock key edge cases with executable regression tests so turn-centric rendering stays stable across retry/history/navigation flows.
* fix: align chat history loading path with opencode parity
* fix: stabilize chat streaming and reduce render churn
* feat: add blurIn streaming text animation and smooth lerp-based auto-scroll
Streaming markdown now uses Streamdown blurIn animation (150ms, ease-out) for per-word reveal
Auto-scroll during streaming uses continuous exponential smoothing (lerp) instead of restarting spring animations
One-shot scroll-to-bottom (button click) uses motion spring for natural deceleration
* fix: respect user scroll-up during streaming and re-pin on scroll back to bottom
* fix: stabilize activity stream and tool progress rendering
Activity now stays chronologically consistent and avoids duplicate reasoning/justification.
Tool rows show running state and duration earlier with smoother pending behavior.
Removed legacy trim/timestamp paths to prevent message drops and simplify Activity UI.
* fix: reverted regression of revert functionality
* fix: stabilize chat activity layout and tool progress behavior
Stopped user messages from re-animating when new user messages appear.
Made Activity and aggregated tool rows wrap inline consistently without misaligned headers/icons.
Fixed tool part matching so duration and shine no longer reset across pending/in-progress status updates.
* fix: restore activity mode behavior and stabilize tool rendering
Re-enabled Collapsed/Summary/Detailed/Changes defaults for Activity and tool expansion.
Fixed tool row wrapping/alignment, removed user fade re-animations, and disabled FadeInOnReveal animations.
Improved tool status handling to reduce timer/shine resets and made reasoning bold render as normal text.
* refactor: simplify chat tool and message rendering
Replace activity-group rendering with flat inline part rendering
Remove obsolete tool output and justification activity settings
Keep user message animation and improve edit/apply-patch file path headers
* style: narrow chat and composer columns equally
* fix: Tool status checks and abort flow regression
* fix: improve multi-file apply patch header rendering
* fix: make timeline message jump scroll to selected chat entry
Conversation Timeline clicks now reliably scroll to the selected message in chat
Timeline dialog waits for navigation result before closing to avoid silent failures
Chat message scrolling now resolves the active chat scroller consistently
* chore: remove branch-added chat tests and clean lint leftovers
Removes newly added chat and message test files from this branch
Fixes lint blockers in ProgressiveGroup, ToolPart, and messageStore
Keeps type-check, lint, and build passing after cleanup
* fix: keep composer status row closest to the input
Status/todo row now renders below queued messages and attachments.
Linked GitHub issue/PR chips stay above status so input context order is consistent.
Improves chat composer readability while assistant is working.
* fix: disable assistant header animations and polish chat status behavior
Assistant message header now renders without transition effects
Removed a lint issue from the working placeholder props
Chat status and message flow updates improve consistency during active turns
* feat: increase bottom spacer in mobile chat for better scrolling
* feat: add sorted chat mode with progressive activity rendering
Adds global chat render mode settings for sorted and live behavior
Renders non-stop assistant output in Activity as messages complete
Disables streaming text animation in sorted mode and restores classic reasoning/justification blocks
* fix: stabilize chat timeline navigation and older history loading
Prevents auto-loading older history from scroll and keeps loading behind the button
Fixes timeline jump-to-message behavior that snapped back to the bottom
Reduces chat list flicker and empty-state glitches on large session pagination
* fix: stabilize sorted activity text and hide reasoning timers
Prevented sorted justification from appearing before message completion by requiring explicit non-stop finish.
Removed duration values for sorted Thinking and Justification blocks.
Kept smooth sorted auto-follow behavior tuned to reduce bottom-jump jitter.
* refactor: simplify chat tool rendering paths and add parts docs
Centralized tool icon mapping into a shared presentation helper used by grouped and expandable rows.
Removed static-tool-specific branches from ToolPart to keep it focused on expandable tools.
Added a new DOCUMENTATION.md explaining where to change tool descriptions and rendering behavior.
* feat: enhance event stream handling for message parts
- Refactor event key building functions to improve clarity and reduce redundancy.
- Introduce `applyPartDelta` method in message store for handling delta updates to message parts.
- Update `useEventStream` to utilize the new `applyPartDelta` method for processing incoming deltas.
- Enhance text extraction logic to accommodate new part types and improve merging behavior.
- Implement logic to skip delta-driven updates for ongoing text/reasoning parts to prevent overwriting.
- Adjust server-side text merging logic to handle trimmed text comparisons and improve consistency.
* feat: enhance OpencodeService with delta handling and stale delta management
- Introduced globalSseStaleDeltas to track stale deltas.
- Added methods to generate keys for delta and updated part events.
- Updated global SSE loop to skip processing stale deltas.
- Refactored global SSE event handling to improve performance and reliability.
refactor: remove unused streaming part handling in messageStore
- Eliminated streaming part queue and associated logic.
- Simplified message merging logic by removing redundant checks.
- Streamlined message handling to improve clarity and maintainability.
chore: clean up unused streaming text normalization functions
- Removed deprecated functions related to streaming text identity and merging.
- Simplified normalizeStreamingTextPayload to focus on current functionality.
* refactor: simplify streaming event passthrough
Use SDK-native global event streaming in the UI client
Remove dead server-side SSE normalization helpers
Keep streaming payloads closer to upstream behavior
* revert: remove message memory settings UI
Drop the restored message memory settings screen
Keep session settings focused on current defaults
Preserve chat history limits as internal behavior
* feat: add compact collapsed Activity preview in sorted mode
Collapsed Activity now shows a live preview of the latest 7 entries
Older activity rows roll up behind a +N more indicator
The +N more indicator is clickable to expand the full Activity
* fix: adjusted activity changed files text prominence
* fix: make sorted mode snap to bottom when not streaming
* perf: show chat scrollbar only on user-driven scrolling
Chat scrollbar now stays hidden during automatic follow-to-bottom
Scrollbar visibility is gated by real user scroll intent
Reduced scroll overhead by removing timer-based intent tracking
* refactor: align web and vscode session activity streaming
Route VS Code SSE through SDK-based proxy flow
Restore controlled web session activity tracking and cooldowns
Keep chat activity behavior consistent across runtimes
* fix: adjusted muted foreground themes color
* fix: stabilize session activity and attention updates
Keep streamed chat state in sync as sessions complete
Restore reliable attention indicators for inactive sessions
Tighten server and UI event handling for chat updates
* feat: add chat render previews and file icon visibility setting
Added animated chat render mode previews in Chat settings.
Added a new toggle to show or hide file icons across tool rows.
Persisted chat render, activity, and mermaid modes to shared settings file.
* fix: update default GitHub OAuth client ID
Use the new OpenChamber org GitHub OAuth app ID by default.
Keep web server and VS Code auth defaults in sync.
* fix: sync chat settings across VS Code chat views
Broadcast settings changes to both sidebar and editor chat webviews.
Apply synced settings in each webview via shared settings refresh.
Ensures chat render mode updates appear immediately in editor tabs.
* fix: stop writing session folders file in VS Code workspaces
Disable disk persistence for session folders in VS Code webview runtime
Keep session folder state in VS Code/webview storage instead of project files
Preserve existing behavior for non-VS Code runtimes
* style: polish expanded tool panels and bash output readability
Removed extra borders/labels in expanded tool cards for a cleaner UI
Added softer scroll shadows and full-height decorative activity line
Switched bash command/output to code-style typography with tighter spacing
* feat: add default-open tool controls for chat activity
Added Chat settings toggles to open Bash and Edit tools by default
Default-open behavior now applies across both sorted and live activity rendering
Users can still manually collapse default-open tools, plus bash output height was reduced
* fix: align chat loading skeleton with message layout
Match skeleton width and horizontal alignment to chat message column
Add one-line tool-style skeleton rows with subtle circular placeholders
Increase top spacing so loading state no longer touches chat header
* fix: prevent blank screen when adding inline diff comments
Sanitize persisted inline comment drafts to ignore invalid data
Harden diff annotations against malformed line numbers
Fail safely when annotation updates error instead of crashing the view
* fix: streamline VS Code archived sessions sidebar
Show archived sessions in VS Code only for the active workspace directory.
Render archived sessions as a flat list in VS Code without project-root subfolders.
Hide the "Open in Side Panel" session action in VS Code.
Add a new Chat checkbox to toggle timestamps for tool, reasoning, and justification headers (default off).
Keep assistant message footer timestamps visible and switch to a more readable compact date format.
Preserve hover timestamp overlays with chat-surface background when the new setting is enabled.
Tool-card clicks for edit-like actions now open a VS Code diff instead of only the file
Diff view focuses the first changed line for faster review
Uses a virtual readonly original buffer to avoid opening unsaved draft tabs
Hides date/timestamp overlays on tool card headers
Hides date/timestamp overlays on thinking and justification headers
Keeps timing logic in place behind TODO-gated flags for future UX improvements
* fix(chat): render active tools before completion
* fix(chat): preserve running activity in collapsed view
* fix(chat): live-update duration for active tools
* fix: show live tool activity without timer resets
Show active tool rows before completion
Keep live duration stable during streaming updates
---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
* fix: resolve Windows CLI module loading on absolute paths
* fix: improve chat tool rows layout and timestamp readability
* fix: make web update restart more reliable
* fix: make web self-update detect package manager correctly
* feat(chat): add shared activity timestamp formatter
* feat(chat): pass assistant created timestamp to message body
* feat(chat): render footer timestamp beside elapsed time
* feat(chat): pass timing metadata in reasoning text blocks
* feat(chat): propagate justification timing to timeline block
* feat(chat): show thinking duration with hover end time
* feat(chat): reveal tool end time on activity hover
Display the actual subagent type (e.g., 'general', 'build') instead of hardcoded
'subAgent' in the task tool button. Changes 'session' to 'subtask' for consistency.
- Add input prop to TaskToolSummary component
- Extract subagent_type from task input
- Capitalize agent type and update button text format
- Use active session prompts for commit/PR generation and drop backend git generation routes.
- Improve tool activity UX with Structured Output rendering, description styling tweaks, and detailed-mode expansion fixes.
* feat(chat): add mermaid preview popups and fullscreen diagram viewer
Enable opening Mermaid diagrams from markdown and file attachments with a dedicated fullscreen dialog, while tightening preview loading behavior and sizing for more reliable interaction.
* refactor(chat): extract shared preview overlay hooks
Centralize fullscreen preview transition and viewport lifecycle logic so image and Mermaid dialogs stay behaviorally aligned while reducing maintenance overhead.
* fix(security): enforce workspace boundaries for fs read endpoints
Validate /api/fs/read and /api/fs/raw paths against active workspace roots and canonical realpaths to block traversal and symlink escapes before serving file contents.
* fix(chat): remove dead Mermaid copy component
Drop an unused merge-leftover component in MarkdownRenderer to keep lint clean without changing Mermaid preview behavior.
* feat: reload interface after skills operations
- Adds configurable delay before interface reload after skills changes
- Introduces polling to wait for application health after reload
- Updates UI to show reload message when installing or modifying skills
* feat: distinguish skills from commands in UI
- Displays skill badge for commands that are registered skills
- Prevents editing skills through command management interface
- Triggers interface reload after skill operations to reflect changes
* feat(chat): align command and subtask UX with opencode parity
Route commands/shell via parity paths, render delegated subtasks cleanly, and surface child-session permission/question prompts in parent chat.
* fix(ProjectEditDialog): improve layout consistency
* fix: update task icon and session handling in ToolPart
* feat(chat): add shell-mode input and collapse shell bridge output
Switch leading ! to shell mode UX and fold synthetic shell bridge assistant messages into the user shell bubble with inline output actions.
* fix: remove AI agent icon from file mention autocomplete
* fix: remove unused icon import from file mention component
* feat: show current branch in empty chat state
* fix: display current git branch for worktrees and update them with branch change
* refactor: improve read tool output parsing with structured data
* feat: add support for message part delta events
* fix(chat): improve streaming rendering, scroll behavior, and assistant action visibility
* feat: Add mermaid diagram support to chat markdown rendering
* fix: update table download functionality to include success notification and remove unused MarkdownRenderer import
* refactor: streamline Streamdown component props for improved readability
* fix: preserve Streamdown code-block markers and use native Tauri cache clearing
* feat: add context overview panel to view conversation details
* feat: added themes system
* feat: smart sidebar auto-hide for files/diff tabs + lower files sidebar threshold
* feat: added Checkbox component and update theming
- Add reusable Checkbox component for toggles across UI
- Replace several inputs with Checkbox in settings and commands panels
- Add DiffIcon and apply surface/border theming to key UI areas
* feat: Add convert-vscode-theme.cjs to convert VS Code themes to OpenChamber format
* refactor: remove unused permission logic from ChatInput
- Remove unused permission rules parsing logic from ChatInput
- Memoize renderTheme in DiffWorkerProvider to avoid unnecessary recalculations
- Remove forceOpaque helper in vscode theme adapter
* fix: guard VSCode theme loading in MarkdownRenderer
* feat: add custom user themes loading and reload
- Load user themes from ~/.config/openchamber/themes at runtime
- Expose /api/config/themes to fetch custom themes
- Allow theme reloading from Settings → Theme → Reload themes in the UI
* feat: add chat virtualization and turn grouping infrastructure
Implement VirtualMessageList with virtualization and overscan for smooth scrolling
Refactor MessageList to render only visible messages and pass scroll refs
Introduce TurnGroupingContext and provider to stabilize per-turn rendering and reduce re-renders
* feat: add web server session activity endpoint for visibility restore
Add /api/session-activity endpoint to expose tracked session activity
Use web server activity first when restoring visibility, with fallback to global status
Update server SSE to set session phase on activity events
* feat(chat): split TurnGroupingContext into UI/Streaming contexts
Add separate UI state and streaming contexts to reduce re-renders.
Skip animations for items visible in collapsed view when expanding.
Track shown parts in collapsed mode to fade in progressively
* feat(ui): cache turn groups with expand state and guard web activity
Add isExpanded to the turn cache key to trigger updates correctly
Expose isGroupExpanded from UI state so groups reflect expand/collapse
Limit web server session activity fetch to web runtime only
* feat: add plan/build mode switching and Plan view tab
Add PlanView view and integrate plan tab into main layout
Introduce plan_enter and plan_exit tools with icons and status strings
Persist per-session agent selections in context to reduce UI flicker during mode switches
* feat: enchanced plan discovery checks in header and plan view
* fix(ui): align PlanView and Header with sessionDirectory logic
Remove dependency on context store in header and compute sessionDirectory from session or currentDirectory
Compute display and repo paths using sessionDirectory for PlanView and update path resolution
Poll plan content every 3 seconds to reflect changes without heavy retries
* feat(ui): improve header tab switching and add copy buttons for plan
Switch header tab navigation to central UI store and auto-switch when plan is unavailable
Show checkmark icon after copying file contents or path with auto-hide timeout
Extend plan view path resolution to prefer session directory when present
* feat: add Apply Patch tool with patch input and diff view
Introduce Apply Patch tool with a patch input field and diff preview
Display target file path or file count for patch operations in tool UI
Update status label to show applying patch during execution
* fix: include apply_patch in editing tools detection
* feat: Implement project management store with project path validation and synchronization
- Added `useProjectsStore` for managing projects, including adding, removing, renaming, and validating project paths.
- Implemented persistence for projects and active project ID using safe storage.
- Introduced synchronization from desktop settings to keep project data consistent.
- Enhanced session store to manage sessions by directory and added new methods for session management.
- Updated todo store to fetch session todos based on the directory context.
- Refactored server code to validate and resolve project directories for various API endpoints.
- Added project entry validation and sanitization to ensure data integrity.
* feat(settings): migrate legacy project settings and update settings loading logic
* feat: enhance project management with directory-aware settings and improved agent/command source handling
* feat: enhance session and project management with directory-aware settings and improved configuration refresh logic
* feat: enhance project management with worktree manager integration and project directory resolution
* feat: enhance agent groups store with project directory resolution and loading logic
* feat: add heartbeat management and global wrapping for SSE blocks in agent and chat providers
* feat: refactor command and project handling in useCommandsStore
- Replaced useDirectoryStore with useProjectsStore to manage project paths.
- Introduced getRequestDirectory function to determine the active project directory.
- Updated command fetching to respect project-level scoping.
- Enhanced error handling and logging for command configuration fetching.
- Improved command configuration saving and updating to utilize project directory context.
feat: enhance project path normalization in useProjectsStore
- Added resolveTildePath function to expand paths starting with ~.
- Updated normalizeProjectPath to utilize home directory for path expansion.
fix: update permission handling in useSessionStore
- Changed Permission type to PermissionRequest for clarity.
- Updated respondToPermission method to use requestId instead of permissionId.
refactor: improve permission utilities
- Introduced types for PermissionAction and PermissionRule.
- Enhanced getAgentDefinition and resolveConfigStore functions for better type safety.
- Added resolvePermissionAction to streamline permission resolution logic.
feat: add agent configuration retrieval endpoint
- Implemented new API endpoint to fetch agent configuration based on project directory.
- Enhanced getAgentPermissionSource to prioritize project-level permissions.
chore: update SDK version in package.json files
- Bumped @opencode-ai/sdk version to ^1.1.1 across all relevant package.json files.
refactor: streamline bridge message handling
- Updated handleBridgeMessage to accept directory parameter for agent and command requests.
- Improved local API request handling to extract directory from query parameters and headers.
feat: enhance project configuration management
- Added functions to retrieve and merge project configuration paths.
- Improved handling of existing project configuration files for agents and commands.
* feat: enhance VSCode integration and session management
- Added support for a sticky sidebar header background in light and dark themes.
- Introduced functions to read VSCode workspace directory and check if running in VSCode.
- Implemented detailed logging for session loading and creation processes.
- Enhanced session filtering based on directory structure and canonical paths.
- Added a new method to reorder projects and prevent modifications in VSCode workspace.
- Improved error handling and logging for app initialization and markdown file parsing.
- Updated API checks and health checks to ensure readiness before proceeding.
- Refactored code for better readability and maintainability across various modules.
* feat: improve agent and branch selection logic, enhance session management, and update multi-run creation response
* feat: add worktree management actions in agent group detail and sidebar, including delete and keep only options
* fix(ui): share IME guard and cover multi-run
* fix(session): reduce maximum visible sessions in group from 7 to 5
* feat: add support for OpenCode permission.asked event
Implement UI handling for the new permission.asked event from OpenCode's
PermissionNext system, allowing tools configured with "ask" in opencode.json
to prompt user for approval.
Changes:
- Add permission.asked event handler in useEventStream
- Add patterns[] and always[] fields to Permission type
- Display patterns being requested in PermissionCard
- Show what "Always Allow" will auto-approve
This enables the permission asking feature where tools can require user
approval based on opencode.json configuration.
* feat: add button to open subAgent session from task tool
When an agent uses the task tool to create a subagent session,
a new "Open subAgent session" button is now displayed next to
the task tool output. Clicking this button navigates to the
child session in the chat view.
The button shows only when a sessionId is available in the task
metadata and uses the external link icon to indicate it opens
a separate session context.
Update all import statements to use @opencode-ai/sdk/v2
Modify Vite configurations to alias new SDK path
Update API client method signatures for SDK v2 compatibility
- Added skill scope helpers and CRUD operations for skills in opencodeConfig.ts.
- Introduced API endpoints for skill management in main.tsx and index.js.
- Enhanced server-side logic to support skill discovery, creation, updating, and deletion.
- Implemented supporting file operations for skills, including reading, writing, and deleting files.
- Updated package.json to use the latest version of @opencode-ai/sdk.