Files
prowler/ui/lib/lighthouse/tools/load-skill.ts
2026-03-18 10:28:46 +01:00

83 lines
1.9 KiB
TypeScript

import "server-only";
import { tool } from "@langchain/core/tools";
import { addBreadcrumb } from "@sentry/nextjs";
import { z } from "zod";
import {
getRegisteredSkillIds,
getSkillById,
} from "@/lib/lighthouse/skills/index";
interface SkillLoadedResult {
found: true;
skillId: string;
name: string;
instructions: string;
}
interface SkillNotFoundResult {
found: false;
skillId: string;
message: string;
availableSkills: string[];
}
type LoadSkillResult = SkillLoadedResult | SkillNotFoundResult;
export const loadSkill = tool(
async ({ skillId }: { skillId: string }): Promise<LoadSkillResult> => {
addBreadcrumb({
category: "skill",
message: `load_skill called for: ${skillId}`,
level: "info",
data: { skillId },
});
const skill = getSkillById(skillId);
if (!skill) {
const availableSkills = getRegisteredSkillIds();
addBreadcrumb({
category: "skill",
message: `Skill not found: ${skillId}`,
level: "warning",
data: { skillId, availableSkills },
});
return {
found: false,
skillId,
message: `Skill '${skillId}' not found.`,
availableSkills,
};
}
return {
found: true,
skillId: skill.metadata.id,
name: skill.metadata.name,
instructions: skill.instructions,
};
},
{
name: "load_skill",
description: `Load detailed instructions for a specialized skill.
Skills provide domain-specific guidance, workflows, and schema knowledge for complex tasks.
Use this when you identify a relevant skill from the skill catalog in your system prompt.
Returns:
- Skill metadata (id, name)
- Full skill instructions with workflows and examples`,
schema: z.object({
skillId: z
.string()
.describe(
"The ID of the skill to load (from the skill catalog in your system prompt)",
),
}),
},
);