diff --git a/crates/buzz-acp/src/setup_mode.rs b/crates/buzz-acp/src/setup_mode.rs
index 16b89fce7e..dda7857260 100644
--- a/crates/buzz-acp/src/setup_mode.rs
+++ b/crates/buzz-acp/src/setup_mode.rs
@@ -113,7 +113,7 @@ pub(crate) enum RequirementPayload {
/// One-line stderr excerpt identifying the parse error.
diagnostic: String,
},
- /// Git for Windows is missing; open Doctor for the installation guide.
+ /// Git for Windows is missing; open Agent runtimes for the installation guide.
GitBash,
}
@@ -139,7 +139,7 @@ impl RequirementPayload {
.map(String::as_str)
.unwrap_or("the agent");
format!(
- "install the {} ACP adapter (open Doctor in Settings to diagnose)",
+ "install the {} ACP adapter (open Agent runtimes in Settings to diagnose)",
harness
)
}
@@ -149,7 +149,7 @@ impl RequirementPayload {
.map(String::as_str)
.unwrap_or("the agent");
format!(
- "reinstall the {} ACP adapter — the installed version is outdated (open Doctor in Settings to diagnose)",
+ "reinstall the {} ACP adapter — the installed version is outdated (open Agent runtimes in Settings to diagnose)",
harness
)
}
@@ -159,7 +159,7 @@ impl RequirementPayload {
.map(String::as_str)
.unwrap_or("the agent");
format!(
- "install {} CLI (open Doctor in Settings to diagnose)",
+ "install {} CLI (open Agent runtimes in Settings to diagnose)",
harness
)
}
@@ -168,7 +168,10 @@ impl RequirementPayload {
.first()
.map(String::as_str)
.unwrap_or("the agent");
- format!("install {} (open Doctor in Settings to diagnose)", harness)
+ format!(
+ "install {} (open Agent runtimes in Settings to diagnose)",
+ harness
+ )
}
},
RequirementPayload::CliConfigInvalid {
@@ -184,7 +187,7 @@ impl RequirementPayload {
)
}
RequirementPayload::GitBash => {
- "install Git for Windows (open Doctor in Settings to diagnose)".to_string()
+ "install Git for Windows (open Agent runtimes in Settings to diagnose)".to_string()
}
}
}
@@ -264,7 +267,7 @@ impl SetupPayload {
.any(|r| matches!(r, RequirementPayload::CliConfigInvalid { .. }));
let footer = if has_doctor_requirement {
- "Open Doctor in the Buzz app, install Git for Windows, then re-check and restart the agent.".to_string()
+ "Open Agent runtimes in Settings, install Git for Windows, then re-check and restart the agent.".to_string()
} else if all_external {
// All requirements are external config files — Edit Agent cannot
// help. Don't send the user there.
@@ -743,6 +746,53 @@ mod tests {
);
}
+ #[test]
+ fn nudge_body_runtime_install_copy_points_to_agent_runtimes() {
+ for availability in [
+ AcpAvailabilityStatus::AdapterMissing,
+ AcpAvailabilityStatus::AdapterOutdated,
+ AcpAvailabilityStatus::CliMissing,
+ AcpAvailabilityStatus::NotInstalled,
+ ] {
+ let payload = SetupPayload {
+ agent_name: "Codex".to_string(),
+ agent_pubkey: "test".to_string(),
+ requirements: vec![RequirementPayload::CliLogin {
+ probe_args: vec!["codex".to_string()],
+ setup_copy: "run `codex login`".to_string(),
+ availability,
+ }],
+ };
+ let body = payload.nudge_body();
+ assert!(
+ body.contains("Agent runtimes in Settings"),
+ "runtime install nudge must point to Agent runtimes; got: {body:?}"
+ );
+ assert!(
+ !body.contains("Doctor"),
+ "runtime install nudge must not point to the removed Doctor section; got: {body:?}"
+ );
+ }
+ }
+
+ #[test]
+ fn nudge_body_git_bash_copy_points_to_agent_runtimes() {
+ let payload = SetupPayload {
+ agent_name: "Buzz Agent".to_string(),
+ agent_pubkey: "test".to_string(),
+ requirements: vec![RequirementPayload::GitBash],
+ };
+ let body = payload.nudge_body();
+ assert!(
+ body.contains("Open Agent runtimes in Settings"),
+ "Git Bash nudge must point to Agent runtimes; got: {body:?}"
+ );
+ assert!(
+ !body.contains("Doctor"),
+ "Git Bash nudge must not point to the removed Doctor section; got: {body:?}"
+ );
+ }
+
#[test]
fn nudge_body_empty_requirements_falls_back_to_generic() {
let payload = SetupPayload {
diff --git a/desktop/public/runtime-icons/claude.png b/desktop/public/runtime-icons/claude.png
new file mode 100644
index 0000000000..26f2160f5d
Binary files /dev/null and b/desktop/public/runtime-icons/claude.png differ
diff --git a/desktop/public/runtime-icons/codex.png b/desktop/public/runtime-icons/codex.png
new file mode 100644
index 0000000000..fbdd19c060
Binary files /dev/null and b/desktop/public/runtime-icons/codex.png differ
diff --git a/desktop/public/runtime-icons/goose.svg b/desktop/public/runtime-icons/goose.svg
new file mode 100644
index 0000000000..c5ed5e00a8
--- /dev/null
+++ b/desktop/public/runtime-icons/goose.svg
@@ -0,0 +1,6 @@
+
diff --git a/desktop/src/app/AppShellContext.tsx b/desktop/src/app/AppShellContext.tsx
index 8da3bfc281..4a64de0cb2 100644
--- a/desktop/src/app/AppShellContext.tsx
+++ b/desktop/src/app/AppShellContext.tsx
@@ -49,7 +49,7 @@ type AppShellContextValue = {
feedItemState: FeedItemState;
// Open the Settings panel at the given section. Available on all surfaces
// that render under AppShell (channel, home, projects, pulse, agents).
- // Used by config-nudge cards to deep-link to Settings → Doctor.
+ // Used by config-nudge cards to deep-link to Settings → Agents.
onOpenSettings: ((section: SettingsSection) => void) | null;
};
diff --git a/desktop/src/app/routes/settings.tsx b/desktop/src/app/routes/settings.tsx
index b3812ba511..0011018830 100644
--- a/desktop/src/app/routes/settings.tsx
+++ b/desktop/src/app/routes/settings.tsx
@@ -12,6 +12,10 @@ type SettingsRouteSearch = {
function validateSettingsSearch(
search: Record
- Looking for account connection options... -
- ); - } - - if (authMethodsQuery.error instanceof Error) { - return ( -- Couldn't load account connection options:{" "} - {authMethodsQuery.error.message} -
- ); - } - - if (methods.length === 0) { - return ( -- This adapter did not advertise a built-in login flow. Use the manual - instructions above, then click Re-run. -
- ); - } - return ( -- Buzz launches the adapter's own login flow and then re-checks the{" "} - {runtime.label} CLI. Credentials stay with {runtime.label}. -
- {terminalLaunchMethodId ? ( -- Finish signing in from the Terminal window, then click Re-run to - re-check {runtime.label}. -
- ) : null} - {methods.map((method) => - method.description ? ( -- - {method.name || method.id}: - {" "} - {method.description} -
- ) : null, - )} - {connectMutation.error instanceof Error ? ( -- {connectMutation.error.message} -
- ) : null} -- Buzz uses the official installer and adds the ACP adapter. After it - finishes, Buzz will show the vendor's sign-in flow here. -
- ) : null} -- Node.js is required to install this adapter.{" "} - - , then click Re-run. -
- ); - } return ( -{runtime.label}
+{runtime.label}
- {runtime.command ? ( -
- {runtime.command}
-
- ) : null}
- - Available via{" "} - {describeResolvedCommand(runtime.command, runtime.binaryPath)}. -
- {runtime.defaultArgs.length > 0 ? ( -
- Default args:{" "}
-
- {runtime.defaultArgs.join(", ")}
-
-
- CLI:{" "} - {runtime.underlyingCliPath} -
-- ACP adapter:{" "} - {runtime.binaryPath} -
-- {runtime.binaryPath} -
-- ACP support built-in — no separate adapter needed. -
- > - )} - {/* - * Auth badge renders only for `available` runtimes: non-available - * entries always have auth_status: unknown (no probe was run), which - * AuthStatusBadge maps to null. Rendering it here is self-consistent. - */} - {runtime.authStatus.status !== "not_applicable" && - runtime.authStatus.status !== "unknown" ? ( -- {runtime.authStatus.status === "config_invalid" - ? `Config error: ${runtime.authStatus.diagnostic}` - : runtime.loginHint} -
- ) : null} -
- CLI detected at{" "}
-
- {runtime.underlyingCliPath ?? "unknown path"}
- {" "}
- but ACP adapter not found.
-
- {runtime.installHint} -
-
- ACP adapter found at{" "}
-
- {runtime.binaryPath ?? "unknown path"}
- {" "}
- but it is from the deprecated package. Reinstall to enable relay
- connectivity.
-
- This updates the machine-global{" "}
-
- codex-acp
- {" "}
- adapter. Older Buzz releases using the legacy adapter contract may
- lose community access until{" "}
-
- @zed-industries/codex-acp@0.16.0
- {" "}
- is restored.
-
- {runtime.installHint} -
-
- ACP adapter found at{" "}
-
- {runtime.binaryPath ?? "unknown path"}
- {" "}
- but the {runtime.label} CLI is not installed.
-
- {runtime.installHint} -
-- Not installed -
-- {runtime.installHint} -
-+ Config error: {runtime.authStatus.diagnostic} +
+ ) : null} {installSuccess && runtime.availability !== "available" ? (@@ -505,12 +376,53 @@ function RuntimeRow({ {installError}
) : null} + {connectionError ? ( ++ {connectionError} +
+ ) : null} + {canConnectAccount && terminalLaunchMethodId ? ( ++ Finish signing in from the Terminal window, then click Check again + to re-check {runtime.label}. +
+ ) : null}Git Bash
- {prerequisite.available ? ( -- {prerequisite.path} -
- ) : ( - <> -- Required for buzz-agent shell tools on Windows. -
-- {prerequisite.installHint} -
+Git Bash
+ + + {prerequisite.available ? "Available" : "Action needed"} + +Required for buzz-agent shell tools on Windows.
+{prerequisite.installHint}
+- Windows tools required by supported agents. -
-- Installation status of supported agent CLIs and their ACP - runtimes. -
-+ Windows tools required by supported agents. +
++
{runtimesQuery.error.message}
) : null} - +