liminal-cli 0.3.0

The liminal command: serve the network, maintain its stores, or serve its discovery MCP over stdio
Documentation
//! The answer to the open turn's `session/prompt`: ended, accepted, or failed.

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(())
    }
}