Agent: one turn path, tools and history in their own modules; SDK: one parser

This commit is contained in:
2026-10-15 14:22:51 +01:00
parent f9260faa5b
commit c636eb0803
4 changed files with 296 additions and 308 deletions
+17 -19
View File
@@ -26,6 +26,14 @@ impl Message {
}
}
fn parse(line: &[u8]) -> Option<Message> {
serde_json::from_slice::<Message>(line).ok()
}
fn is_shutdown(message: &Message) -> bool {
message.from == "broker" && message.kind() == "shutdown"
}
/// Return this actor's ID from `SAUSAGE_ACTOR`, or an empty string if unset.
pub fn me() -> String {
std::env::var("SAUSAGE_ACTOR").unwrap_or_default()
@@ -39,17 +47,13 @@ pub fn messages() -> impl Iterator<Item = Message> {
let mut lines = stdin.lock().lines();
std::iter::from_fn(move || {
loop {
let line = match lines.next()? {
Ok(line) => line,
Err(_) => continue,
};
let Ok(message) = serde_json::from_str::<Message>(&line) else {
let Ok(line) = lines.next()? else {
continue;
};
if message.from == "broker" && message.kind() == "shutdown" {
return None;
}
return Some(message);
let Some(message) = parse(line.as_bytes()) else {
continue;
};
return (!is_shutdown(&message)).then_some(message);
}
})
}
@@ -153,11 +157,12 @@ async fn read_messages(tx: async_channel::Sender<Message>) {
}
buf.extend_from_slice(&chunk[..n]);
while let Some(pos) = buf.iter().position(|b| *b == b'\n') {
let line: Vec<_> = buf.drain(..=pos).collect();
let Ok(message) = serde_json::from_slice::<Message>(&line) else {
let message = parse(&buf[..pos]);
buf.drain(..=pos);
let Some(message) = message else {
continue;
};
if message.from == "broker" && message.kind() == "shutdown" {
if is_shutdown(&message) {
tx.close();
return;
}
@@ -166,13 +171,6 @@ async fn read_messages(tx: async_channel::Sender<Message>) {
}
}
}
if let Ok(message) = serde_json::from_slice::<Message>(&buf) {
if message.from == "broker" && message.kind() == "shutdown" {
tx.close();
return;
}
let _ = tx.send(message).await;
}
tx.close();
}