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}