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:
xintaofei
2026-04-11 00:13:42 +08:00
parent e4eb7f67eb
commit ade59f474c
11 changed files with 187 additions and 29 deletions

View File

@@ -46,6 +46,7 @@ import {
expertsUnlinkFromAgent,
openFolderWindow,
} from "@/lib/api"
import { invalidateAgentExpertsCache } from "@/hooks/use-agent-experts"
import type {
AcpAgentInfo,
AgentType,
@@ -336,6 +337,7 @@ export function ExpertsSettings() {
if (enable) {
const next = await expertsLinkToAgent({ expertId, agentType })
setStatuses((prev) => ({ ...prev, [agentType]: next }))
invalidateAgentExpertsCache(agentType)
toast.success(t("toasts.enabled"))
} else {
await expertsUnlinkFromAgent({ expertId, agentType })
@@ -346,6 +348,7 @@ export function ExpertsSettings() {
map[entry.agentType] = entry
}
setStatuses(map)
invalidateAgentExpertsCache(agentType)
toast.success(t("toasts.disabled"))
}
} catch (err) {