llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use crate::skills::Skill;

use super::AppController;

impl AppController {
    pub fn activate_skill(&mut self, skill: &Skill) -> bool {
        let conv_id = match self.state.active_conversation_mut() {
            Some(conv) => {
                let prompt = compose_prompt(conv.system_prompt.as_deref(), &skill.prompt);
                conv.system_prompt = Some(prompt);
                conv.id
            }
            None => return false,
        };
        self.state.provider_cache.remove(&conv_id);
        true
    }

    pub fn find_skill(&self, name: &str) -> Option<&Skill> {
        self.state.skills.find(name)
    }

    pub fn extract_skill_mention(&self, text: &str) -> Option<(&Skill, String)> {
        let mut cleaned = Vec::new();
        let mut matched = None;
        for token in text.split_whitespace() {
            if let Some(skill_name) = token.strip_prefix('@') {
                if let Some(skill) = self.find_skill(skill_name) {
                    matched = Some(skill);
                    continue;
                }
            }
            cleaned.push(token);
        }
        matched.map(|skill| (skill, cleaned.join(" ")))
    }
}

fn compose_prompt(base: Option<&str>, skill_prompt: &str) -> String {
    match base {
        Some(base) if !base.trim().is_empty() => format!("{base}\n\n{skill_prompt}"),
        _ => skill_prompt.to_string(),
    }
}