view-model.ts
1077 bytes
1import { formatSourceKind, sourceBadge } from "../inventory/classifier.ts";
2import type { SkillInvocationMode, SkillRecord } from "../types.ts";
3
4export function modeLabel(mode: SkillInvocationMode): string {
5 return mode === "manual-only" ? "Manual-only" : "Agent-invocable";
6}
7
8export function toggleMode(mode: SkillInvocationMode): SkillInvocationMode {
9 return mode === "manual-only" ? "agent-invocable" : "manual-only";
10}
11
12export function skillSearchText(skill: SkillRecord): string {
13 return [
14 skill.name,
15 skill.description,
16 skill.filePath,
17 skill.source.kind,
18 sourceBadge(skill.source),
19 formatSourceKind(skill.source.kind),
20 modeLabel(skill.mode),
21 ]
22 .join(" ")
23 .toLowerCase();
24}
25
26export function filterSkills(skills: SkillRecord[], query: string): SkillRecord[] {
27 const tokens = query.trim().toLowerCase().split(/\s+/).filter(Boolean);
28 if (tokens.length === 0) return skills;
29 return skills.filter((skill) => {
30 const haystack = skillSearchText(skill);
31 return tokens.every((token) => haystack.includes(token));
32 });
33}