use super::*;
#[derive(Resource)]
pub struct MessageIntake(pub UnboundedReceiver<AgentMessage>);
pub fn deliver_messages(
mut intake: ResMut<MessageIntake>,
mut agents: Query<(Entity, &AgentState, &mut MessageInbox, &mut ContextWindow)>,
) {
crate::tick_scope::clear();
let mut incoming = Vec::new();
while let Ok(msg) = intake.0.try_recv() {
incoming.push(msg);
}
for msg in incoming {
for (entity, state, mut inbox, _) in agents.iter_mut() {
crate::tick_scope::enter(entity);
if state.agent_id == msg.agent_id {
inbox.push(msg.clone());
break;
}
}
}
for (entity, state, mut inbox, mut window) in agents.iter_mut() {
crate::tick_scope::enter(entity);
if !state.accepts_messages {
continue; }
for msg in inbox.drain_all() {
let region = msg.target_region.as_deref().unwrap_or("conversation");
let tokens = leviath_core::estimate_tokens(&msg.content);
let _ = window.add_typed_entry(
region,
leviath_core::EntryKind::UserMessage,
msg.content.clone(),
tokens,
);
}
}
}