feat(tui): add usage overlay and sidebar for displaying usage statistics and tasks

feat(tui): implement status bar with connection and turn state indicators
feat(tui): create workflow panel for agent status and progress visualization
feat(web): introduce web frontend interface with static file serving
feat(ws): add WebSocket interface for real-time communication and session management
This commit is contained in:
asepharyana
2026-07-20 09:04:57 +07:00
parent bceba665c0
commit da2ed6da25
454 changed files with 13979 additions and 29539 deletions
+65
View File
@@ -0,0 +1,65 @@
//! Key code <-> wire-serializable `KeyAction` conversion functions.
//!
//! Map `crossterm::event::KeyCode` to and from the IPC protocol's `KeyAction`
//! enum. Both directions are total (every `KeyAction` has a `KeyCode`), but
//! `key_code_to_action` returns `None` for key codes with no IPC equivalent
//! (e.g. media keys), which are silently dropped by the caller.
//!
//! Flow: daemon receives `KeyAction` over IPC → `key_action_to_code` →
//! reconstructs `crossterm::KeyEvent` → feeds into `controller::input::handle_key`.
//! The inverse (`key_code_to_action`) is used by the attach-mode client to
//! serialise a local terminal key press before sending it over the socket.
use crossterm::event::KeyCode;
use zesdex_infrastructure::ipc::protocol::KeyAction;
/// Map a `crossterm` key code to the wire-serializable `KeyAction`, for
/// sending key input from an attached client to the daemon.
///
/// Return: `None` for key codes with no `KeyAction` equivalent (e.g.
/// media keys), which are silently dropped.
pub fn key_code_to_action(code: KeyCode) -> Option<KeyAction> {
tracing::debug!("converting key code to action: {:?}", code);
match code {
KeyCode::Char(c) => Some(KeyAction::Char(c)),
KeyCode::Enter => Some(KeyAction::Enter),
KeyCode::Esc => Some(KeyAction::Escape),
KeyCode::Backspace => Some(KeyAction::Backspace),
KeyCode::Delete => Some(KeyAction::Delete),
KeyCode::Tab => Some(KeyAction::Tab),
KeyCode::Up => Some(KeyAction::Up),
KeyCode::Down => Some(KeyAction::Down),
KeyCode::Left => Some(KeyAction::Left),
KeyCode::Right => Some(KeyAction::Right),
KeyCode::Home => Some(KeyAction::Home),
KeyCode::End => Some(KeyAction::End),
KeyCode::PageUp => Some(KeyAction::PageUp),
KeyCode::PageDown => Some(KeyAction::PageDown),
KeyCode::F(n) => Some(KeyAction::Function(n)),
_ => None,
}
}
/// Inverse of `key_code_to_action`: reconstruct a `crossterm::KeyCode`
/// from a `KeyAction` received over IPC, for replaying it into the
/// daemon's normal key-handling path.
pub fn key_action_to_code(action: &KeyAction) -> KeyCode {
tracing::debug!("converting key action to code: {:?}", action);
match action {
KeyAction::Char(c) => KeyCode::Char(*c),
KeyAction::Enter => KeyCode::Enter,
KeyAction::Escape => KeyCode::Esc,
KeyAction::Backspace => KeyCode::Backspace,
KeyAction::Delete => KeyCode::Delete,
KeyAction::Tab => KeyCode::Tab,
KeyAction::Up => KeyCode::Up,
KeyAction::Down => KeyCode::Down,
KeyAction::Left => KeyCode::Left,
KeyAction::Right => KeyCode::Right,
KeyAction::Home => KeyCode::Home,
KeyAction::End => KeyCode::End,
KeyAction::PageUp => KeyCode::PageUp,
KeyAction::PageDown => KeyCode::PageDown,
KeyAction::Function(n) => KeyCode::F(*n),
}
}