Skip to main content

agent_tui_adapters/adapters/daemon/
router.rs

1//! RPC router for daemon adapters.
2
3use crate::adapters::rpc::RpcRequest;
4use crate::adapters::rpc::RpcResponse;
5use serde_json::json;
6
7use super::usecase_container::UseCaseContainer;
8use crate::adapters::daemon::handlers;
9use crate::usecases::ports::SessionRepository;
10
11pub struct Router<'a, R: SessionRepository + 'static> {
12    usecases: &'a UseCaseContainer<R>,
13}
14
15impl<'a, R: SessionRepository + 'static> Router<'a, R> {
16    pub fn new(usecases: &'a UseCaseContainer<R>) -> Self {
17        Self { usecases }
18    }
19
20    pub fn route(&self, request: RpcRequest) -> RpcResponse {
21        match request.method.as_str() {
22            "ping" => RpcResponse::success(request.id, json!({ "pong": true })),
23
24            "version" => RpcResponse::success(
25                request.id,
26                json!({
27                    "daemon_version": env!("AGENT_TUI_VERSION"),
28                    "daemon_commit": env!("AGENT_TUI_GIT_SHA")
29                }),
30            ),
31
32            "spawn" => handlers::session::handle_spawn(&self.usecases.session.spawn, request),
33            "kill" => handlers::session::handle_kill(&self.usecases.session.kill, request),
34            "restart" => handlers::session::handle_restart(&self.usecases.session.restart, request),
35            "sessions" => {
36                handlers::session::handle_sessions(&self.usecases.session.sessions, request)
37            }
38            "resize" => handlers::session::handle_resize(&self.usecases.session.resize, request),
39            "attach" => handlers::session::handle_attach(&self.usecases.session.attach, request),
40            "cleanup" => handlers::session::handle_cleanup(&self.usecases.session.cleanup, request),
41            "assert" => handlers::session::handle_assert(&self.usecases.session.assert, request),
42            "snapshot" => {
43                handlers::snapshot::handle_snapshot_uc(&self.usecases.snapshot.snapshot, request)
44            }
45            "keystroke" => {
46                handlers::input::handle_keystroke_uc(&self.usecases.input.keystroke, request)
47            }
48            "keydown" => handlers::input::handle_keydown_uc(&self.usecases.input.keydown, request),
49            "keyup" => handlers::input::handle_keyup_uc(&self.usecases.input.keyup, request),
50            "type" => handlers::input::handle_type_uc(&self.usecases.input.type_text, request),
51            "wait" => handlers::wait::handle_wait_uc(&self.usecases.wait, request),
52
53            "pty_write" => handlers::diagnostics::handle_terminal_write_uc(
54                &self.usecases.diagnostics.terminal_write,
55                request,
56            ),
57            "shutdown" => handlers::diagnostics::handle_shutdown_uc(
58                &self.usecases.diagnostics.shutdown,
59                request,
60            ),
61
62            _ => RpcResponse::error(
63                request.id,
64                -32601,
65                &format!("Method not found: {}", request.method),
66            ),
67        }
68    }
69}
70
71#[cfg(test)]
72#[path = "router_tests.rs"]
73mod tests;