use std::time::Duration;
use mentra::Session;
use super::Workspace;
use crate::{
a2a::{A2aError, A2aReload, A2aWatch, A2aWatchError, remote::Waiting},
event::ContextFile,
tools::SpawnTool,
};
#[cfg(doc)]
use crate::PreparedRun;
impl Workspace {
pub fn a2a_agents(&self) -> Vec<String> {
self.a2a.names()
}
pub(super) fn a2a_files(&self) -> Vec<ContextFile> {
self.a2a.files()
}
pub async fn reload_a2a(&self) -> Result<A2aReload, A2aError> {
self.a2a.reload().await
}
pub fn watch_a2a(&self, interval: Duration) -> Result<A2aWatch, A2aWatchError> {
self.a2a.watch(interval)
}
pub(super) fn teach_remote_agents(&self, session: &mut Session) -> SpawnTool {
let copy = self
.runtime
.spawn_tool()
.for_remote_agents(self.a2a.remote())
.remembering();
session.register_tool(copy.clone());
copy
}
pub fn remote_conversation(&self, key: &str, agent: &str) -> Option<RemoteConversationState> {
let conversation = self.a2a.remote().keyed_conversation(key, agent)?;
Some(match conversation.outstanding {
None => RemoteConversationState::Open,
Some(outstanding) => match outstanding.waiting_for {
Waiting::Agent => RemoteConversationState::Working,
Waiting::Input => RemoteConversationState::InputRequired,
},
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum RemoteConversationState {
Open,
Working,
InputRequired,
}