rho-coding-agent 1.24.0

A lightweight agent harness inspired by Pi
Documentation
use super::{PickerAction, PickerItem, UiPicker};
use crate::session::SessionSummary;

pub(super) fn session_picker(
    sessions: Vec<SessionSummary>,
    current_session_id: Option<&str>,
) -> UiPicker {
    UiPicker::new(
        "resume session",
        "type regex filter, tab complete, up/down select, enter resume, d delete, esc cancel",
        sessions
            .into_iter()
            .filter(|session| current_session_id != Some(session.id.as_str()))
            .map(session_item)
            .collect(),
        PickerAction::ResumeSession,
    )
}

fn session_item(session: SessionSummary) -> PickerItem {
    let short_id = short_session_id(&session.id);
    let first_user_preview = session.first_user_message.as_deref().map(preview_text);
    let title = session
        .title
        .as_deref()
        .map(preview_text)
        .or_else(|| first_user_preview.clone())
        .unwrap_or_else(|| format!("session {short_id}"));
    let preview = session
        .title
        .as_ref()
        .and(first_user_preview)
        .filter(|preview| preview != &title);
    let last_user = session.last_user_message.as_deref().map(preview_text);
    let detail = match last_user {
        Some(last_user) if last_user != title => {
            format!(
                "updated {} · last: {last_user} · id {short_id}",
                session.updated_at
            )
        }
        Some(_) | None => format!("updated {} · id {short_id}", session.updated_at),
    };
    PickerItem {
        section: None,
        label: title,
        detail: Some(detail),
        preview,
        badge: None,
        value: session.id,
        selection_verb: None,
    }
}

pub(super) fn short_session_id(id: &str) -> String {
    id.chars().take(8).collect()
}

fn preview_text(text: &str) -> String {
    let text = text.replace('\n', " ");
    if text.chars().count() <= 80 {
        return text;
    }
    let mut preview = text.chars().take(79).collect::<String>();
    preview.push('');
    preview
}