fix(chat): query expert skills via symlinks and use $ prefix for Codex
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>
This commit is contained in:
@@ -682,6 +682,47 @@ pub async fn experts_list() -> Result<Vec<ExpertListItem>, ExpertsError> {
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
#[cfg_attr(feature = "tauri-runtime", tauri::command)]
|
||||
pub async fn experts_list_for_agent(
|
||||
agent_type: AgentType,
|
||||
) -> Result<Vec<ExpertListItem>, ExpertsError> {
|
||||
let _ = skill_storage_spec(agent_type)
|
||||
.ok_or(ExpertsError::UnsupportedAgent(agent_type))?;
|
||||
|
||||
let dirs = scoped_skill_dirs(agent_type, AgentSkillScope::Global, None)
|
||||
.map_err(|_| ExpertsError::UnsupportedAgent(agent_type))?;
|
||||
|
||||
let meta_list = bundled_metadata().to_vec();
|
||||
let manifest = load_manifest();
|
||||
let mut out = Vec::new();
|
||||
|
||||
for meta in meta_list {
|
||||
let central_path = expert_central_path(&meta.id);
|
||||
let is_linked = dirs.iter().any(|dir| {
|
||||
let candidate = dir.join(&meta.id);
|
||||
classify_link(&candidate, ¢ral_path) == ExpertLinkState::LinkedToCodeg
|
||||
});
|
||||
if !is_linked {
|
||||
continue;
|
||||
}
|
||||
|
||||
let installed_centrally = central_path.exists();
|
||||
let user_modified = manifest
|
||||
.experts
|
||||
.get(&meta.id)
|
||||
.map(|e| e.pending_user_review)
|
||||
.unwrap_or(false);
|
||||
|
||||
out.push(ExpertListItem {
|
||||
metadata: meta,
|
||||
installed_centrally,
|
||||
user_modified,
|
||||
central_path: central_path.to_string_lossy().to_string(),
|
||||
});
|
||||
}
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
#[cfg_attr(feature = "tauri-runtime", tauri::command)]
|
||||
pub async fn experts_get_install_status(
|
||||
expert_id: String,
|
||||
|
||||
Reference in New Issue
Block a user