Skip to main content

wisp/
runtime_state.rs

1use crate::cli::Cli;
2use crate::error::AppError;
3use crate::settings::load_or_create_settings;
4use acp_utils::client::{AcpEvent, AcpPromptHandle, AutoApproveClient, spawn_acp_session};
5use agent_client_protocol::{
6    self as acp, Implementation, InitializeRequest, NewSessionRequest, ProtocolVersion,
7};
8use std::env::current_dir;
9use tokio::sync::mpsc;
10use tui::Theme;
11
12pub struct RuntimeState {
13    pub session_id: acp::SessionId,
14    pub agent_name: String,
15    pub prompt_capabilities: acp::PromptCapabilities,
16    pub config_options: Vec<acp::SessionConfigOption>,
17    pub auth_methods: Vec<acp::AuthMethod>,
18    pub theme: Theme,
19    pub event_rx: mpsc::UnboundedReceiver<AcpEvent>,
20    pub prompt_handle: AcpPromptHandle,
21    pub working_dir: std::path::PathBuf,
22}
23
24impl RuntimeState {
25    pub async fn new(agent_command: &str) -> Result<Self, AppError> {
26        let cwd = current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."));
27        let new_session_request = NewSessionRequest::new(cwd.clone());
28        let init_request = InitializeRequest::new(ProtocolVersion::LATEST)
29            .client_info(Implementation::new("wisp", env!("CARGO_PKG_VERSION")));
30
31        let session = spawn_acp_session(
32            agent_command,
33            init_request,
34            new_session_request,
35            AutoApproveClient::new,
36        )
37        .await
38        .map_err(AppError::Acp)?;
39
40        let settings = load_or_create_settings();
41
42        Ok(Self {
43            session_id: session.session_id,
44            agent_name: session.agent_name,
45            prompt_capabilities: session.prompt_capabilities,
46            config_options: session.config_options,
47            auth_methods: session.auth_methods,
48            theme: crate::settings::load_theme(&settings),
49            event_rx: session.event_rx,
50            prompt_handle: session.prompt_handle,
51            working_dir: cwd,
52        })
53    }
54
55    pub async fn from_cli(cli: &Cli) -> Result<Self, AppError> {
56        Self::new(&cli.agent).await
57    }
58}