diff --git a/desktop/src-tauri/src/commands/agents.rs b/desktop/src-tauri/src/commands/agents.rs index dc64dc826..866cfca72 100644 --- a/desktop/src-tauri/src/commands/agents.rs +++ b/desktop/src-tauri/src/commands/agents.rs @@ -867,9 +867,13 @@ pub async fn start_managed_agent( reconcile_agent_profile(&state, &reconcile_app, &reconcile_pubkey, &reconcile_data) .await { - eprintln!( - "buzz-desktop: profile reconciliation failed for agent {reconcile_pubkey}: {e}" - ); + // Suppress the expected relay-unreachable case; see the same + // guard in restore.rs's boot reconcile path for the rationale. + if !e.starts_with("relay unreachable:") { + eprintln!( + "buzz-desktop: profile reconciliation failed for agent {reconcile_pubkey}: {e}" + ); + } } }); } diff --git a/desktop/src-tauri/src/managed_agents/restore.rs b/desktop/src-tauri/src/managed_agents/restore.rs index 3469dc80d..f4c751ccc 100644 --- a/desktop/src-tauri/src/managed_agents/restore.rs +++ b/desktop/src-tauri/src/managed_agents/restore.rs @@ -232,7 +232,17 @@ pub async fn restore_managed_agents_on_launch( crate::commands::reconcile_agent_profile(&state, &reconcile_app, &pubkey, &data) .await { - eprintln!("buzz-desktop: profile reconciliation failed for agent {pubkey}: {e}"); + // A local agent may deliberately target a relay that isn't + // running (e.g. ws://localhost:3000 between boots); the relay + // helper marks every such case with the "relay unreachable:" + // prefix (see relay.rs). That's expected, not a failure worth + // a per-agent line every boot — only genuine reconcile errors + // surface loudly. + if !e.starts_with("relay unreachable:") { + eprintln!( + "buzz-desktop: profile reconciliation failed for agent {pubkey}: {e}" + ); + } } }); } diff --git a/desktop/src-tauri/src/relay.rs b/desktop/src-tauri/src/relay.rs index 1ee3e8505..8d5f8f74e 100644 --- a/desktop/src-tauri/src/relay.rs +++ b/desktop/src-tauri/src/relay.rs @@ -211,11 +211,16 @@ pub(crate) async fn parse_json_response( return Err(msg); } - // Drop the reqwest error detail — it contains the raw URL. + // A successful HTTP response whose body fails to deserialize means the relay + // was reached but returned something unexpected (protocol mismatch, relay bug, + // corrupted body) — NOT a connectivity failure. Keep it off the + // "relay unreachable:" bucket so it surfaces loudly instead of being treated + // as a transient unreachable-relay condition. The reqwest error detail is + // dropped because it contains the raw URL. response .json::() .await - .map_err(|_| "relay unreachable: response was not valid JSON".to_string()) + .map_err(|_| "relay returned malformed response: not valid JSON".to_string()) } pub async fn relay_error_message(response: reqwest::Response) -> String { diff --git a/desktop/src/features/agents/ui/CreateAgentDialog.tsx b/desktop/src/features/agents/ui/CreateAgentDialog.tsx index 37f135031..52e74ad1a 100644 --- a/desktop/src/features/agents/ui/CreateAgentDialog.tsx +++ b/desktop/src/features/agents/ui/CreateAgentDialog.tsx @@ -57,7 +57,7 @@ export function CreateAgentDialog({ const backendProvidersQuery = useBackendProvidersQuery(); const { lastRuntimeId, setLastRuntime } = useLastRuntime(); const [acpCommand, setAcpCommand] = React.useState("buzz-acp"); - const [agentCommand, setAgentCommand] = React.useState("goose"); + const [agentCommand, setAgentCommand] = React.useState("buzz-agent"); const [agentArgs, setAgentArgs] = React.useState("acp"); const [mcpCommand, setMcpCommand] = React.useState(""); const [mcpToolsets, setMcpToolsets] = React.useState(""); @@ -236,7 +236,7 @@ export function CreateAgentDialog({ setSpawnAfterCreate(true); setStartOnAppLaunch(true); setAcpCommand("buzz-acp"); - setAgentCommand("goose"); + setAgentCommand("buzz-agent"); setAgentArgs("acp"); setMcpCommand(""); setMcpToolsets("");