@@ -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+
191206function 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 ;
0 commit comments