mod chat;
mod records;
use std::path::PathBuf;
use std::sync::Arc;
use super::super::encode;
use crate::boundary::answer::answer;
use crate::boundary::dispatch::Deps;
use crate::boundary::reply::Reply;
use crate::boundary::{Query, tests::snapshot};
use crate::cli_outbound::Cli;
use crate::ui_state::UiState;
const AGENT: &str = "20260101T000000Z-c1";
fn deps(snap: crate::app::Snapshot) -> Deps {
Deps {
litany: Cli::new("/no/such/litany"),
bl: Cli::new("/no/such/bl"),
state_root: PathBuf::from("/nonexistent/state"),
yog_binary: PathBuf::from("/no/such/yog"),
world: crate::test_support::no_world(),
home: PathBuf::from("/home/x"),
yog_data_root: PathBuf::from("/data"),
snapshot: Arc::new(snap),
caller: crate::boundary::dispatch::Caller::default(),
}
}
fn ui() -> UiState {
UiState::open(PathBuf::from("/nonexistent/ui.json"))
}
#[test]
fn every_conversation_read_answers_from_the_chokepoint() {
let dir = tempfile::tempdir().unwrap();
let ws = dir.path();
let work = ws.join("agents").join(AGENT);
std::fs::create_dir_all(work.join("messages")).unwrap();
std::fs::write(work.join("messages").join("001-user.md"), b"go").unwrap();
std::fs::write(work.join("goal.md"), b"ship it").unwrap();
std::fs::create_dir_all(ws.join("steps").join(AGENT).join("001")).unwrap();
let inbox = ws.join("inbox").join(AGENT);
std::fs::create_dir_all(&inbox).unwrap();
std::fs::write(inbox.join("user-001.md"), b"---\nfrom: user\n---\nhi\n").unwrap();
let deps = deps(snapshot(ws, "alba", vec![], vec![]));
let at = |query| encode(&answer(&query, &deps, &ui(), 0).expect("a read never refuses"));
let address = (ws.to_path_buf(), AGENT.to_owned());
for (query, kind) in [
(
Query::Transcript {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
},
"transcript",
),
(
Query::Steps {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
},
"steps",
),
(
Query::Rail {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
},
"rail",
),
(
Query::Inbox {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
},
"inbox",
),
(
Query::Step {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
seq: "001".to_owned(),
},
"step",
),
(
Query::Files {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
path: Some("goal.md".to_owned()),
at: None,
},
"files",
),
(
Query::Agent {
workspace: crate::naming::leaf(&(address.0.clone())),
agent: address.1.clone(),
},
"agent",
),
] {
let body = at(query);
assert_eq!(body["ok"], true);
assert_eq!(body["kind"], kind);
}
}
#[test]
fn the_chokepoint_answers_the_bytes_and_not_just_a_kind() {
let dir = tempfile::tempdir().unwrap();
let ws = dir.path();
let work = ws.join("agents").join(AGENT);
std::fs::create_dir_all(work.join("messages")).unwrap();
std::fs::write(work.join("messages").join("001-user.md"), b"go").unwrap();
std::fs::write(work.join("goal.md"), b"ship it").unwrap();
let deps = deps(snapshot(ws, "alba", vec![], vec![]));
let ask = |query| answer(&query, &deps, &ui(), 0).expect("a read never refuses");
let chat = encode(&ask(Query::Transcript {
workspace: crate::naming::leaf(ws),
agent: AGENT.to_owned(),
}));
assert_eq!(chat["rows"][0]["body"], "go");
let files = encode(&ask(Query::Files {
workspace: crate::naming::leaf(ws),
agent: AGENT.to_owned(),
path: Some("goal.md".to_owned()),
at: None,
}));
assert_eq!(files["preview"]["text"], "ship it");
assert!(matches!(
ask(Query::Files {
workspace: crate::naming::leaf(ws),
agent: AGENT.to_owned(),
path: None,
at: None,
}),
Reply::Files { preview: None, .. }
));
}