Introduce a hook to detect text truncation for dynamic UI updates
Replace static marquee spans with a reusable marquee component in files and labels
Enable copying of terminal selection on mouse up and touch end
* fix(server): improve external server and error handling
- Skip OpenCode shutdown when using external server
(OPENCODE_SKIP_START=true)
- Return 404 status for non-existent directories instead of
empty array
- Move error logging before response handling
* feat(ui): add configurable text justification activity setting
- Replace hardcoded ENABLE_TEXT_JUSTIFICATION_ACTIVITY constant with
dynamic showTextJustificationActivity setting in useUIStore
- Add toggle UI in Chat settings section (Settings > Chat)
- Add setting to DesktopSettings type for cross-runtime persistence
- Default value is false (matching original constant behavior)
---------
Co-authored-by: iiyangdianfeng <goodydfwow@gmail.com>
* 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
- Added CodeMirror editor for file content editing in FilesView.
- Introduced draft saving functionality with unsaved changes confirmation dialog.
- Implemented file writing API to persist changes to the filesystem.
- Enhanced language support for syntax highlighting based on file extensions.
- Updated UI components to support new editing features, including save and discard options.
- Refactored line selection logic for improved user experience on both desktop and mobile.
- Added new utility functions for language detection by file extension.
- Introduced a new theme for CodeMirror to align with the application's design.
* Stability and performance improvements. (#1)
## Changelog
### Performance Improvements
- **perf: make terminal creation cwd check async (#9)**
Replaced synchronous `fs.existsSync` with `fs.promises.access` in the terminal creation handler to prevent blocking the event loop.
Improves throughput under high load.
- **perf: optimize fuzzyMatchScore by avoiding redundant lowercasing (#8)**
Renamed `fuzzyMatchScore` to `fuzzyMatchScoreNormalized` and updated it to accept a pre-lowercased query, avoiding repeated string allocations.
Updated the call site in `searchFilesystemFiles`.
~25% search performance improvement on large datasets.
- **perf: use async file read in update-install handler (#7)**
Replaced `fs.readFileSync` with `await fs.promises.readFile` to avoid blocking the event loop.
**Benchmark (10k ops):**
- Sync: ~95ms (blocking)
- Async: ~1124ms (non-blocking)
Higher per-call overhead, but better server responsiveness.
- **perf(server): optimize mkdir endpoint with async fs (#6)**
Replaced `fs.mkdirSync` with `await fsPromises.mkdir` in `/api/fs/mkdir`.
Prevents event-loop blocking and improves concurrent performance.
**Result:** ~2× throughput improvement (100 concurrent requests).
- **perf: parallelize fs checks in validateProjectEntries (#4)**
Replaced serial `for...of` with `Promise.all + map`.
Reduced validation time for 500 projects from ~110ms to ~20ms (~5× speedup).
- **perf: cache getLoginShellPath result to avoid blocking event loop (#5)**
Cached `getLoginShellPath` result to avoid repeated `spawnSync` calls (~400ms each).
Subsequent calls reduced to <1ms.
---
### Server Fixes
- **fix(server): use async check for terminal restart endpoint (#3)**
Replaced `fs.existsSync` with `fs.promises.stat` in `/api/terminal/:sessionId/restart`.
Added directory validation for better robustness.
---
### UI & Accessibility
- **feat(ui): add aria-labels to git identities sidebar buttons (#1)**
- Added `aria-label="Create new profile"` to the create button
- Added `aria-label="Profile actions"` to the dropdown trigger
- Added `.Jules/palette.md` for UX/a11y learnings
---
### UI Performance (Bolt)
- **⚡ Bolt: Optimize MessageList re-renders by preserving referential equality (#2)**
- **⚡ Bolt: Optimize MessageList re-renders by preserving referential equality (#11)**
- **⚡ Bolt: Optimize MessageList re-renders by preserving referential equality (#12)**
* stability and improvements (#17)
* feat: add corner radius setting and update snackbar actions
- Add `cornerRadius` to UI store and settings.
- Add Corner Radius slider to Visual Settings section.
- Apply corner radius to ChatInput component.
- Remove default close button from Snackbar (Sonner).
- Add "OK" action button to session deletion toasts.
- Ensure `cornerRadius` setting is visible in OpenChamberPage.
* fix(ui): add missing aria-label to radius slider and verify functionality
- Added `aria-label="Corner radius in pixels"` to the desktop version of the corner radius slider for accessibility.
- Verified functionality and accessibility compliance via script.
* fix(ui): restore input bar offset setting on desktop
- Restored the Input Bar Offset setting to be visible on desktop, not just mobile.
- Verified both Corner Radius and Input Bar Offset sliders are accessible.
* Fix mobile layout for chat input controls (#16)
* Fix mobile layout for chat input controls
- Reduced horizontal gaps in mobile model controls.
- Added max-width constraints to model, variant, and agent labels on mobile to prevent overflow and cramping.
- Optimized spacing for mobile view.
* feat(git): auto-select gitmoji for generated commit messages
When the "Generate commit message" feature is used and gitmoji is enabled, automatically prepend the appropriate gitmoji based on the commit subject keywords.
- Added `KEYWORD_MAP` to map commit types to gitmojis.
- Added `matchGitmojiFromSubject` helper.
- Updated `handleGenerateCommitMessage` to apply the gitmoji.
* feat(git): auto-select gitmoji for generated commit messages
- Added `KEYWORD_MAP` to map commit types to gitmojis.
- Added `matchGitmojiFromSubject` helper.
- Updated `handleGenerateCommitMessage` to apply the gitmoji.
- Fixed mobile layout for model controls.
* feat: add Files tab for browsing workspace files
- Add Files tab between Diff and Terminal in header
- Implement hierarchical file tree with expand/collapse
- Add fuzzy search with debouncing and relevance ranking
- Support gitignore filtering via `git check-ignore` (web + desktop)
- Add syntax highlighting for 150+ file types
- Add image preview (SVG, PNG, JPG, etc.)
- Add line numbers, wrap toggle, and copy button
- Desktop: split-pane layout matching DiffView
- Mobile: drill-in navigation with full-width sidebar
- Update help dialog with Cmd+3 shortcut
- Increase header breakpoint to 940px for new tab
* feat: enhance context and session stores to track agent/model/variant choices for historical sessions
* feat: implement line selection and commenting functionality in FilesView
* feat: add /undo, /redo, /timeline slash commands and fork button
- Add /undo command to revert to previous user message
- Add /redo command to redo previously undone messages
- Add /timeline command to show conversation history
- Add fork button on user messages (hover) to create new session
- Add TimelineDialog component for navigating conversation history
- Show undo/redo/timeline in autocomplete when session exists
- Fix fork to use SDK session.fork API
- Silent no-op behavior for undo/redo when no messages (matches OpenCode CLI)
* fix: correct fork session endpoint and session switching
- Add hybrid SDK approach using v1 for existing methods and v2 for fork only
- v2 SDK has correct endpoint /session/{sessionID}/fork instead of broken /session/{id}/fork
- Fix forkFromMessage to use setCurrentSession instead of direct set
- Ensures both useSessionStore and useSessionManagementStore are consistent
- Fixes issue where forked sessions appeared empty until sending a new message
* fix: use direct fetch for fork to avoid v2 SDK build errors
- Remove v2 SDK imports and hybrid SDK approach
- Use direct fetch() call to /api/session/{sessionID}/fork endpoint
- Avoids type conflicts between v1 and v2 SDK
- Bypasses broken v1 SDK fork endpoint (wrong path parameter)
- All codebase now uses v1 SDK consistently
* fix: use jsonc-parser for config file parsing
- Replace strip-json-comments + JSON.parse with jsonc-parser
- Handles comments, trailing commas, and unquoted keys
- Matches OpenCode CLI config parsing behavior
- Fixes SyntaxError when reading global opencode.json config
* feat: improve timeline dialog with loading state and search
- Add loading spinner on fork button during operation (~30s on big sessions)
- Refresh session list after fork so new session appears in sidebar immediately
- Add search bar to filter messages by prompt text content
- Show 'No messages found' when search has no results
- Disable fork button while forking to prevent duplicate operations
* feat: add UI customization and model management features
Add comprehensive UI customization options and enhanced model selection:
- **Favorite & Recent Models**: Star models for quick access, track 5 most recent
- Add favorite/recent sections to model dropdowns
- Persist preferences in local storage
- Works in ModelControls and ModelSelector components
- **Tool Call Expansion Settings**: Control default expansion state for tool outputs
- Three modes: collapsed, activity (summary), detailed
- Applies to activity groups and individual tool calls
- Configurable in Appearance Settings
- **Font Size & Spacing Controls**: Adjustable typography and layout density
- Font size: 50-200% scaling of all semantic typography
- Spacing/padding: 50-200% scaling of margins, gaps, line heights
- Real-time preview with reset buttons
- Settings in Appearance Settings
- **VSCode Extension Settings View**: Full settings access in VSCode extension
- Add settings navigation and view type
- Settings button in header
- Navigate between sessions, chat, and settings
Technical changes:
- Enhanced useUIStore with new state management
- Dynamic CSS variable scaling for typography and spacing
- Typography helper functions for variable access
- ThemeProvider integration for auto-applying scales
* fix: hide theme mode in VSCode and fix detailed tool expansion
- Hide "Theme Mode" setting in VSCode extension settings as VSCode
dynamically applies its own theme to the extension
- Fix bug where tools from subsequent messages in a turn weren't
expanded when "Detailed" mode was selected
- Now correctly aggregates all tool IDs from turnGroupingContext when
calculating effective expanded tools for progressive groups