mobius_cli/frontend/
mod.rs1use mobius::Result;
4use mobius::protocol::FrontendBlock;
5use mobius_gateway::client::{GatewayEvents, GatewaySender};
6use mobius_gateway::wire::{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
56pub async fn run(
57 sender: GatewaySender,
58 events: GatewayEvents,
59 gateway: &mut ReadyPayload,
60 session: &mut SessionReadyPayload,
61 local_gateway: bool,
62 gateway_endpoint: String,
63) -> Result<(FrontendExit, GatewaySender, GatewayEvents)> {
64 let workspace = session.workspace.path.clone();
65 let catalog = catalog::UiCatalog::build(&session.contributions, &gateway.models, &workspace)?;
66 tui::runtime::run(
67 sender,
68 events,
69 gateway,
70 session,
71 catalog,
72 local_gateway,
73 gateway_endpoint,
74 )
75 .await
76}
77
78pub enum FrontendExit {
80 Exit,
81 Discard,
82 New,
83 Resume(String),
84 Reload,
85 Reconnect,
86}