Skip to main content

mobius_cli/frontend/
mod.rs

1//! möbius terminal frontend.
2
3use mobius::Result;
4use mobius::protocol::FrontendBlock;
5use mobius_gateway::client::{GatewayEvents, GatewaySender};
6use mobius_gateway::wire::{ProviderInstance, ReadyPayload, SessionReadyPayload};
7
8mod bots;
9mod catalog;
10mod cloudflare_setup;
11mod dashboard;
12mod extensions;
13mod gateway;
14mod gateway_actions;
15mod headless;
16mod reinitialize;
17mod setup;
18mod terminal;
19mod theme;
20mod tui;
21
22pub use headless::run as run_headless;
23pub use terminal::terminal_text;
24
25pub use cloudflare_setup::{CloudflareInit, run as run_cloudflare_setup};
26pub use dashboard::{run as run_gateway_dashboard, run_provider as run_gateway_provider};
27pub use reinitialize::confirm as confirm_gateway_reinitialize;
28pub use setup::run_gateway_login;
29
30pub async fn run_extensions(
31    sender: GatewaySender,
32    events: GatewayEvents,
33    gateway: ReadyPayload,
34) -> Result<()> {
35    extensions::standalone(sender, events, gateway).await
36}
37
38fn block_text(block: &FrontendBlock) -> String {
39    let mut text = block.title.clone();
40    if !block.text.is_empty() {
41        if !text.is_empty() {
42            text.push('\n');
43        }
44        text.push_str(&block.text);
45    }
46    for file in &block.files {
47        if !text.is_empty() {
48            text.push('\n');
49        }
50        text.push_str(&format!(
51            "[file] {} · {} · {} bytes",
52            file.name, file.media_type, file.size
53        ));
54    }
55    text
56}
57
58fn provider_instance_label<'a>(
59    instances: &'a [ProviderInstance],
60    instance: &str,
61) -> Option<&'a str> {
62    instances
63        .iter()
64        .find(|entry| entry.selection.instance == instance)
65        .map(|entry| entry.label.as_str())
66}
67
68pub async fn run(
69    sender: GatewaySender,
70    events: GatewayEvents,
71    gateway: &mut ReadyPayload,
72    session: &mut SessionReadyPayload,
73    local_gateway: bool,
74    gateway_endpoint: String,
75) -> Result<(FrontendExit, GatewaySender, GatewayEvents)> {
76    let workspace = session.workspace.path.clone();
77    let catalog = catalog::UiCatalog::build(&session.contributions, &workspace)?;
78    tui::runtime::run(
79        sender,
80        events,
81        gateway,
82        session,
83        catalog,
84        local_gateway,
85        gateway_endpoint,
86    )
87    .await
88}
89
90/// Why a frontend returned control to its launcher.
91pub enum FrontendExit {
92    Exit,
93    Resume(String),
94    Reload,
95    Reconnect,
96}