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。
Track the slash trigger position so the menu can open after prose, then
splice only the slash token on selection instead of clobbering the whole
input. Also scroll the highlighted row into view when keyboard navigation
moves past the popup viewport.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Codex $ prefix autocomplete now lists skills from
acp_list_agent_skills (excluding ids that match built-in experts), while
experts remain reachable via the dedicated Sparkles button. Non-Codex
agents are unchanged and still show only their native ACP commands on
the / trigger.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Codex CLI also reads skills from ~/.agents/skills/, so include it
alongside ~/.codex/skills/ in the skill storage spec. The Codex dir
stays first so it remains the preferred write target for new links,
while lookup and unlink scan both locations.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add "Enable Skills" toggle below "Enable WebSocket" in Codex CLI settings,
writing `skills = true` under [features] in config.toml. Also add max-height
to auth.json and config.toml textareas, and fix TOML section key insertion
to avoid stray blank lines between entries.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Change Codex skill storage to use only ~/.codex/skills/ instead of
~/.agents/skills/, and never disable the expert skills button so users
can always access the empty-state hint. Also fix stale expert list in
conversation window after linking in the separate settings window by
re-fetching on window focus.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expert skills in the chat session were derived by intersecting built-in
experts with ACP availableCommands, which caused Codex experts to never
appear since Codex does not advertise skills through ACP.
- Add `experts_list_for_agent` backend API that checks symlink status
across all global skill dirs for the given agent type
- Replace availableCommands-based expert filtering with symlink-based
query, making the settings page the single source of truth
- Use `$` prefix for Codex expert skills while keeping `/` for slash
commands and other agents' experts
- Disable the expert button when no experts are linked for the agent
- Invalidate per-agent expert cache after link/unlink in settings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When reopening a Gemini CLI history session, session/load fails with
"Authentication required" and the fallback session/new overwrites the
DB external_id with a new session ID that has no corresponding file,
causing all historical messages to disappear.
- Skip session/new when session/load returns "Authentication required"
- Add Gemini to the parser fallback so stale external_ids recover via
folder_path + started_at matching
- Guard externalIdSavedRef for existing conversations to prevent
session/new from overwriting the persisted external_id
- Only update conversation status on disconnect when user has sent a
message, avoiding spurious "completed" flips on pure history views
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>