use crate::prelude::Message;
use crate::prelude::*;
use beet_core::prelude::*;
use std::path::Path;
pub async fn workspace_file(path: impl AsRef<Path>) -> Result<FileContent> {
session_ext::file(AbsPathBuf::new_workspace_rel(path)?.to_string()).await
}
pub async fn file(path: impl AsRef<str>) -> Result<FileContent> {
FileContent::new(path).await
}
pub fn text(text: impl AsRef<str>) -> TextContent { TextContent::new(text) }
pub fn message<M>(content: impl IntoContentVec<M>) -> impl Bundle {
(Message::default(), content.into_content_vec().into_bundle())
}
#[rustfmt::skip]
pub fn user_message_session(agent:impl Bundle, user_message:impl Bundle)->impl Bundle {
(
Session::default(),
children![
(
UserRole,
children![user_message],
),
(
agent,
OnSpawn::trigger(MessageRequest)
)
]
)
}
pub async fn run_and_collect_file(session: impl Bundle) -> Vec<ContentEnum> {
let mut app = App::new();
app.add_plugins((MinimalPlugins, AgentPlugin));
app.world_mut().spawn(session);
todo!("beet_flow");
}
pub fn collect_output(
agents: Query<Entity, With<AgentRole>>,
children: Query<&Children>,
text: Query<&TextContent>,
files: Query<&FileContent>,
) -> Vec<ContentEnum> {
let agent = agents.single().expect("No agent found in world");
children
.iter_descendants_depth_first(agent)
.filter_map(|entity| {
if let Some(text) = text.get(entity).ok() {
Some(ContentEnum::Text(text.clone()))
} else if let Some(file) = files.get(entity).ok() {
Some(ContentEnum::File(file.clone()))
} else {
None
}
})
.collect()
}