Skip to main content

horus_cli/frontend/
mod.rs

1//! Horus terminal frontend.
2
3use horus::Result;
4use horus::protocol::FrontendBlock;
5use horus_gateway::client::{GatewayEvents, GatewaySender};
6use horus_gateway::wire::{ReadyPayload, SessionReadyPayload};
7
8mod catalog;
9mod cloudflare_setup;
10mod dashboard;
11mod gateway;
12mod gateway_actions;
13mod headless;
14mod reinitialize;
15mod setup;
16mod terminal;
17mod theme;
18mod tui;
19
20pub use headless::run as run_headless;
21pub use tui::terminal_text;
22
23pub use cloudflare_setup::{CloudflareInit, run as run_cloudflare_setup};
24pub use dashboard::{run as run_gateway_dashboard, run_provider as run_gateway_provider};
25pub use reinitialize::confirm as confirm_gateway_reinitialize;
26
27fn block_text(block: &FrontendBlock) -> String {
28    let mut text = block.title.clone();
29    if !block.text.is_empty() {
30        if !text.is_empty() {
31            text.push('\n');
32        }
33        text.push_str(&block.text);
34    }
35    for file in &block.files {
36        if !text.is_empty() {
37            text.push('\n');
38        }
39        text.push_str(&format!(
40            "[file] {} · {} · {} bytes",
41            file.name, file.media_type, file.size
42        ));
43    }
44    text
45}
46
47pub async fn run(
48    sender: GatewaySender,
49    events: GatewayEvents,
50    gateway: &mut ReadyPayload,
51    session: &mut SessionReadyPayload,
52    local_gateway: bool,
53    gateway_endpoint: String,
54) -> Result<(FrontendExit, GatewaySender, GatewayEvents)> {
55    let workspace = session.workspace.path.clone();
56    let catalog = catalog::UiCatalog::build(&session.contributions, &gateway.models, &workspace)?;
57    tui::runtime::run(
58        sender,
59        events,
60        gateway,
61        session,
62        catalog,
63        local_gateway,
64        gateway_endpoint,
65    )
66    .await
67}
68
69/// Why a frontend returned control to its launcher.
70pub enum FrontendExit {
71    Exit,
72    Discard,
73    New,
74    Resume(String),
75    Reload,
76    Reconnect,
77}