Skip to content

Commit 290befb

Browse files
committed
Rebase copilot picker onto new modal
1 parent ed542ca commit 290befb

2 files changed

Lines changed: 79 additions & 2 deletions

File tree

apps/web/src/components/chat/ProviderModelPicker.browser.tsx

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,21 @@ function buildCodexProvider(models: ServerProvider["models"]): ServerProvider {
188188
};
189189
}
190190

191+
function buildCopilotProvider(models: ServerProvider["models"]): ServerProvider {
192+
return {
193+
provider: "copilot",
194+
enabled: true,
195+
installed: true,
196+
version: "1.0.0",
197+
status: "ready",
198+
auth: { status: "authenticated" },
199+
checkedAt: new Date().toISOString(),
200+
models,
201+
slashCommands: [],
202+
skills: [],
203+
};
204+
}
205+
191206
function buildOpenCodeProvider(models: ServerProvider["models"]): ServerProvider {
192207
return {
193208
provider: "opencode",
@@ -307,9 +322,10 @@ describe("ProviderModelPicker", () => {
307322
await page.getByRole("button").click();
308323

309324
await vi.waitFor(() => {
310-
expect(getSidebarProviderOrder().slice(0, 3)).toEqual([
325+
expect(getSidebarProviderOrder().slice(0, 4)).toEqual([
311326
"favorites",
312327
"codex",
328+
"copilot",
313329
"claudeAgent",
314330
]);
315331
});
@@ -318,6 +334,65 @@ describe("ProviderModelPicker", () => {
318334
}
319335
});
320336

337+
it("shows the real copilot provider alongside the coming-soon copilot badge item", async () => {
338+
const providers: ReadonlyArray<ServerProvider> = [
339+
TEST_PROVIDERS[0]!,
340+
buildCopilotProvider([
341+
{
342+
slug: "auto",
343+
name: "Auto",
344+
isCustom: false,
345+
capabilities: {
346+
reasoningEffortLevels: [effort("low"), effort("medium", true), effort("high")],
347+
supportsFastMode: false,
348+
supportsThinkingToggle: false,
349+
contextWindowOptions: [],
350+
promptInjectedEffortLevels: [],
351+
},
352+
},
353+
{
354+
slug: "gpt-4.1",
355+
name: "GPT-4.1",
356+
isCustom: false,
357+
capabilities: {
358+
reasoningEffortLevels: [effort("low"), effort("medium", true), effort("high")],
359+
supportsFastMode: false,
360+
supportsThinkingToggle: false,
361+
contextWindowOptions: [],
362+
promptInjectedEffortLevels: [],
363+
},
364+
},
365+
]),
366+
TEST_PROVIDERS[1]!,
367+
];
368+
const mounted = await mountPicker({
369+
provider: "claudeAgent",
370+
model: "claude-opus-4-6",
371+
lockedProvider: null,
372+
providers,
373+
});
374+
375+
try {
376+
await page.getByRole("button").click();
377+
378+
await vi.waitFor(() => {
379+
expect(getSidebarProviderOrder()).toContain("copilot");
380+
expect(getSidebarProviderOrder()).toContain("github-copilot-coming-soon");
381+
});
382+
383+
await page.getByRole("button", { name: "Copilot", exact: true }).click();
384+
385+
await vi.waitFor(() => {
386+
const listText = getModelPickerListText();
387+
expect(listText).toContain("Auto");
388+
expect(listText).toContain("GPT-4.1");
389+
expect(listText).not.toContain("Claude Opus 4.6");
390+
});
391+
} finally {
392+
await mounted.cleanup();
393+
}
394+
});
395+
321396
it("filters models by selected provider in sidebar", async () => {
322397
const mounted = await mountPicker({
323398
provider: "claudeAgent",
@@ -426,6 +501,7 @@ describe("ProviderModelPicker", () => {
426501
{ slug: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" },
427502
],
428503
codex: [{ slug: "gpt-5-codex", name: "GPT-5 Codex" }],
504+
copilot: [],
429505
cursor: [],
430506
opencode: [],
431507
} as const;

apps/web/src/components/chat/providerIconUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { type ProviderKind, PROVIDER_DISPLAY_NAMES } from "@t3tools/contracts";
2-
import { ClaudeAI, CursorIcon, Icon, OpenAI, OpenCodeIcon } from "../Icons";
2+
import { ClaudeAI, CursorIcon, GitHubIcon, Icon, OpenAI, OpenCodeIcon } from "../Icons";
33
import { PROVIDER_OPTIONS } from "../../session-logic";
44

55
export const PROVIDER_ICON_BY_PROVIDER: Record<ProviderKind, Icon> = {
66
codex: OpenAI,
7+
copilot: GitHubIcon,
78
claudeAgent: ClaudeAI,
89
opencode: OpenCodeIcon,
910
cursor: CursorIcon,

0 commit comments

Comments
 (0)