Skip to main content

codetether_agent/tui/app/
worker_bridge.rs

1use 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(&current) {
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}