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