From fb31557e12071d7c294ca260f2247136d5d43b7f Mon Sep 17 00:00:00 2001 From: jc Date: Thu, 23 Jul 2026 00:36:25 -0400 Subject: [PATCH] Add goose and Ollama as first-class onboarding providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Goose was hidden from the desktop onboarding screen — only Claude Code and Codex were listed as visible runtimes. This excluded the most popular open-source agent harness from the setup flow. Add goose to ONBOARDING_RUNTIME_ORDER so it appears in the harness selection and default-config steps alongside Claude Code and Codex. Add Ollama as a first-class LLM provider in PERSONA_LLM_PROVIDER_OPTIONS with no required credential env keys (Ollama runs locally at localhost:11434 by default, no API key needed). The Rust readiness goose_requirements function already handles unknown providers via a catch-all branch, so no backend changes are needed — Ollama provider + model can be satisfied via goose's ~/.config/goose/config.yaml file config tier. Updated onboardingRuntimeSelection tests to reflect goose visibility and ordering changes. Signed-off-by: jc --- desktop/src/features/agents/ui/agentConfigOptions.tsx | 7 +++++++ .../onboarding/ui/onboardingRuntimeSelection.test.mjs | 6 +++--- .../features/onboarding/ui/onboardingRuntimeSelection.ts | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/desktop/src/features/agents/ui/agentConfigOptions.tsx b/desktop/src/features/agents/ui/agentConfigOptions.tsx index 6ae81ff6cb..77c3c97248 100644 --- a/desktop/src/features/agents/ui/agentConfigOptions.tsx +++ b/desktop/src/features/agents/ui/agentConfigOptions.tsx @@ -40,6 +40,7 @@ const KNOWN_LLM_PROVIDER_IDS = [ "anthropic", "databricks", "databricks_v2", + "ollama", "openai", "openai-compat", ] as const; @@ -109,6 +110,11 @@ const PROVIDER_CREDENTIAL_CONFIG: Partial< "databricks-v2": { requiredEnvKeys: ["DATABRICKS_HOST"], }, + ollama: { + // Ollama runs locally — no API key or host required (defaults to + // http://localhost:11434). Set OLLAMA_BASE_URL only for non-default hosts. + requiredEnvKeys: [], + }, }; const DEFAULT_MODEL_OPTION: PersonaModelOption = { @@ -120,6 +126,7 @@ export const PERSONA_LLM_PROVIDER_OPTIONS: readonly PersonaModelOption[] = [ { id: "anthropic", label: "Anthropic" }, { id: "openai", label: "OpenAI" }, { id: "openai-compat", label: "OpenAI-compatible" }, + { id: "ollama", label: "Ollama (local)" }, { id: "relay-mesh", label: "Buzz shared compute" }, { id: "databricks", label: "Databricks" }, { id: "databricks_v2", label: "Databricks v2" }, diff --git a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs index b10aa19154..aa4403151e 100644 --- a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs +++ b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.test.mjs @@ -15,7 +15,7 @@ function runtime(id, availability, status) { test("only Claude Code and Codex are visible in onboarding", () => { assert.equal(runtimeIsVisibleInOnboarding("claude"), true); assert.equal(runtimeIsVisibleInOnboarding("codex"), true); - assert.equal(runtimeIsVisibleInOnboarding("goose"), false); + assert.equal(runtimeIsVisibleInOnboarding("goose"), true); assert.equal(runtimeIsVisibleInOnboarding("buzz-agent"), false); assert.equal(runtimeIsVisibleInOnboarding("custom"), false); }); @@ -30,7 +30,7 @@ test("visible onboarding runtimes use the product order", () => { assert.deepEqual( getVisibleOnboardingRuntimes(runtimes).map(({ id }) => id), - ["claude", "codex"], + ["goose", "claude", "codex"], ); }); @@ -65,6 +65,6 @@ test("ready onboarding runtimes exclude hidden ready harnesses", () => { assert.deepEqual( getReadyOnboardingRuntimes(runtimes).map(({ id }) => id), - ["claude"], + ["goose", "claude"], ); }); diff --git a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts index 51339e2afe..293a012177 100644 --- a/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts +++ b/desktop/src/features/onboarding/ui/onboardingRuntimeSelection.ts @@ -1,6 +1,6 @@ import type { AcpRuntimeCatalogEntry } from "@/shared/api/types"; -export const ONBOARDING_RUNTIME_ORDER = ["claude", "codex"]; +export const ONBOARDING_RUNTIME_ORDER = ["goose", "claude", "codex"]; const VISIBLE_ONBOARDING_RUNTIME_IDS = new Set( ONBOARDING_RUNTIME_ORDER,