use anyhow::Result; use pi_bridge::{ ClientRequest, FollowUpRequest, PiBridgeClient, RunRequest, RuntimeEvent, RuntimeHandshake, SteerRequest, ToolApprovalDecision, }; use std::path::PathBuf; #[derive(Clone, Debug, Default)] pub struct RuntimeConfig { pub command: PathBuf, pub args: Vec, pub working_dir: Option, } pub struct RuntimeService { client: PiBridgeClient, } impl RuntimeService { pub fn connect(config: RuntimeConfig) -> Result { Ok(Self { client: PiBridgeClient::spawn(config.command, &config.args, config.working_dir)?, }) } pub fn handshake(&mut self, message: RuntimeHandshake) -> Result { self.client.send(&ClientRequest::Handshake(message))?; self.client.read_event() } pub fn start_run(&mut self, request: RunRequest) -> Result<()> { self.client .send(&ClientRequest::StartRun(Box::new(request))) } pub fn decide_tool_call(&mut self, decision: ToolApprovalDecision) -> Result<()> { self.client.send(&ClientRequest::ToolApproval(decision)) } pub fn steer(&mut self, request: SteerRequest) -> Result<()> { self.client.send(&ClientRequest::Steer(request)) } pub fn follow_up(&mut self, request: FollowUpRequest) -> Result<()> { self.client.send(&ClientRequest::FollowUp(request)) } pub fn next_event(&mut self) -> Result { self.client.read_event() } }