codetether_agent/tui/app/
worker_bridge.rs1use crate::tui::app::state::App;
2use crate::tui::worker_bridge::{TuiWorkerBridge, WorkerBridgeCmd};
3
4pub async fn send_worker_bridge_cmd(
5 worker_bridge: &Option<TuiWorkerBridge>,
6 cmd: WorkerBridgeCmd,
7) -> bool {
8 match worker_bridge {
9 Some(bridge) => bridge.cmd_tx.send(cmd).await.is_ok(),
10 None => false,
11 }
12}
13
14pub fn sync_worker_bridge_agents(app: &mut App, worker_bridge: &Option<TuiWorkerBridge>) {
15 let Some(bridge) = worker_bridge.as_ref() else {
16 return;
17 };
18
19 let mut desired = std::collections::HashSet::new();
20 desired.insert("tui".to_string());
21
22 for message in &app.state.bus_log.entries {
23 if message.kind == "READY"
24 && let Some(agent) = message.summary.split_whitespace().next()
25 {
26 desired.insert(agent.to_string());
27 }
28 }
29
30 let current = app.state.worker_bridge_registered_agents.clone();
31 for name in desired.difference(¤t) {
32 let _ = bridge.cmd_tx.try_send(WorkerBridgeCmd::RegisterAgent {
33 name: name.clone(),
34 instructions: format!("Protocol-observed A2A agent {name}"),
35 });
36 }
37 for name in current.difference(&desired) {
38 let _ = bridge
39 .cmd_tx
40 .try_send(WorkerBridgeCmd::DeregisterAgent { name: name.clone() });
41 }
42 app.state.worker_bridge_registered_agents = desired;
43}
44
45pub async fn handle_processing_started(app: &mut App, worker_bridge: &Option<TuiWorkerBridge>) {
46 app.state.processing = true;
47 app.state.sync_worker_bridge_processing(true);
48 let _ = send_worker_bridge_cmd(worker_bridge, WorkerBridgeCmd::SetProcessing(true)).await;
49}
50
51pub async fn handle_processing_stopped(app: &mut App, worker_bridge: &Option<TuiWorkerBridge>) {
52 app.state.processing = false;
53 app.state.sync_worker_bridge_processing(false);
54 let _ = send_worker_bridge_cmd(worker_bridge, WorkerBridgeCmd::SetProcessing(false)).await;
55}