* feat: add chat option for user message rendering mode
* feat: add chat option to toggle sticky user header
* feat(ui): overhaul context panel with reusable tabs and embedded session chat
Enable parallel context workflows with persistent tabbed views and isolated session chat while reducing resize and background runtime overhead.
* feat: polish context panel and git sidebar tabs
Refined context panel tab behavior and visuals for smoother switching and resizing
Reused the new tabs component in right sidebar and git sidebar with fit layout
Improved git section spacing, selection controls, and bulk revert confirmation flow
* feat: open diff files in editor at changed lines
Add edit actions in diff views to open files at the first changed line
Support per-file open-in-editor from All Files headers and icon-only action in single-file view
Improve file jump UX with load-aware navigation and reduced visual blink during line targeting
* fix: stabilize pill tabs and prevent git commit pathspec failures
Unified sortable tab variants to match animated styling behavior with responsive spacing and cleaner sidebar chrome
Fixed active tab pill measurement so size/position recalculates correctly when dropdowns reopen
Commit API now filters stale file paths before staging to avoid pathspec errors on deleted files
* fix: align user message action row spacing and hover behavior
* fix: persist user message view preferences in settings
Save plain-text and sticky-header toggles to settings.json when changed
Restore both chat display preferences from settings.json on startup
Validate and accept both preference fields in the settings API
* fix: improve git and sidebar tab layout on mobile
* fix: refine mobile user message action row spacing
Show mobile user-message actions in a consistent external row for sticky and non-sticky modes
Tune button row height and vertical position to match both mobile variants
Reduce sticky-header gradient tail and tighten assistant gap after user messages
* fix: improve chat action hover zones and mobile top shadow logic
Expand desktop trigger area so user action buttons reveal across the full row
Add sticky-header phantom hover row so inline actions appear from the whole button lane
Hide chat top scroll shadow on mobile only when sticky user headers are enabled
* fix: remove commit message input scrollbar flicker
Added optional scrollbar class support to shared textarea wrapper.
Disabled overlay scrollbar for Git commit message input.
Kept auto-resize behavior while preventing one-line empty-state micro-scroll.
* feat: make model provider groups collapsible in selector
Add collapsible provider headers in the chat model dropdown
Persist expanded/collapsed provider state across sessions
Refine provider header UX with inline chevrons and no hover highlight
* feat: arrange chat settings into a compact two-column layout
Places User Message Rendering next to Mermaid Rendering.
Places Diff Layout next to Diff View Mode.
Reduces right-column spacing to better match other settings sections.
* fix: show worktree branch edit controls in draft sessions
Detect worktree mode from current directory when session metadata is not yet bound
Enable immediate branch rename UI in Git sidebar without session switching
* feat: add beta badge to side panel menu action
* refactor(settings): new IA shell + projects section + skills catalog discoverability
* chore(settings): split providers list by scope; show user before project
* fix: navigation flow in mobile Settings
* feat: redesign settings pages to use modern elevated surface patterns
* feat: replace helper text with tooltips in settings
* ui: redesign update dialog and fix external link routing
- Restructures UpdateDialog to focus on changelog readability with a wider max-w-4xl canvas
- Highlights @username contributor mentions with theme primary color
- Strips excessive vertical padding and right-aligns compact action buttons
- Disables streamdown's internal link safety dialog in favor of direct Tauri shell routing
* feat: refactor Git identities into dedicated Git settings page
* feat: unify sidebar background styling across VS Code and web/mobile
* fix: adjust button styling and layout for mobile settings pages
* feat: add MCP settings page and sidebar
* feat: hide models in provider view (thanks to @nguyenngothuong)
* feat: add "Add new provider" option to model selector dropdown
* fix: local evroc logo + provider dropdown icons
* fix: increase width of provider menu
* fix: dark theme background color for better contrast
* feat: update @opencode-ai/sdk dependency to v1.2.10
* fix: restore session sorting to only use updated time
* fix: added settings for sessions deletion dialog
* fix: adjust padding on settings pages for better layout
* fix: standardize select dropdown height across UI
* fix: agent selector UI and notification settings
* fix: remove redundant helper text from settings pages
* fix: update UI layout for description fields
* fix: remove border-none and shadow-none from textarea classes
* fix: enable context menu on sidebar items
* feat: refactor UI controls and layout patterns across settings pages
* fix: use headerless blocks when page title already provides context
* fix: remove subtask option from command settings
* fix: refactor mcp page settings
* fix: reduce spacing in skills configuration pages
* feat: refactor voice settings
* feat: refactor settings sidebar sections
* feat(session-folders): drag-to-folder DnD, sort by activity, and UX improvements
- Add DraggableSessionRow wrapping each session row so the whole row is
draggable; stopPropagation prevents outer group-reorder DnD from firing
- Add DroppableFolderWrapper + SessionFolderDndScope (inner DndContext
scoped per group) with closestCenter collision detection
- DragOverlay matches exact width/height of dragged row so cursor stays
aligned
- Folder header highlights (ring + primary colour) when a session hovers
over it during drag
- + button on folder header opens a dropdown: 'New session' / 'New folder'
- + button on each folder row creates a session scoped to that folder
- Empty folders are no longer auto-deleted (removed .filter(sessionIds.length>0)
from addSessionToFolder / removeSessionFromFolder / cleanupSessions)
- Sessions inside a folder are sorted by most-recent activity (same
compareSessionsByPinnedAndTime logic used everywhere else)
- Sort comparator now takes sessionAttentionStates so lastUserMessageAt /
lastStatusChangeAt is used when newer than session.time.updated; all
sort call-sites and their useMemo/useCallback deps updated accordingly
- Remove foldersMap from cleanup effect deps to prevent cascade re-renders
when folders change; read current value via getState() instead
* fix(session-folders): new session is placed into the correct folder
sendMessage() was calling useSessionManagementStore.createSession()
directly, bypassing the targetFolderId logic in useSessionStore.createSession.
Fix: read targetFolderId from draft at the top of the draft branch in
sendMessage, then call addSessionToFolder immediately after the session
is created and before the draft is closed. Also propagate targetFolderId
through openNewSessionDraft options and NewSessionDraftState type.
* feat(session-folders): add sub-folder support (one level deep)
- SessionFolder gains optional parentId field for hierarchy
- createFolder accepts parentId to create sub-folders
- deleteFolder cascades to remove all child sub-folders
- SessionFolderItem renders sub-folders before sessions in body;
new sub-folder button (RiFolderAddLine) visible at depth 0 only
- renderOneFolderItem in SessionSidebar builds the tree recursively;
sub-folders are indented via depth prop (ml-3 on root's children)
- Persist/hydrate parentId correctly from localStorage
* feat(session): add delete confirm dialogs and improve subtitle UX
- Add confirmation dialogs before deleting sessions or folders
- Show relative time (e.g., '2h ago', '35min ago') for recent sessions
- Replace +/- diff numbers with file change count (e.g., '3 files changed')
- New folders use default name without forcing rename
- Cleaner, less cluttered session list UI
* fix(session-folders): skip folder cleanup while sessions are loading
Prevents race condition on reload where cleanupSessions() runs before
the server returns the full session list, causing folder-session
assignments to be incorrectly wiped from localStorage.
* feat(sessions): add custom folder grouping for sessions
Allow users to create custom folders to organize chat sessions.
Folders are stored in localStorage, scoped per project.
Features:
- Create/rename/delete folders from sidebar header
- Move sessions to folders via context menu
- Remove sessions from folders
- Collapse/expand folder state persisted
- Automatic cleanup when sessions are deleted
Implementation:
- useSessionFoldersStore: Zustand store with CRUD + localStorage persistence
- SessionFolderItem: Component for folder header (name, count, actions) + body
- SessionSidebar: Integration with context menu, folder rendering in session list
* fix(sessions): remove sidebar header folder action
* fix: remove folder when they becomes empty
* refactor(sessions): switch folder scope to session directory and clean folder interactions
* fix: move folder actions outside rename mode
---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
* 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: tabbed right sidebar, context panel, floating diff comments
* fix: auto-close left sidebar when context panel opens
- Increase default context panel width from 520 to 600 pixels
- Increase sidebar minimum width from 200 to 300 pixels
- Replace collapsible component with custom button in diff view
* refactoring: rework sidebars, tabs, and file tree layout
- Rewrite AnimatedTabs as segment-style with sliding indicator
- Upgrade SidebarFilesTree to match FilesView features (context menus,
git status, file icons, CRUD dialogs, fuzzy search ranking)
- Restructure FilesView header: tabs row + actions row, remove breadcrumbs
- Show relative path in context panel header, track active tab
- Allow left sidebar to stay open alongside context panel
- Hide diff/files tabs from header on desktop (mobile-only)
- Move chevron after group name in session sidebar
- Compact tab heights in right sidebar and git view
- Size PreviewToggleButton to match other action buttons
- Remove directory loading spinner from folder icons
* feat: add project icon and color customization
- Enable users to assign custom icons to projects
- Allow users to choose accent colors for projects
- Stabilize repo status UI during project switching
* feat: add scroll fade indicators to editor tabs
* style: reduce spacing and icon sizes in header
* style: adjust tab component padding from uniform to vertical-horizontal
* feat: Add session state indicators to project tabs
* feat: Enhance session status handling and improve UI responsiveness
* fix: preserve upstream tracking on branch rename
* fix: improve initial remote selection for pull requests
- Uses saved remote name from previous session when available
- Selects remote based on tracking branch when possible
- Falls back to origin or first available remote
* perf(diff): faster highlight, stable stacked scroll
- split/unified Pierre worker pools; prefer shiki-wasm
- align diff CSS line-height; disable scroll anchoring; drop WebKit compositing hacks
- harden stacked pin/align (cancel on user scroll/input); prevent overscroll
- make overlay scrollbar MutationObserver optional; disable for diff container
* feat: handle binary files in diff view
* fix: adjust project tabs layout and drag regions
* style: update drag overlay visual styling
* feat: enable number keys to switch projects in the sidebar
* fix: recognize octet-stream as text-based MIME type
* feat: add keyboard navigation to context panel
* feat: add session pinning to sidebar
- Pin important sessions to keep them at the top
- Pinned sessions persist across browser sessions
* refactor: move context usage display from chat input to header
* feat: add worktree validation and deleteLocalBranch option
Add API to validate and create worktrees with new payload types
Allow deleting local branches when removing worktrees via UI and API
Introduce OpenCode style random names for worktrees when not provided
* feat: enable SSH/HTTPS transport detection for PR picker
Load remotes for the current project directory to inform PR picker options.
Determine preferred push transport from remotes and apply it.
Expose sshUrl in API for frontend to build SSH clone URLs
* feat: extend head repo with sshUrl and improve push error messages
Add sshUrl field to head repo mapping
Enhance push failure handling to display stderr or stdout details
Return push details on success
* fix: worktree path
* feat: worktree set upstream on creation
Enable pushing to upstream by default when no remote is specified
Remove per-remote dropdown for push actions and auto-use first/upstream remote
Update server and VSCode git services to support push without explicit remote and set upstream
* fix: worktree-name sanitization
* feat: rename worktree path field and branch prefix
* feat(worktrees): add git.worktree facade, validation endpoint, upstream/remote-aware creation, and non-blocking setup execution
* refactor(git): use git.worktree namespace in branch picker
* feat(worktrees): sync OpenCode sandbox metadata on create/remove
* fix(worktrees): accept new path key in workspace guard and validate remote startRef
* chore(docs): remove temporary worktree testing plan
* feat: add git worktree management API (list/create/delete/validate) for vscode
* feat: wire root tracking remote and defaults for new worktrees
Add resolveRootTrackingRemote to detect upstream remote for root branch
Apply upstream defaults when creating new worktrees to auto-set upstream
Replace validation and creation flow to use new worktreeCreate APIs
* feat(worktrees): enable root tracking remote handling
* feat: enable local-origin desktop features and copy in terminal support
- Enable arbitrary web loads in desktop web content for TAURI apps.
- Guard directory dialog access behind local-origin origin check.
- Add copy-to-clipboard support for terminal selections via common shortcuts.
* fix: improve initial directory resolution and persistence in directory store
* feat(BottomTerminalDock): add close button next to the fullscreen toggle in the dock
* style: replace hardcoded gradient with theme value in shine text variant
* fix(header): adapt instance button for desktop only
* refactor(chat): polish sticky turn UX and message action rows for better readability
Switch to stable sticky-only turn behavior and redesign user/assistant action controls (placement, hover rules, ordering, spacing, selection-safe clamp) to reduce visual noise and improve interaction flow.
* feat(chat/message): refactor buttons in messages footer
* feat: enhance image preview functionality in chat messages
- Added a new ImagePreviewDialog component to handle image previews with navigation support.
- Updated ToolOutputDialog to utilize the new ImagePreviewDialog for displaying images.
- Modified the ToolPopupContent type to include a gallery of images and an index for the current image.
- Removed the old inline image display logic from ToolOutputDialog.
- Improved file handling in the file store, including better MIME type guessing and handling of server paths.
- Introduced a new API endpoint for handling large session message payloads, allowing for better management of multi-file attachments.
- Updated the VSCode bridge to support session message requests with appropriate headers and body handling.
* feat(proxy): implement SSE forwarding and enhance generic API request handling
* feat(chat): support submitting only queued messages
* feat: add image preview transition state
* fix: default VSCode view to draft and fixed sessions list regression
* feat: add unified dropdown with services content in header
* feat: add right Git sidebar with resizable panel
* feat: implement responsive panel auto-toggle and terminal rehydration
- Auto-close the right sidebar when width is below a threshold and auto-open it when space permits
- Auto-close the bottom terminal when height is below a threshold and auto-open it when enough space
- Apply a dedicated rehydrated streaming configuration for terminal sessions to optimize reconnect behavior
* feat: enhance PR view with status caching and annotations
* feat(ui): enable chat dispatch in PullRequestSection
* feat(TerminalView): adjust layout
* feat: refine chat input layout and text selection menu
* fix(ui): show empty state in GitView when no changes
* feat(git): update PR actions styling and create PR button
* feat: show branch info in session sidebar and enrich worktrees
* feat: refresh sidebar branch display when switching branches in git menu
* fix: ensure branch name displays on mobile by fixing flex alignment
* style: make branch name font smaller, especially on mobile
* feat: refactored sessions sidebar to be workspaces centric
- Add createWorktreeOnly helper and status checks
- Add createWorktreeOnly to create a standalone worktree for the active project
- Show error toasts when no active project or not a Git repository
- Refresh session list and show success toast with created worktree details
* feat: show attention indicator and status marker in SessionSidebar
- Show unread attention indicator for sessions with pending updates
- Display status marker combining streaming and unread indicators in the session row
- Introduce attention diamond pulse animation and associated CSS for the new indicator
* fix(SessionSidebar): reserve header actions space when repo state is known
* chore(doc): add PR status colors to custom themes
- Remove legacy worktree API usage and related state
- Add Manage Branches button in the Git header for quick access
- Introduce worktree status utilities to derive root branch hints
## What / Why
This PR finishes the desktop refactor: the Tauri app is now a thin shell that launches the web server as a sidecar and loads the UI from `http://127.0.0.1:<port>`. All real backend logic lives in `packages/web/server/index.js`; desktop Rust keeps only native integrations (menu/dialog/notifications/updater/deep-link + window chrome).
This unblocks:
- consistent behavior across web/desktop/vscode (single backend)
- simpler desktop maintenance (no duplicated Rust backend)
- host switching between Local + remote instances in desktop
- reliable cold-start behavior on slow machines (VSCode + desktop)
## Key changes
- Desktop sidecar runtime
- build pipeline to bundle web dist + `openchamber-server` sidecar (`packages/desktop/scripts/build-sidecar.mjs`)
- robust local port selection (prefer saved/default, fallback to random; persisted in `~/.config/openchamber/settings.json`)
- improved PATH handling so the sidecar can locate `opencode` CLI (incl `~/.opencode/bin`, overrides, common bins)
- disable native right-click context menu in production builds (dev keeps it)
- Desktop instance switcher (Tauri-only)
- header button + modal to add/edit/delete remote hosts, set default, probe status/ping, switch back to Local escape hatch
- auth gate includes host switcher so you can recover when a remote host is broken/auth-required
- host list stored desktop-locally (not tied to the currently selected remote server)
- Notifications
- decision logic moved server-side; desktop notifications emitted via sidecar stdout and shown natively by Tauri
- prevent double-notifications on desktop Local origin (UI ignores SSE notification when native path is active)
- restore macOS notification sound
- Updates
- Tauri updater used only when viewing Local instance in desktop shell (avoid “remote web update” triggering desktop restart)
- Settings persistence & UX polish
- persist model favorites/recents via `/api/config/settings` (works for web + desktop; not origin-dependent)
- persist per-project sidebar collapse state in `projects[].sidebarCollapsed` via `/api/config/settings` (with debounce on toggles)
- macOS header sizing/traffic-lights offsets fixed (marketing macOS major injected from desktop; MultiRun header aligned)
- VSCode cold-start: keep retrying provider/agent loads after connection to avoid empty UI on slow machines
- misc lint/type fixes + bun.lock sync
- Desktop bootstrap / resiliency
- show onboarding screen when OpenCode CLI is missing (desktop Local origin), with retry hook to restart OpenCode after install
## Testing notes
- Desktop (macOS): switch Local <-> remote, set default host, verify auth gate recovery, native notifications (with sound), updater gated to Local
- Web: favorites/recents + per-project collapsed state persist across reload/restart
- VSCode: slow startup no longer results in missing providers/agents/models
* 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
- Use git reset --hard HEAD by default when startPoint is not provided or is HEAD
- Preserve resetting to the provided startPoint when a concrete value is supplied
Enable optimistic local-branch checks for PR heads to disable non-existent branches
Show IntegrateCommitsSection only when upstream tracking is origin-based or applicable
Add SDK-based worktree management that lists and starts SDK worktrees
Migrate per-project setup to ~/.config/openchamber/<projectId>.json
Deprecate .openchamber legacy paths and adapt UI to new config
* feat: display provider logos for favorite/recent models
Show provider logo next to model name in favorites and recents
Render provider logos in ModelControls, ModelMultiSelect, and ModelSelector lists
Maintain zero-logo state for other sections to avoid clutter
* feat: render user message as markdown instead of plain text
Render agent mentions as markdown links in user text
Apply inside list style for chat content to fix list rendering
Rely on SimpleMarkdownRenderer for consistent rendering
* fix(openchamber): adjust layout and overscroll behavior
Enable overscroll-auto on overlay containers for smoother scrolling
Move page content to full-width wrapper and preserve section borders
Show AboutSettings inside its own bordered block when visible
* feat: integrate GitHub auth status store and UI
Introduce GitHubAuthStore to track connection status and polling
Show GitHub avatar in header when connected
Guard issue/pr dialogs behind GitHub auth status and show notices
* feat: add GitHub multi-account support
Add API and UI flow to activate a GitHub account
Show and switch between multiple GitHub accounts in header
Persist and normalize accounts list with current selection
* 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
Add check details to PR context via includeCheckDetails flag
Open a checks dialog showing check run summaries and steps
Improve PR lookup for forked repos by matching head branch
Add GitHubIssuePickerDialog UI for selecting issues
Enable new session from GitHub issue from session sidebar
Implement GitHub issues/list/get/comments APIs across desktop, web, and VS Code
* 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.
- Add BranchPickerDialog component to browse branches across all projects
- Filter out branches that already have worktrees
- Show commit hash and ahead/behind indicators for each branch
- Add createWorktreeSessionForBranch() for specific project/branch
- Add worktree and branch picker buttons in sidebar project header
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
Add a dedicated button to create new worktree sessions directly from the
project header. The button appears on hover (alongside the existing menu)
for git repositories, making the worktree feature more discoverable.
- Add onNewWorktreeSession prop to SortableProjectItem
- Show git branch icon button between menu and new session button
- Button only visible for git repositories
- Uses same hover behavior as the existing project menu