接入客户端已启用Skill候选

从扩展索引读取启用状态并合并内置 Skill 清单

输入提示只展示可用 Skill 并保持取消安全
This commit is contained in:
2026-09-15 17:26:25 +08:00
parent 5792978c60
commit bd9b423132
@@ -491,6 +491,7 @@ function ResourceReferenceEditor({
const skipInitialDraftChangeRef = useRef(false);
const [query, setQuery] = useState<string | null>(null);
const [skillQuery, setSkillQuery] = useState<string | null>(null);
const [clientSkills, setClientSkills] = useState<SkillReference[]>([]);
const [pickerOpen, setPickerOpen] = useState(false);
// Enter 提交要避开候选浮层。用 ref 让命令处理器读到最新状态,不必因为
// query / pickerOpen 变化反复重注册 HIGH 优先级命令。
@@ -512,6 +513,39 @@ function ResourceReferenceEditor({
bottom: number;
width: number;
} | null>(null);
useEffect(() => {
const invoke = resolveTauriInvoke();
if (!invoke) return;
let cancelled = false;
void invoke<
Array<{
name: string;
extensionType: string;
enabled: boolean;
status: string;
}>
>('list_client_extensions')
.then((items) => {
if (cancelled) return;
setClientSkills(
items
.filter(
(item) =>
item.extensionType === 'skill' &&
item.enabled &&
item.status === 'enabled',
)
.map((item) => ({ type: 'skill' as const, name: item.name })),
);
})
.catch(() => {
if (!cancelled) setClientSkills([]);
});
return () => {
cancelled = true;
};
}, []);
const assetsContentSignature = assetsSignature(assets);
const versionsContentSignature = iterationsSignature(versions);
const assetReferences = useMemo(
@@ -573,7 +607,7 @@ function ResourceReferenceEditor({
const skillOptions = useMemo(() => {
if (skillQuery === null) return [];
const normalized = skillQuery.trim().toLowerCase();
const allSkills = [...BUILTIN_SKILL_REFERENCES, ...skills];
const allSkills = [...BUILTIN_SKILL_REFERENCES, ...clientSkills, ...skills];
const seen = new Set<string>();
return allSkills
.filter((skill) => {
@@ -587,7 +621,7 @@ function ResourceReferenceEditor({
})
.slice(0, 8)
.map((skill) => new SkillMentionOption(skill));
}, [skillQuery, skills]);
}, [clientSkills, skillQuery, skills]);
const triggerFn = useBasicTypeaheadTriggerMatch('@', {
minLength: 0,