Add an Effort Level dropdown under the Claude Code model inputs with
options Low / Medium / High / Max (Opus only). The selection writes an
"effortLevel" key at the root of the Claude Code config JSON, and is
removed when the default is chosen. Manual edits to the native JSON
textarea stay in sync with the dropdown.
- Thread workspace path through useAgentSkills so Codex $-autocomplete
surfaces folder-local skills in addition to global ones; cache keyed
by agent + workspace and invalidated per key on focus.
- Add Global/Folder scope tabs and a folder picker (sourced from the
folder table via loadFolderHistory) to the Skills settings page.
CRUD for skills now operates against the selected scope and folder.
- Default the settings right panel to a placeholder hint; the new-skill
form only appears after clicking "New Skill" or selecting an existing
skill. Search input is hidden in folder scope.
- Disable "New Skill" when folder scope has no folder chosen; show a
pick-folder hint in the path preview for that state.
- Add scope/noSelectionHint/pickFolderHint strings across 10 locales.
Add a "Reset to Here" context action for git log commit items in the folder page.
Show a reset dialog with branch, target commit, commit message, and reset mode details for soft, mixed, hard, and keep.
Disable reset when viewing a non-current branch filter and keep the action ordering under commit diff.
Add git_reset support across Rust commands, Tauri invoke registration, web handlers/routes, and frontend API/type bindings.
Add localized reset labels, mode descriptions, and toast messages across all supported languages.
Add the Add to session context action for tracked and untracked nodes in the Changes panel, including root, directory, and file entries.
Reorder Changes context actions so Add to session is placed below View diff, and Rollback is placed below Add to VCS.
Update attachToCurrentSession translations to the Add to session wording across all supported locales.
Introduce a shared workspace-state backend stream with snapshot/delta APIs for file tree and git changes.
Migrate both aux panels to a common frontend workspace store with lifecycle-safe stream handling.
Apply batched watch throttling, path-aware git refresh gating, no-op delta suppression, and bounded history compaction to improve runtime stability.
Ensure async watch setup is safely discarded after effect cleanup.
Use idempotent watcher release logic to avoid duplicate subscriptions and unbalanced stop calls.
Prevent left and right sidebars from auto-opening on small screens during folder page initialization, regardless of persisted open state.
Gate mobile sidebar sheets behind restored panel state to avoid initial sidebar pop-in.
Memoize ChatInput to minimize unnecessary updates in the chat input area during frequent parent renders.
Compute localized Claude API retry banner text lazily and only when retry state is present.
Enable raw Claude SDK forwarding for ACP sessions and emit only system/api_retry events to the frontend.
Show a localized single-line retry banner with loading under the conversation input, including error details and retry progress.
Strip spurious leading slash from Windows drive-letter paths (/D:/foo → D:/foo) in parseLocalFileTarget so that workspace-relative comparison succeeds and local files can be opened correctly. Display the normalized path in the confirmation dialog. Internationalize all link safety dialog and toast strings across 10 locales.
Replace raw_output single-string accumulation with a chunks array to
eliminate O(n^2) string concatenation on every 200ms terminal poll event.
Batch tool_call_update dispatches via requestAnimationFrame so multiple
agents no longer trigger 25+ React re-renders per second.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Prevent hover tooltip flicker by adding pointer-events:none to the
.context-view overlay that covers trigger buttons
- Escape overflow:hidden clipping on ancestor elements by switching the
tooltip overlay to position:fixed, with CSS custom properties
(--cv-offset-x/y) set via ResizeObserver to translate container-relative
coordinates to viewport-relative
- Give the find widget its own border/radius styles (no top border,
bottom-only border-radius) since it slides from the editor top
- Adjust close button vertical position to align with action buttons
Closes#73
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Detect dark/light mode before React hydrates to eliminate the visible
white-to-dark flash when opening windows in dark mode.
Frontend:
- Inline script now reads next-themes localStorage key and applies
.dark class, colorScheme, and backgroundColor on <html> before first
paint
- Add CSS-only fallback via prefers-color-scheme media query in an
inline <style> tag that fires before any JS executes
macOS backend:
- Detect system dark mode via `defaults read -g AppleInterfaceStyle`
(cached with OnceLock) and set native window background color to
match dark theme in apply_platform_window_style
- Persist user appearance mode preference (dark/light/system) to DB
alongside zoom level so new windows use the correct background
- Add update_appearance_mode Tauri command; frontend syncs on mount,
on settings change, and on cross-window storage events
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The merge commit ee60536 dropped the custom OverlayScrollbars theme
definition from globals.css, leaving scrollbar handles with zero size
and no background color. Restore the theme with a compound selector
(.os-scrollbar.os-theme-codeg) to ensure higher specificity than the
library's base defaults regardless of CSS load order.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The body-level OverlayScrollbar (position: fixed, z-index: 99999) with
clickScroll and dragScroll enabled was capturing pointer events on the
scrollbar track, preventing the message list's native scrollbar from
receiving them. Disable both interactions on the body instance since it
does not need to scroll.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Leverage the Tauri updater plugin's DownloadEvent callback to display
a progress bar with downloaded/total bytes during app updates, replacing
the previous spinner-only feedback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the spinner-only UX with live log output during agent SDK
operations, matching the existing OpenCode plugin install experience.
Backend: emit structured events (started/log/completed/failed) via
EventEmitter during npm install and binary download. npm commands now
run with piped stdio for line-by-line streaming; binary downloads
report chunked progress every 1 MB.
Frontend: subscribe to `app://agent-install` events through a new
`useAgentInstallStream` hook and render a theme-aware log terminal
below the preflight checks panel.
Also fixes the install log container in both agent settings and the
OpenCode plugins modal: auto-scroll no longer shifts the outer page,
and colours now follow the active light/dark theme.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drop `scrollbar-gutter: stable both-edges` / `stable` from `.scrollbar-thin`
and `.scrollbar-thin-edge` so scrollbars overlay content without reserving
space, fixing layout inconsistencies between overlay and classic scrollbar
environments. Restore padding that was previously reduced to compensate for the
gutter: `px-1` to `px-3` in git-log-tab, `px-2` to `px-4` in
virtualized-message-thread, and add `px-2` to sidebar-conversation-list and
session-files-tab.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use Tauri's native `traffic_light_position()` builder method to position
macOS window controls instead of runtime objc2 calls. A global AtomicU32
tracks the current zoom level so newly created windows reflect the latest
zoom. The frontend syncs zoom changes to the backend via a new
`update_traffic_light_position` command.
- Add `traffic_light_position()` to `apply_platform_window_style` builder
- Add `CURRENT_ZOOM` atomic and `traffic_light_position()` helper
- Register `update_traffic_light_position` Tauri command
- Add `syncTrafficLightPosition` in appearance-provider to sync on zoom
change, mount, and cross-tab storage events
- Consolidate `ensure_windows_undecorated` calls into `post_window_setup`
- Remove dead `on_window_resized` no-op and its Resized event listener
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Drop text-primary/80 from expert dropdown icons and text-primary from
mode/config selector trigger buttons so they inherit the default
foreground color and transition naturally with themed hover states.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- install_missing_plugins now pins ALL @latest specs (not just newly installed)
- When nothing is missing but @latest exists, the pin-only path runs
- Modal button switches to 'Pin @latest Versions' when no missing plugins
- Added pinVersions i18n key for 10 languages
- Session-page connect never triggers download/install; returns
SdkNotInstalled immediately and prompts the user to install from
Agent Settings instead
- Binary agents now accept any cached version via
find_best_cached_binary_for_agent so stale caches still connect
- Bound Initialize handshake with a 60s timeout and convert it to
AcpError::InitializeTimeout via a sentinel in run_connection
- Spawn background task owns ConnectionManager map insertion and
removes the entry on exit through an RAII guard that survives
panics, preventing leaked stale entries
- AcpError gains SdkNotInstalled and InitializeTimeout variants plus
a stable code() identifier; AcpEvent::Error carries code so the
frontend can render localized messages by key
- Frontend preflight now runs for all connect sources; error event
handler switches on code to show translated text for
initialize_timeout, sdk_not_installed, platform_not_supported,
process_exited, spawn_failed and download_failed
- Remove ConnectionStatus::Downloading enum variant, all frontend
branches, and i18n strings; drop obsolete autoLinkFailedTitle,
autoLinkPreflightFailed, preflightCheckFailedDefault and
preflightFailedTitle keys across 10 locales
- Add backendErrors.* translations in 10 languages
- Diagnostic logging: always log agent stderr plus binary
path/size/args/env keys and Initialize timing; gate stdin/stdout
JSON-RPC tracing behind CODEG_ACP_DEBUG to avoid persisting user
content into OS log files
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Task 7 inadvertently overwrote 18 carefully-tuned translations across 7 languages
(ar/de/es/fr/ja/ko/pt) with the plan author's slightly different wording while
adding the new themeColor / zoomLevel / resetToDefaults keys. The new additions
remain intact; only the pre-existing keys are reverted to the project's original
translations (e.g. de "Designmodus" instead of "Design-Modus", ja
"システム追従" instead of "システムに従う"). Affects: sectionDescription,
themeMode, placeholder, system, currentTheme.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>