llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use crate::conversation::MessageKind;
use crate::runtime::TOOL_COLLAPSE_LINES;

use super::AppController;

impl AppController {
    pub fn toggle_selected_tool_output(&mut self) -> bool {
        let id = match self.state.selected_message {
            Some(id) => id,
            None => return false,
        };
        let should_toggle = {
            let conv = match self.state.active_conversation() {
                Some(conv) => conv,
                None => return false,
            };
            let msg = match conv.messages.iter().find(|m| m.id == id) {
                Some(msg) => msg,
                None => return false,
            };
            match &msg.kind {
                MessageKind::ToolResult(result) => {
                    result.output.lines().count() > TOOL_COLLAPSE_LINES
                }
                _ => false,
            }
        };
        if !should_toggle {
            return false;
        }
        self.state.collapsible.toggle(id);
        true
    }

    pub fn toggle_all_tool_outputs(&mut self) -> bool {
        let conv = match self.state.active_conversation() {
            Some(conv) => conv,
            None => return false,
        };
        let ids: Vec<_> = conv
            .messages
            .iter()
            .filter_map(|msg| {
                let MessageKind::ToolResult(result) = &msg.kind else {
                    return None;
                };
                if result.output.lines().count() <= TOOL_COLLAPSE_LINES {
                    return None;
                }
                Some(msg.id)
            })
            .collect();
        if ids.is_empty() {
            return false;
        }
        let all_expanded = ids.iter().all(|id| self.state.collapsible.is_expanded(*id));
        self.state
            .collapsible
            .set_all(!all_expanded, ids.into_iter());
        true
    }
}