Skip to main content

wisp/session/
mod.rs

1pub(crate) mod platform;
2pub mod session_config_view;
3pub(crate) mod session_loading_buffer;
4pub(crate) mod session_model;
5pub mod terminal;
6pub mod workspace_status;
7
8use crate::error::AppError;
9use crate::session::workspace_status::WorkspaceStatus;
10use acp_utils::client::{AcpClientError, AcpEvent, AcpPromptHandle, TokioAcpAgent, spawn_acp_session};
11use agent_client_protocol::schema::ProtocolVersion;
12use agent_client_protocol::schema::v1::{
13    AuthMethod, Implementation, InitializeRequest, NewSessionRequest, PromptCapabilities, SessionCapabilities,
14    SessionConfigOption, SessionId,
15};
16use std::env::current_dir;
17use std::path::PathBuf;
18use std::str::FromStr;
19use tokio::sync::mpsc;
20
21pub struct Session {
22    pub session_id: SessionId,
23    pub agent_name: String,
24    pub prompt_capabilities: PromptCapabilities,
25    pub session_capabilities: SessionCapabilities,
26    pub config_options: Vec<SessionConfigOption>,
27    pub auth_methods: Vec<AuthMethod>,
28    pub event_rx: mpsc::UnboundedReceiver<AcpEvent>,
29    pub prompt_handle: AcpPromptHandle,
30    pub working_dir: PathBuf,
31    pub workspace_status: WorkspaceStatus,
32}
33
34impl Session {
35    pub async fn connect(agent_command: &str) -> Result<Self, AppError> {
36        let working_dir = current_dir().unwrap_or_else(|_| PathBuf::from("."));
37        let workspace_status = WorkspaceStatus::initial(&working_dir);
38        let agent = TokioAcpAgent::from_str(agent_command).map_err(AcpClientError::InvalidAgentCommand)?;
39        let init_request = InitializeRequest::new(ProtocolVersion::LATEST)
40            .client_info(Implementation::new("wisp", env!("CARGO_PKG_VERSION")));
41        let acp_session = spawn_acp_session(agent, init_request, NewSessionRequest::new(working_dir.clone())).await?;
42
43        Ok(Self {
44            session_id: acp_session.session_id,
45            agent_name: acp_session.agent_name,
46            prompt_capabilities: acp_session.prompt_capabilities,
47            session_capabilities: acp_session.session_capabilities,
48            config_options: acp_session.config_options,
49            auth_methods: acp_session.auth_methods,
50            event_rx: acp_session.event_rx,
51            prompt_handle: acp_session.prompt_handle,
52            working_dir,
53            workspace_status,
54        })
55    }
56}