agent_tui_adapters/adapters/daemon/
router.rs1use 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;