walrus_daemon/hook/skill/
handler.rs1use crate::hook::skill::{SkillRegistry, loader};
4use anyhow::Result;
5use schemars::JsonSchema;
6use serde::Deserialize;
7use std::path::PathBuf;
8use tokio::sync::Mutex;
9
10#[derive(Deserialize, JsonSchema)]
11pub(crate) struct SearchSkillInput {
12 pub query: String,
14}
15
16#[derive(Deserialize, JsonSchema)]
17pub(crate) struct LoadSkillInput {
18 pub name: String,
20}
21
22pub struct SkillHandler {
28 pub registry: Mutex<SkillRegistry>,
30 pub skills_dir: PathBuf,
32}
33
34impl SkillHandler {
35 pub fn load(skills_dir: PathBuf) -> Result<Self> {
38 let registry = if skills_dir.exists() {
39 match loader::load_skills_dir(&skills_dir) {
40 Ok(r) => {
41 tracing::info!("loaded {} skill(s)", r.len());
42 r
43 }
44 Err(e) => {
45 tracing::warn!("could not load skills from {}: {e}", skills_dir.display());
46 SkillRegistry::new()
47 }
48 }
49 } else {
50 SkillRegistry::new()
51 };
52 Ok(Self {
53 registry: Mutex::new(registry),
54 skills_dir,
55 })
56 }
57}