main
py 72 lines 2.41 KB
Raw
1 from helpers.api import ApiHandler, Input, Output, Request, Response
2 from helpers import runtime, skills, projects, files
3
4
5 class Skills(ApiHandler):
6 async def process(self, input: Input, request: Request) -> Output:
7 action = input.get("action", "")
8
9 try:
10 if action == "list":
11 data = self.list_skills(input)
12 elif action == "delete":
13 data = self.delete_skill(input)
14 else:
15 raise Exception("Invalid action")
16
17 return {
18 "ok": True,
19 "data": data,
20 }
21 except Exception as e:
22 return {
23 "ok": False,
24 "error": str(e),
25 }
26
27 def list_skills(self, input: Input):
28 skill_list = skills.list_skills()
29
30 # filter by project
31 if project_name := (input.get("project_name") or "").strip() or None:
32 project_folder = projects.get_project_folder(project_name)
33 if runtime.is_development():
34 project_folder = files.normalize_a0_path(project_folder)
35 skill_list = [
36 s for s in skill_list if files.is_in_dir(str(s.path), project_folder)
37 ]
38
39 # filter by agent profile
40 if agent_profile := (input.get("agent_profile") or "").strip() or None:
41 roots: list[str] = [
42 files.get_abs_path("agents", agent_profile, "skills"),
43 files.get_abs_path("usr", "agents", agent_profile, "skills"),
44 ]
45 if project_name:
46 roots.append(
47 projects.get_project_meta(project_name, "agents", agent_profile, "skills")
48 )
49
50 skill_list = [
51 s
52 for s in skill_list
53 if any(files.is_in_dir(str(s.path), r) for r in roots)
54 ]
55
56 result = []
57 for skill in skill_list:
58 result.append({
59 "name": skill.name,
60 "description": skill.description,
61 "path": str(skill.path),
62 })
63 result.sort(key=lambda x: (x["name"], x["path"]))
64 return result
65
66 def delete_skill(self, input: Input):
67 skill_path = str(input.get("skill_path") or "").strip()
68 if not skill_path:
69 raise Exception("skill_path is required")
70
71 skills.delete_skill(skill_path)
72 return {"ok": True, "skill_path": skill_path}