use crate::model::{ActivityEntry, ContentBlock, EntryKind, SystemNotice};
use super::App;
impl App {
pub(super) fn push_system_msg_to_tab(&mut self, tab_idx: usize, text: &str) {
if let Some(tab) = self.state.tabs.get_mut(tab_idx) {
let id = tab.scrollback.next_id();
tab.scrollback.push_entry(ActivityEntry {
id,
kind: EntryKind::System(SystemNotice {
text: text.to_string(),
}),
collapsed: false,
});
}
}
pub(super) fn push_system_msg(&mut self, text: &str) {
let idx = self.state.active_tab;
self.push_system_msg_to_tab(idx, text);
}
}
pub(super) enum PermissionChoice {
Yes,
No,
Always,
}
pub(super) fn entry_contains_text(kind: &EntryKind, query: &str) -> bool {
match kind {
EntryKind::UserPrompt(p) => p.text.to_lowercase().contains(query),
EntryKind::AgentResponse(r) => r.blocks.iter().any(|b| match b {
ContentBlock::Text(t) => t.to_lowercase().contains(query),
ContentBlock::Other(d) => d.to_lowercase().contains(query),
}),
EntryKind::ToolCall(tc) => tc.title.to_lowercase().contains(query),
EntryKind::Thinking(th) => th.text.to_lowercase().contains(query),
EntryKind::Permission(p) => p.request.title.to_lowercase().contains(query),
EntryKind::System(s) => s.text.to_lowercase().contains(query),
}
}
pub(super) fn needs_binary_install(config: &bitrouter_config::AgentConfig) -> bool {
use bitrouter_config::Distribution;
for dist in &config.distribution {
match dist {
Distribution::Npx { .. } | Distribution::Uvx { .. } => return false,
Distribution::Binary { .. } => {}
}
}
config
.distribution
.iter()
.any(|d| matches!(d, Distribution::Binary { .. }))
}