* feat: integrate GitHub OAuth device flow across runtimes
Add GitHub OAuth device flow endpoints across runtimes
Introduce GitHubSettings UI panel and sidebar entry
Persist GitHub auth state in per-runtime storage
* feat: add GitHub PR status and PR description generation
Show PR status for the current branch in the Git view
Generate a pull request description from the diff between base and head
Expose prStatus, prCreate, and prMerge APIs in web and desktop clients
* feat: add GitHub PR ready for review
Add API to mark pull requests as ready for review
Show a Ready button for draft PRs and reflect status in UI
Handle token expiration and GraphQL errors when marking ready
Add file management API and UI components
Implement directory listing, search and CRUD operations in desktop backend
Expose new Files API on frontend to list, search, and modify files
When diff content exceeds 1500 lines or 150KB, show a placeholder with
"Load Diff" button instead of parsing immediately. This prevents the page
from freezing when viewing large diffs.
Co-authored-by: Jovines <jovines@qq.com>
- 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.
Add gitmoji toggle in Git settings to enable emoji support
Show Add gitmoji button in commit section when feature is enabled
Display gitmoji picker dialog with searchable emoji list
* 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
Add support for token-based git authentication in identity profiles.
Enable discovery and import of credentials from ~/.git-credentials file.
Introduce remote URL-based filtering for token identities in git view.
- Introduced `readFile` and `writeFile` methods in the FilesAPI for reading and writing files.
- Added `execCommands` method to execute shell commands in a specified directory.
- Implemented `runWorktreeSetupCommands` function to handle setup commands for worktrees.
- Created `OpenChamberConfig` service for managing project-specific configuration, including setup commands.
- Enhanced `useMultiRunStore` to save and execute setup commands during multi-run creation.
- Updated VSCode bridge to handle file read/write and command execution requests.
- Added server endpoints for reading and writing files, and executing shell commands.
* 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
* fix(chat): prevent message send during IME composition
Add isComposing check to ChatInput to prevent messages from being sent
during Japanese/CJK character conversion. This fixes the issue where
pressing Enter to confirm IME composition would immediately send the
message instead of just completing the character conversion.
Changes:
- Add early return in handleKeyDown when IME is composing
- Add explicit isComposing check to Enter key handler
Fixes issue where Enter during IME composition sends incomplete text.
* fix(chat): improve IME composition detection with keyCode 229 fallback
Add isIMECompositionEvent helper function that checks both isComposing
and keyCode === 229, as recommended by MDN. This fixes IME input issues
on WebKit-based browsers (including Tauri WebView on macOS) where
compositionend may fire before keydown, causing isComposing to be false
when Enter key is processed.
Changes:
- Add isIMECompositionEvent helper function with dual detection
- Update handleKeyDown to use the new helper for IME checks
Fixes MacUI desktop app issue where pressing Enter during IME
composition would send the message instead of confirming the input.
* fix(agent-manager): prevent message send during IME composition
Apply the same IME composition fix as ChatInput to AgentManagerEmptyState.
Add isIMECompositionEvent helper and check it in handleKeyDown to prevent
accidental form submission when confirming IME input with Enter key.
* fix(agent-manager): add redundant IME check to Enter key handler
Add explicit isIMECompositionEvent check to the Enter key condition in
handleKeyDown. Although the early return already handles this, this
change ensures the implementation pattern matches ChatInput.tsx exactly
for consistency and safety.
* Add Agent Selector
* Send on Enter
* Allow multi run with 1 Model for Agent Manager
* Update packages/ui/src/stores/useMultiRunStore.ts
* Update Changelog
* Add Agent Manager
* Basic Mock UP
* Fix Comand naming Ctrl+P Uses Category to group
* Move the UI in views
* Agent Manager Landing Page
* Fix attachment buig
* Change Session Name for multi run to incoporate groupSlug
* First running UI
* Fix Max Model Multi Run
* Rework Agent Group detection
* ignore false positives with ' ' in it
* Simplify Logic
* remove unused dropdowns
* Clean up
* Update Changelog
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
* feat(ui): update keyboard shortcuts to use platform-appropriate modifier keys
* fix(macos): update keyboard shortcuts to use Cmd modifier
Change Command Palette shortcut from Ctrl+X to Cmd+K
Update all menu shortcuts to use Cmd instead of Ctrl on macOS
* Fix linter issue
* feat(terminal): replace xterm with ghostty-web
Replace xterm.js terminal with ghostty-web implementation
Add terminal serialization support for state restoration
Apply custom patches to ghostty-web for enhancements
* feat(terminal): add bun-pty backend support
Switch terminal to ghostty-web with bun-pty backend for better performance
Auto-detect and prefer Bun runtime when available for terminal sessions
Update terminal viewport write queue handling for improved reliability
* fix(terminal): prevent unnecessary resize events
Only report terminal resize when dimensions actually change
Simplify chunk processing state tracking
Disable terminal transparency for consistent rendering
* feat(terminal): increase scrollback and buffer limits
Increase terminal scrollback buffer from 10k to 50k lines
Increase terminal buffer limit from 256k to 1M bytes
Add rate limiting and improve output handling for terminal streams
- 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.