use super::super::handshake::Version;
use super::{Publish, Pump};
use agent_client_protocol_schema::{v1, v2};
use serde_json::{Value, json};
impl Pump {
pub(super) fn turn_response(
&mut self,
id: &Value,
result: Result<Value, i64>,
) -> anyhow::Result<()> {
anyhow::ensure!(
self.turn.is_some_and(|turn| *id == json!(turn)),
"ACP response id was never requested"
);
let mut completed = self.session.version == Version::One;
match result {
Ok(value) => match self.session.version {
Version::One => {
let result: v1::PromptResponse = serde_json::from_value(value)
.map_err(|_| anyhow::anyhow!("ACP 1 prompt response refused"))?;
self.publications
.try_send(Publish::Stream(
json!({"type":"turn_ended","stop_reason":result.stop_reason}),
))
.map_err(|_| anyhow::anyhow!("stream_queue reached or publisher closed"))?;
}
Version::Two => {
serde_json::from_value::<v2::PromptResponse>(value)
.map_err(|_| anyhow::anyhow!("ACP 2 prompt response refused"))?;
self.acknowledged = true;
completed = self.idle;
self.publications
.try_send(Publish::Stream(json!({"type":"prompt_accepted"})))
.map_err(|_| anyhow::anyhow!("stream_queue reached or publisher closed"))?;
}
},
Err(code) => {
completed = true;
self.publications
.try_send(Publish::Stream(json!({"type":"turn_failed","code":code})))
.map_err(|_| anyhow::anyhow!("stream_queue reached or publisher closed"))?;
}
}
if completed {
self.finish_turn()?;
}
Ok(())
}
}