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