diff --git a/crates/tui/src/main.rs b/crates/tui/src/main.rs index b6c859ea..6111fd25 100644 --- a/crates/tui/src/main.rs +++ b/crates/tui/src/main.rs @@ -625,6 +625,21 @@ fn resolve_serve_bind_host(mobile: bool, host: Option) -> ServeBindHost } } +fn validate_serve_mode_selection(mcp: bool, http: bool, mobile: bool, acp: bool) -> Result { + if http && mobile { + bail!("--http and --mobile are mutually exclusive; choose one"); + } + let http_selected = http || mobile; + let selected_modes = [mcp, http_selected, acp] + .into_iter() + .filter(|selected| *selected) + .count(); + if selected_modes != 1 { + bail!("Choose exactly one server mode: --mcp, --http/--mobile, or --acp"); + } + Ok(http_selected) +} + #[derive(Subcommand, Debug, Clone)] enum McpCommand { /// List configured MCP servers @@ -952,14 +967,8 @@ async fn main() -> Result<()> { let workspace = cli.workspace.clone().unwrap_or_else(|| { std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")) }); - let http_selected = args.http || args.mobile; - let selected_modes = [args.mcp, http_selected, args.acp] - .into_iter() - .filter(|selected| *selected) - .count(); - if selected_modes != 1 { - bail!("Choose exactly one server mode: --mcp, --http/--mobile, or --acp"); - } + let http_selected = + validate_serve_mode_selection(args.mcp, args.http, args.mobile, args.acp)?; if args.mcp { mcp_server::run_mcp_server(workspace) } else if http_selected { @@ -5641,6 +5650,15 @@ mod serve_bind_host_tests { } ); } + + #[test] + fn http_and_mobile_are_mutually_exclusive() { + let err = validate_serve_mode_selection(false, true, true, false).unwrap_err(); + assert!( + err.to_string() + .contains("--http and --mobile are mutually exclusive") + ); + } } #[cfg(test)] diff --git a/crates/tui/src/runtime_mobile.html b/crates/tui/src/runtime_mobile.html index f7ca0af0..cf8d6e44 100644 --- a/crates/tui/src/runtime_mobile.html +++ b/crates/tui/src/runtime_mobile.html @@ -275,7 +275,7 @@ } function token() { - return $("token").value.trim(); + return $("token").value; } function takeTokenFromUrl() { @@ -368,7 +368,8 @@ method: "POST", body: JSON.stringify({ decision, remember }) }); - container.innerHTML = "Decision sent: " + escapeHtml(result.decision) + ""; + const decided = result?.decision ?? decision; + container.innerHTML = "Decision sent: " + escapeHtml(decided) + ""; } function appendEvent(name, data) {