M2: TUI — EngineHandle, ratatui app, markdown renderer, permission modal, session picker, snapshot tests
Builds the ratatui TUI: EngineHandle bridging the async engine to the render loop, chat viewport rendering with a markdown renderer, input handling, a permission modal wired to the real oneshot ask path, and a session picker. Adds TestBackend snapshot tests covering empty session, tool cards (running/completed/error), permission modal, session picker, and message rendering.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
//! Modal helpers for permission dialogs and the session picker.
|
||||
//!
|
||||
//! Rendering lives in `render.rs`; key handling lives in `input.rs`. This module
|
||||
//! provides shared utilities for modal state transitions.
|
||||
|
||||
use harness_app::EngineHandle;
|
||||
use harness_core::permission::PermissionReply;
|
||||
use harness_core::types::Session;
|
||||
|
||||
use crate::state::{AppState, ModalState};
|
||||
|
||||
/// Resolve the current permission request with `reply`.
|
||||
pub fn resolve_permission(state: &mut AppState, engine: &EngineHandle, reply: PermissionReply) {
|
||||
state.handle_permission_reply(reply, engine);
|
||||
}
|
||||
|
||||
/// Open the session picker with the supplied sessions.
|
||||
pub fn open_session_picker(state: &mut AppState, sessions: Vec<Session>) {
|
||||
state.open_session_picker(sessions);
|
||||
}
|
||||
|
||||
/// Load a session's messages and parts into state.
|
||||
pub async fn select_session(
|
||||
state: &mut AppState,
|
||||
engine: &EngineHandle,
|
||||
session: Session,
|
||||
) -> Result<(), harness_app::AppError> {
|
||||
let session_id = session.id.clone();
|
||||
let messages = engine.session_messages(session_id).await?;
|
||||
let mut all_parts = Vec::new();
|
||||
for message in &messages {
|
||||
let parts = engine.message_parts(message.id.clone()).await?;
|
||||
all_parts.extend(parts);
|
||||
}
|
||||
state.set_session(session, messages, all_parts);
|
||||
state.modal = ModalState::None;
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user