* 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
Node's ESM loader rejects bare Windows paths (e.g. C:\...) passed to
dynamic import(), interpreting the drive letter as a URL protocol.
Convert the package-manager.js path through pathToFileURL() to produce
a valid file:// URL, matching the fix already applied to the server
import on line 628.
* 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
* feat: add Cloudflare Tunnel settings for desktop app
Add a 'Remote Tunnel' section in Settings (desktop-only) that lets users
start/stop a Cloudflare quick tunnel on demand, with auto-generated
password protection and a QR code for easy mobile access.
- Server: 4 new API endpoints (check/status/start/stop) reusing the
existing cloudflare-tunnel module
- UI: TunnelSettings component with full state machine
(checking → idle/not-available → starting → active → stopping)
- QR code rendered via the qrcode package for in-app display
- Hidden from VS Code extension (desktop/web only)
* fix: use ?token= instead of ?p= in tunnel password URLs
REST API endpoints were building passwordUrl with ?p=<token> but
SessionAuthGate reads the ?token= query param, causing QR code
auto-login to fail — the password was never extracted from the URL.
Standardize all three tunnel URL construction sites to use ?token=
so scanning the QR code correctly pre-fills and submits the password.
* feat: secure remote tunnel access with one-time connect links
* feat: redesign remote tunnel settings and access flow
* fix: cleaned up unused desktop close code path
* feat: overhaul named tunnel setup and persistence flow
* chore: align codemirror language dependency resolution
---------
Co-authored-by: Brian-Hwang <brian.hwang@cornelisnetworks.com>
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
* feat: add project actions in header with reliable terminal run flow
- Add per-project Actions settings with icons, platform filters, and default action
- Run/stop actions from header using terminal tabs, including Ctrl+C then force-kill fallback
- Improve terminal UX with stable selection, resize handling, and smarter URL auto-open for localhost ports
* feat: add project actions UI with refined header dropdown behavior
* feat: add parent-session back button in chat
* fix: make web and desktop dev modes reliable and conflict-free
- Separate desktop and web dev ports to avoid collisions
- Add robust process-tree shutdown so Ctrl+C cleans sidecars
- Add true web HMR mode and keep service worker out of dev
* fix: linux safe scripts for dev
* feat: run project actions on web and add desktop SSH forward URL opening
* feat: add mobile project actions button with terminal tabs and tighter tab UI
* revert: remove experimental mobile terminal selection UI
* feat: show Add action button in header when empty
* fix: make retry countdown human-readable in status row
* fix: prevent nav rail actions from firing through overlays
* feat(vscode): implement file drop API for handling dropped files in VS Code
* refactor(vscode): deduplicate attachment parsing for picked and dropped files
Replace AnimatedTabs with lightweight text toggle in mobile usage view
to improve visual hierarchy between navigation tabs and filter options.
The new design uses text buttons with underline indicator instead of
card-style tabs, making the two tab levels more distinguishable.
Co-authored-by: Jovines <jovines@qq.com>
- Add isGitRepository check before getStatus() to prevent noisy errors on non-git directories
- Resolve npm shell wrapper shims on Windows so Bun can spawn OpenCode via node interpreter
- Add Win32PathFix middleware to normalize forward slashes to backslashes in directory params
- Merge sessions from all project directories on bare GET /session for Windows path compat
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(container): add Docker deployment and terminal shell fallback
Add Docker runtime assets (Dockerfile, compose file, and entrypoint) to run OpenChamber in containers with persistent config/data mounts.
Improve terminal PTY startup reliability by probing multiple shell candidates and falling back automatically across Unix and Windows environments.
* fix: add OMO install env
* docs: add Docker Compose instructions to README
The original design used onPointerUp to cycle agents, which doesn't trigger
focus transfer and keeps the soft keyboard open. Recent changes switched to
onClick which causes button to gain focus and closes the keyboard.
- Remove onClick handler entirely
- Restore handlePointerDown, handlePointerUp, handlePointerLeave handlers
- Use onPointerUp to trigger agent cycling
- Add onContextMenu to prevent context menu on long-press
- Add extensive comments explaining why pointer events must be used
This reverts to the behavior from commit 337c458f where clicking the agent
button doesn't close the soft keyboard.
Co-authored-by: Jovines <jovines@qq.com>
- Add childIndicators prop to SessionStatusHeader component
- Display up to 3 running child sessions with their agent colors
- Show extra count (+n) when there are more than 3 child sessions
- Align visual style with non-selected session items (using brackets [])
- Pass childIndicators through CollapsedView and ExpandedView components
- Extract child indicators from current session's processed status
Co-authored-by: Jovines <jovines@qq.com>
- Add modal={false} to DropdownMenu to prevent drawer closing when
dismissing branch selector without selecting
- Remove auto-focus on search input to prevent unwanted keyboard popup
when opening branch selector on mobile
Co-authored-by: Jovines <jovines@qq.com>
Add separate MiniMax quota providers for minimax.io and minimaxi.com
Register and export both MiniMax providers in the web quota dispatcher
Update UI quota provider types/list and quota module documentation
- Increased max-width of the autocomplete container from 520px to 640px.
- Updated truncatePathMiddle maxLength from 45 to 60 for better visibility.
- Added a fade-out mask to the marquee container to prevent abrupt clipping.
* feat(nav-rail): add expand/collapse toggle with project names and settings control
The NavRail introduced in v1.7.5 only shows project icons without names,
making it difficult to identify which project is active when multiple
projects share similar icons or use letter avatars.
Changes:
- Add expandable NavRail that shows full project names alongside icons
- Default to expanded when multiple projects are open
- Auto-collapse to icon-only mode with a single project (nothing to differentiate)
- Add toggle button at bottom of rail with Cmd+Shift+E keyboard shortcut
- Highlight active project with interactive.selection background for clarity
- Show keyboard shortcut hints in tooltip and expanded label
- Add 'Expand project rail' checkbox in Settings > Appearance > Navigation
- Persist expansion state across sessions
Fixes: NavRail project icons are ambiguous without visible project names
* feat: improve nav rail toggle and navigation settings
- Make nav rail collapsed by default with smoother text fade behavior
- Move nav rail and terminal quick keys controls into a dedicated Navigation section
- Update keyboard shortcuts for logs/status and nav rail expand/collapse
---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
* feat(server): add OPENCODE_HOST env var for external OpenCode connections
Allows specifying a full base URL (e.g. https://hostname:4096) for external
OpenCode connections, supporting custom hostnames and HTTPS. When set,
OPENCODE_HOST overrides OPENCODE_PORT. Malformed values are fatal at startup.
* docs: document OPENCODE_HOST env var in README and AGENTS
* Fatal error when OPENCODE_HOST has path, search or hash
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Colin Mollenhour <colin@mollenhour.com>
* fix(server): use external origin when re-probing OpenCode
---------
Signed-off-by: Colin Mollenhour <colin@mollenhour.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Tighten message deduplication and turn-structure checks in chat rendering
- Avoid stale cached turn grouping data during streaming and incremental updates
- Keep message order stable so headers and grouped messages render consistently
* fix(chat): reduce user message padding on mobile
* fix(mobile): limit drawer swipe gesture to status bar only
* fix(chat): hide top scroll shadow on mobile
* fix: add mobile edge-swipe drawer fallback and normalize comments
- Adds narrow left/right mobile edge swipe zones for drawer gestures
- Keeps drawer swipe access even when the mobile status bar is hidden
- Replaces remaining non-English comments in touched chat/layout files
* fix: remove edge swipe settings and tighten mobile chat spacing
---------
Co-authored-by: Jovines <jovines@qq.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
- Remove Utility Model controls from Session Defaults and restore that section’s original scope.
- Add Zen-based Summarization Model selector to Notifications under AI Summarization.
- Keep config resolution aligned with zenModel-only utility behavior in useConfigStore and git API flow.