* fix(ui): make chat message action icons always visible
- Removes opacity-0 and pointer-events-none classes from UserMessageBody action buttons container.
- Ensures icons are visible by default instead of only on hover/focus.
- Addresses user feedback about empty space at the bottom of chat bubbles.
* fix(ui): make chat message action icons always visible
- Removes opacity-0 and pointer-events-none classes from UserMessageBody action buttons container.
- Ensures icons are visible by default instead of only on hover/focus.
- Addresses user feedback about empty space at the bottom of chat bubbles.
* fix(ui): prevent diff comment input from closing on click (#3)
Replaced global `document.querySelector('[data-comment-ui]')` with a local `useRef` to detect clicks inside the comment input area. This fixes an issue where clicking the input in one diff viewer would close it if another diff viewer (found first by querySelector) existed in the DOM.
- Added `commentContainerRef` in `PierreDiffViewer.tsx`.
- Updated `handleClickOutside` to check against the ref.
- Attached ref to comment UI containers in both 'fill' and 'inline' layouts.
- Preserved `data-comment-ui` attribute for backward compatibility.
* feat(ui): add visual connector lines to file explorer (#2)
- Replaced manual padding-based indentation with nested list structure
- Added vertical connector lines using border-l on nested ul
- Added horizontal connector lines using pseudo-elements on list items
- Added tail masking for the last item in a branch to create the 'L' shape
- Removed manual padding calculation from file/folder buttons
* Create openchamber.yml
* Create OPENCODE_FOR_ACTIONS.md
* feat: update OpenChamber for Actions workflow and docs (#6)
- Rename `docs/OPENCODE_FOR_ACTIONS.md` to `docs/OPENCHAMBER_FOR_ACTIONS.md`.
- Update `README.md` to include a section on OpenChamber for Actions.
- Update `.github/workflows/openchamber.yml` to allow users to select which service to expose (OpenChamber, OpenCode, or Both).
- Update documentation to reflect the new workflow options.
* feat: Add shimmer effect for generating messages (#7)
* Create test_unreleased.yml
* Update test_unreleased.yml
* Delete test_unreleased.yml
* 🧪 Labs: Enhanced File Explorer with Context Menus & UI Improvements (#13)
* feat: add file management capabilities (create, rename, delete) (#11)
Added backend endpoints for delete and rename operations.
Extended FilesAPI interface and implementation.
Updated FilesView with toolbar buttons for Create File/Folder.
Added context menu to file tree items for Rename, Delete, and Copy Path.
Implemented dialogs for all file operations.
* Refactor UI/UX: Modernize styles, components, and layout architecture (#10)
Refactored `packages/ui` CSS into modular files (design-system, typography, mobile).
Modernized `Header` with pill-style tabs and semantic Flexbox layout.
Enhanced `Chat` UI with threading visuals, improved typography, and better spacing.
Updated `Sidebar` to match the new design system aesthetic.
Verified with full workspace build.
* Add workflow
* Change to manual dispatch only
* Delete test.yml
* Update openchamber.yml
* Fix styling and workflow improvements (#17)
* Refactor OpenChamber workflow and update docs (#18)
- Refactor `.github/workflows/openchamber.yml` to use modular helper scripts.
- Add helper scripts in `scripts/`: `monitor.sh`, `persistence-restore.sh`, `persistence-save.sh`, `opencode-config.sh`.
- Update `docs/OPENCHAMBER_FOR_ACTIONS.md` to reflect new inputs and features.
- Implement robust monitoring with self-healing and proper URL logging.
- Improve persistence robustness for file copying.
* Expose Opencode Core, Web, and Chamber via Cloudflare tunnels (#19)
This commit updates the GitHub Actions workflow and monitoring script to:
1. Install `wetty` to expose the core Opencode TTY over the web (interpreted from user request for "WiTTY").
2. Start `opencode web` (8080), `openchamber` (9090), and `wetty` (3000) concurrently.
3. Configure Cloudflare to create three separate tunnels for these ports.
4. Update `monitor.sh` to accept and display URLs for all three services.
* Update opencode-config.sh
* Tighten actions persistence and UI polish
* Delete openchamber.yml
* Delete persistence-save.sh
* Delete persistence-restore.sh
* Delete opencode-config.sh
* Delete monitor.sh
* Delete install.sh
* Fix OpenChamber workflow and scripts for multi-service tunnels (#21)
* Create auto-opencode.yml
* Update opencode.yml
* feat: add password protection for OpenChamber in Actions (#22)
- Introduce `OPENCODE_SERVER_PASSWORD` secret support in `.github/workflows/opencode.yml`.
- Automatically set `OPENCHAMBER_UI_PASSWORD` and `OPENCODE_UI_PASSWORD` if the secret is provided.
- Configure `ttyd` to use basic auth (`-c user:password`) when password is set.
- Update `scripts/monitor.sh` to respect password settings during service restarts.
- Significantly update `docs/OPENCHAMBER_FOR_ACTIONS.md` with an overview, password configuration instructions, and improved layout (collapsible sections).
* use one password env variable
* Update OPENCHAMBER_FOR_ACTIONS.md
* feat: improve GITHUB_STEP_SUMMARY, fix TTY home logic and add encryption support in scripts
* feat: lazy load large diffs to prevent page freeze (#186)
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>
* feat: add Web Push API support and PWA integration (#189)
* feat: add Web Push API support and PWA integration
Add web Push API with subscribe/unsubscribe and visibility endpoints
Introduce usePushVisibilityBeacon and useSessionDeepLink hooks
Integrate PWA with service worker, registerSW, and VAPID key persistence
* feat: add heartbeat visibility beacon for web runtime
Add a 10s heartbeat to ping visibility while visible
Subscribe to visibilitychange, focus, blur, pageshow, and pagehide events to report state
Clear heartbeat interval on unmount to avoid leaks
* feat(UI): Introduce new UI components for file attachments and related views (#191)
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
* feat: add workbox-window and improve event stream cleanup
Add workbox-window dependency to bun.lock and web package.json
Cancel and release the stream reader on disconnect to avoid leaks
* feat: provider config management (#193)
* feat: support scoped removal of provider config (auth, user, project, custom)
* feat: implement UI session token management with cookies for window visibility control
* feature: header layout changes (#195)
* fix(ui): remove fixed sessions button and mac titlebar coupling
Remove fixed sessions button from header on desktop Mac
Eliminate Mac titlebar spacer and drag-to-dock logic in sidebar
Update layout to rely on standard header/sidebar without mac-specific tweaks
* feat: improve mobile header with session toggle and back button
Add back button in mobile header to exit session switcher
Show Sessions label when session switcher is open in mobile header
Toggle between opening sessions and back navigation based on session state
* restore: add back scripts/install.sh from main branch
* docs: improve Tech Stack section with organized label badges
* Fix actions auth and remove shimmer
* feat: support scoped removal of provider config (auth, user, project, custom)
* feat: implement UI session token management with cookies for window visibility control
* feat: add Web Push API support and PWA integration
Add web Push API with subscribe/unsubscribe and visibility endpoints
Introduce usePushVisibilityBeacon and useSessionDeepLink hooks
Integrate PWA with service worker, registerSW, and VAPID key persistence
* feat: add heartbeat visibility beacon for web runtime
Add a 10s heartbeat to ping visibility while visible
Subscribe to visibilitychange, focus, blur, pageshow, and pagehide events to report state
Clear heartbeat interval on unmount to avoid leaks
Remove commitMessageModel from persisted settings and defaults
Eliminate UI controls and state for commitMessageModel in GitSettings and config store
Update backend and persistence layers to stop reading or writing commitMessageModel
* 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
Add copy diagnostics button in About dialog.
Button copies report with OpenChamber state, OpenCode health, directories, and projects.
Show success or error toasts after copying attempt.
This fixes a race condition where the client watchdog timeout (25s) was shorter than the server heartbeat interval (30s).
Changes:
- Server: Decreased heartbeat interval from 30s to 15s to send keepalives more frequently.
- Client: Increased stale connection threshold from 25s to 45s to allow for 3 missed heartbeats before reconnecting.
This ensures stable connections during long subagent tasks where no text generation occurs.
Co-authored-by: OpenCode Test <test@opencode.ai>
* 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
* fix(upload): increase attachment size limit to 50mb
Raises body limits in web proxy and desktop app. Adds client-side size checks and better 413 error handling.
* fix(client): auto-compress large images to avoid server body limits
Adds client-side compression for images >1MB. Resizes to max 2048px and converts large PNGs to JPEG. Adds detailed logging for debugging.
* chore: remove debug logs from client and proxy
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.
* types: add commitMessageModel to DesktopSettings
* store: add commitMessageModel state and fetch logic
* lib: implement persistence for commitMessageModel setting
* ui: create GitSettings component for model selection
* ui: add Git section to OpenChamber settings sidebar
* ui: register GitSectionContent in OpenChamberPage
* server: use commitMessageModel setting for AI generation
* tauri: sanitize commitMessageModel in settings commands
* tauri: use commitMessageModel for desktop message generation
* build: update lockfile and package configuration
* refactor(openchamber): improve default model parsing with fallback logic
* feat(openchamber): improve model selection fallback logic
* refactor: move worktree settings into git section
* refactor(openchamber): merge worktree into git section
* refactor[worktree]: simplify empty state layout
* revert: rollback bun.lock and package.json to main
* feat(git): restrict model selection to OpenCode provider
- Added `createWorktreeSession` utility to handle the creation of new sessions with auto-generated worktrees.
- Introduced branch name generation utilities for creating unique and friendly branch names.
- Updated `CommandPalette` to trigger worktree session creation via a command.
- Refactored keyboard shortcuts to support new worktree session creation with Shift + Cmd/Ctrl + N.
- Enhanced project settings to include worktree defaults (branch prefix, base branch, auto-create option).
- Updated persistence logic to preserve worktree defaults when saving project settings.
- Modified menu actions to initiate new worktree sessions.
- Ensured proper handling of existing branches to avoid conflicts during worktree creation.
- 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
Add global event stream endpoint for cross-session activity monitoring
Support multiple concurrent SSE subscriptions with scoped connections
Enhance session activity detection from various event types
* 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
Allow selecting a base branch when creating new worktree branches
Add dropdown to choose start point from existing branches
Extend worktree creation flow to support custom branch origins
* feat(web): add Cloudflare Quick Tunnel support for remote access
Implement --try-cf-tunnel flag that creates a temporary public URL
routing to the locally running server via cloudflared.
Features:
- Auto-detect and spawn cloudflared subprocess
- Extract and display *.trycloudflare.com URL
- Proper cleanup on server shutdown
- Dynamic port handling (tunnel routes to actual listening port)
- Isolated HOME dir to avoid config conflicts
- Installation help and limitations warning
* docs: add Cloudflare tunnel feature to README
- Document --try-cf-tunnel flag in CLI examples
- Add Cloudflare Quick Tunnel to Web/PWA features
* docs: add cloudflared as prerequisite for --try-cf-tunnel
* feat(web): auto-generate password for Cloudflare tunnel
When using --try-cf-tunnel without --ui-password, automatically generate
a secure random password to protect the publicly exposed service.
Features:
- 16-character random password (easy to read, no ambiguous characters)
- Password is displayed after tunnel is established
- Warning to save the password (not shown again)
- Works in both foreground and daemon modes
- Uses same password for subsequent restarts (stored in instance file)
* fix(web): improve Cloudflare tunnel UX and fix spawn ENAMETOOLONG
- Generate and display password before tunnel starts (green colored)
- Display tunnel URL in cyan via onTunnelReady callback
- Fix ENAMETOOLONG by using env:undefined instead of copying process.env
- Pass tryCfTunnel flag from CLI to main function
- Remove duplicate tunnel URL output
- Update warning message to reflect password protection
- Change start script to use CLI wrapper for proper initialization
---------
Co-authored-by: aptdnfapt <197602950+aptdnfapt@users.noreply.github.com>
- 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.
- Added support for project-level agents, allowing agents to be created, updated, and deleted within a specified working directory.
- Introduced `getAgentScope` function to determine the scope of agents based on their existence in project or user directories.
- Updated `getAgentSources`, `createAgent`, `updateAgent`, and `deleteAgent` functions to handle project-level paths and configurations.
- Enhanced logging to provide clearer information about agent operations, including scope and working directory.
- Refactored configuration reading and writing to accommodate project-specific configurations alongside user-level settings.
- Introduced command scope types (user and project) to manage command configurations at different levels.
- Enhanced command management functions to check and create commands based on their scope.
- Updated the API to handle command creation, updates, and deletions with respect to their scope.
- Added a reload button in the AboutSettings component to refresh OpenCode configuration.
- Improved command source retrieval to prioritize project-level commands over user-level commands.
- Refactored related functions to ensure proper handling of command paths and configurations based on scope.
- Improved development server hot module replacement (HMR) by reusing OpenCode processes.
- Introduced queued message mode with batching and idle auto-send, including support for attachments.
- Added a toggle for queue mode in OpenChamber settings with persistence across sessions.
- Updated various components to handle queued messages, including ChatInput and QueuedMessageChips.
- Modified settings payload and desktop settings to include queue mode configuration.
- Enhanced message sending logic to support additional parts for queued messages.