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>
- Set UTF-8 environment variables (PYTHONUTF8, PYTHONIOENCODING, LANG,
LC_ALL) on all child processes via process.rs helpers
- Configure PTY terminals per shell flavor: chcp 65001 for cmd.exe,
[Console]::OutputEncoding for PowerShell, LANG=C.UTF-8 for Git Bash
- Use /K and -NoExit for interactive shells to avoid nested processes
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>
The naive // and /* check triggered on URLs like https://... inside
string values. Now we only reject the file as JSONC when serde_json
parsing fails AND comment-like sequences are found.
- 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
After a successful plugin install, read the actual installed version from
node_modules and replace @latest in opencode.json with the pinned version.
This prevents opencode from hitting the npm registry on every startup.
Also add a preflight warning when @latest specs are detected, guiding
the user to install via the plugin manager to auto-pin.
Add InstallOpencodePlugins variant to FixActionKind and wire
opencode_plugins::check_opencode_plugins into check_binary_environment
so preflight surfaces missing/installed plugin status for OpenCode agents.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add concurrency lock (PLUGIN_OP_LOCK), install/uninstall functions with
bun subprocess management, progress event streaming via EventEmitter, and
protected-package guard for @opencode-ai/* internals.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add check_opencode_plugins() to read ~/.config/opencode/opencode.json,
parse the plugin[] array, and cross-reference against
~/.cache/opencode/node_modules/ to report installed vs. missing plugins.
Also adds opencode_config_path, opencode_cache_dir, and
has_project_opencode_config helpers.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- feat(chat): show skills list on $ trigger for Codex instead of experts.
- fix(chat): restore ~/.agents/skills/ as additional Codex skill dir.
- fix(chat): support mid-text slash trigger and keyboard scroll in autocomplete.
- fix(chat): stop plan in-progress spinner when agent is not streaming.
-----------------------------
# 发布版本 0.7.2
- 新增(聊天):Codex 输入 $ 时显示技能列表,替代原有的专家列表;
- 修复(聊天):恢复 ~/.agents/skills/ 作为 Codex 额外的技能目录;
- 修复(聊天):支持在文本中间触发斜杠命令,自动补全支持键盘滚动;
- 修复(聊天):当 agent 未在流式响应时停止 plan 进行中的 spinner。