diff --git a/packages/app/e2e/browser/agent-profiles-picker.spec.ts b/packages/app/e2e/browser/agent-profiles-picker.spec.ts index 87fcffcab..d67de4da3 100644 --- a/packages/app/e2e/browser/agent-profiles-picker.spec.ts +++ b/packages/app/e2e/browser/agent-profiles-picker.spec.ts @@ -1,17 +1,14 @@ -import { test } from "../support/fixtures"; +import { expect, test } from "../support/fixtures"; import { applyProfileFromPicker, closeModelPicker, - drillIntoProvider, expectComposerDoesNotName, expectAgentProfilesEmptyPrompt, expectProfileEditTooltip, expectComposerMode, expectComposerModel, expectModelRowSelected, - expectNothingSelectedInPickerRoot, expectProfileEditIsPencilOnly, - expectProfilePinnedAboveProviders, expectProfileVisibleForProvider, openModelPicker, openAgentProfilesFromEmptyPrompt, @@ -74,9 +71,12 @@ test.describe("Agent profiles in the model picker", () => { await expectComposerMode(page, "Load test"); }); - await test.step("the profile is pinned above the provider list", async () => { + await test.step("the sole provider opens directly", async () => { await openModelPicker(page); - await expectProfilePinnedAboveProviders(page, { + await expect(page.getByTestId("model-search-input").first()).toBeVisible(); + await expect(page.getByTestId("sheet-header-back")).toHaveCount(0); + await expect(page.locator('[data-testid^="model-provider-"]')).toHaveCount(0); + await expectProfileVisibleForProvider(page, { name: PROFILE.name, summary: PROFILE_SUMMARY, }); @@ -100,17 +100,9 @@ test.describe("Agent profiles in the model picker", () => { await expectComposerDoesNotName(page, PROFILE.name); }); - await test.step("reopening the picker shows no profile marked as selected", async () => { + await test.step("reopening returns directly to the provider models", async () => { await openModelPicker(page); - await expectProfilePinnedAboveProviders(page, { - name: PROFILE.name, - summary: PROFILE_SUMMARY, - }); - await expectNothingSelectedInPickerRoot(page); - }); - - await test.step("the model it materialized is the one marked selected", async () => { - await drillIntoProvider(page, "mock"); + await expect(page.getByTestId("model-search-input").first()).toBeVisible(); await expectProfileVisibleForProvider(page, { name: PROFILE.name, summary: PROFILE_SUMMARY, diff --git a/packages/app/src/components/model-browser-view.test.ts b/packages/app/src/components/model-browser-view.test.ts index edb499a4a..f1e1998eb 100644 --- a/packages/app/src/components/model-browser-view.test.ts +++ b/packages/app/src/components/model-browser-view.test.ts @@ -70,7 +70,7 @@ describe("model browser initial view", () => { ).toEqual({ kind: "all" }); }); - it("keeps the root even when a single provider would otherwise be skipped", () => { + it("opens a sole provider directly regardless of root content", () => { expect( resolveInitialModelBrowserView({ providers: [pi], @@ -78,7 +78,7 @@ describe("model browser initial view", () => { selectedModel: "pi-pro", hasProfiles: true, }), - ).toEqual({ kind: "all" }); + ).toEqual({ kind: "provider", providerId: "pi", providerLabel: "Pi" }); }); it("falls back to the root when the selected provider is gone", () => { diff --git a/packages/app/src/components/model-browser-view.ts b/packages/app/src/components/model-browser-view.ts index acdde18b0..75b1c7541 100644 --- a/packages/app/src/components/model-browser-view.ts +++ b/packages/app/src/components/model-browser-view.ts @@ -32,11 +32,7 @@ export function resolveModelBrowserAllView({ return { kind: "searchResults", rows }; } -/** - * Where the picker lands when it opens. Agent profiles live on the root view, so - * a host that has any profile always opens there — including the single-provider - * case, which would otherwise skip the root entirely and hide them. - */ +/** Where the picker lands when it opens. A sole provider skips the redundant root view. */ export function resolveInitialModelBrowserView({ providers, selectedProvider, @@ -48,10 +44,6 @@ export function resolveInitialModelBrowserView({ selectedModel: string; hasProfiles: boolean; }): ModelBrowserView { - if (hasProfiles) { - return { kind: "all" }; - } - const singleProvider = providers.length === 1 ? providers[0] : undefined; if (singleProvider) { return { @@ -61,6 +53,10 @@ export function resolveInitialModelBrowserView({ }; } + if (hasProfiles) { + return { kind: "all" }; + } + if (selectedProvider.length > 0 && selectedModel.length > 0) { const provider = providers.find((entry) => entry.id === selectedProvider); if (provider) { diff --git a/packages/app/src/components/model-browser.tsx b/packages/app/src/components/model-browser.tsx index 5fa2e45f7..49a37bfe0 100644 --- a/packages/app/src/components/model-browser.tsx +++ b/packages/app/src/components/model-browser.tsx @@ -292,9 +292,7 @@ export function useModelBrowser({ setSearchQuery(value); }, []); - // A pinned profiles section makes the root worth returning to, so the back - // affordance stays even when the drill-down was the only provider. - const singleProviderView = providers.length === 1 && !hasProfiles; + const singleProviderView = providers.length === 1; const header = useMemo(() => { if (view.kind === "all") { return {