





















@@ -64,49 +64,46 @@ export function isSkillUserInvocable(entry: SkillEntry): boolean {
6464return true;
6565}
666667+export function filterPromptVisibleSkillEntries(entries: readonly SkillEntry[]): SkillEntry[] {
68+return entries.filter(isSkillPromptVisible);
69+}
70+71+export function filterUserInvocableSkillEntries(entries: readonly SkillEntry[]): SkillEntry[] {
72+return entries.filter(isSkillUserInvocable);
73+}
74+75+export function buildSkillIndexEntries(
76+entries: readonly SkillEntry[],
77+opts?: BuildSkillIndexOptions,
78+): SkillIndexEntry[] {
79+const agentSkillSet =
80+opts?.agentSkillFilter === undefined ? undefined : new Set(opts.agentSkillFilter);
81+return entries.map((entry) => createSkillIndexEntry(entry, opts, agentSkillSet));
82+}
83+6784export function buildSkillIndex(
6885entries: readonly SkillEntry[],
6986opts?: BuildSkillIndexOptions,
7087): SkillIndex {
7188const byName = new Map<string, SkillIndexEntry>();
7289const normalized = new Map<string, SkillIndexEntry[]>();
73-const indexedEntries: SkillIndexEntry[] = [];
90+const indexedEntries = buildSkillIndexEntries(entries, opts);
7491const runtimeEntries: SkillEntry[] = [];
7592const promptVisibleEntries: SkillEntry[] = [];
7693const userInvocableEntries: SkillEntry[] = [];
779478-for (const entry of entries) {
79-const name = entry.skill.name;
80-const skillKey = resolveSkillKey(entry.skill, entry);
81-const source = resolveSkillSource(entry.skill);
82-const indexed: SkillIndexEntry = {
83- entry,
84- name,
85-normalizedName: normalizeSkillIndexName(name),
86- skillKey,
87-normalizedSkillKey: normalizeSkillIndexName(skillKey),
88- source,
89-bundled:
90-source === "openclaw-bundled" ||
91-(source === "unknown" && opts?.bundledNames?.has(name) === true),
92-agentAllowed: opts?.agentSkillFilter === undefined || opts.agentSkillFilter.includes(name),
93-runtimeVisible: isSkillRuntimeVisible(entry),
94-promptVisible: isSkillPromptVisible(entry),
95-userInvocable: isSkillUserInvocable(entry),
96-};
97-98-indexedEntries.push(indexed);
99-byName.set(name, indexed);
95+for (const indexed of indexedEntries) {
96+byName.set(indexed.name, indexed);
10097addNormalizedEntry(normalized, indexed.normalizedName, indexed);
10198addNormalizedEntry(normalized, indexed.normalizedSkillKey, indexed);
10299if (indexed.runtimeVisible) {
103-runtimeEntries.push(entry);
100+runtimeEntries.push(indexed.entry);
104101}
105102if (indexed.promptVisible) {
106-promptVisibleEntries.push(entry);
103+promptVisibleEntries.push(indexed.entry);
107104}
108105if (indexed.userInvocable) {
109-userInvocableEntries.push(entry);
106+userInvocableEntries.push(indexed.entry);
110107}
111108}
112109@@ -120,6 +117,31 @@ export function buildSkillIndex(
120117};
121118}
122119120+function createSkillIndexEntry(
121+entry: SkillEntry,
122+opts: BuildSkillIndexOptions | undefined,
123+agentSkillSet: ReadonlySet<string> | undefined,
124+): SkillIndexEntry {
125+const name = entry.skill.name;
126+const skillKey = resolveSkillKey(entry.skill, entry);
127+const source = resolveSkillSource(entry.skill);
128+return {
129+ entry,
130+ name,
131+normalizedName: normalizeSkillIndexName(name),
132+ skillKey,
133+normalizedSkillKey: normalizeSkillIndexName(skillKey),
134+ source,
135+bundled:
136+source === "openclaw-bundled" ||
137+(source === "unknown" && opts?.bundledNames?.has(name) === true),
138+agentAllowed: agentSkillSet === undefined || agentSkillSet.has(name),
139+runtimeVisible: isSkillRuntimeVisible(entry),
140+promptVisible: isSkillPromptVisible(entry),
141+userInvocable: isSkillUserInvocable(entry),
142+};
143+}
144+123145function addNormalizedEntry(
124146normalized: Map<string, SkillIndexEntry[]>,
125147key: string,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。