@@ -15,7 +15,9 @@ import {
1515 PREVIEW_GEMINI_FLASH_MODEL ,
1616 DEFAULT_GEMINI_MODEL_AUTO ,
1717 PREVIEW_GEMINI_MODEL_AUTO ,
18+ GEMINI_MODEL_ALIAS_AUTO ,
1819} from '../../config/models.js' ;
20+ import { AuthType } from '../../core/contentGenerator.js' ;
1921import { ApprovalMode } from '../../policy/types.js' ;
2022import type { BaseLlmClient } from '../../core/baseLlmClient.js' ;
2123
@@ -40,6 +42,15 @@ describe('ApprovalModeStrategy', () => {
4042 getApprovalMode : vi . fn ( ) . mockReturnValue ( ApprovalMode . DEFAULT ) ,
4143 getApprovedPlanPath : vi . fn ( ) . mockReturnValue ( undefined ) ,
4244 getPlanModeRoutingEnabled : vi . fn ( ) . mockResolvedValue ( true ) ,
45+ getGemini31Launched : vi . fn ( ) . mockResolvedValue ( false ) ,
46+ getUseCustomToolModel : vi . fn ( ) . mockImplementation ( async ( ) => {
47+ const launched = await mockConfig . getGemini31Launched ( ) ;
48+ const authType = mockConfig . getContentGeneratorConfig ?.( ) ?. authType ;
49+ return launched && authType === AuthType . USE_GEMINI ;
50+ } ) ,
51+ getContentGeneratorConfig : vi . fn ( ) . mockReturnValue ( {
52+ authType : AuthType . LOGIN_WITH_GOOGLE ,
53+ } ) ,
4354 } as unknown as Config ;
4455
4556 mockBaseLlmClient = { } as BaseLlmClient ;
@@ -184,4 +195,50 @@ describe('ApprovalModeStrategy', () => {
184195
185196 expect ( decision ?. model ) . toBe ( PREVIEW_GEMINI_MODEL ) ;
186197 } ) ;
198+
199+ it ( 'should route to Preview models when using "auto" alias' , async ( ) => {
200+ vi . mocked ( mockConfig . getModel ) . mockReturnValue ( GEMINI_MODEL_ALIAS_AUTO ) ;
201+ vi . mocked ( mockConfig . getApprovalMode ) . mockReturnValue ( ApprovalMode . PLAN ) ;
202+
203+ const decision = await strategy . route (
204+ mockContext ,
205+ mockConfig ,
206+ mockBaseLlmClient ,
207+ ) ;
208+
209+ expect ( decision ?. model ) . toBe ( PREVIEW_GEMINI_MODEL ) ;
210+
211+ vi . mocked ( mockConfig . getApprovalMode ) . mockReturnValue ( ApprovalMode . DEFAULT ) ;
212+ vi . mocked ( mockConfig . getApprovedPlanPath ) . mockReturnValue (
213+ '/path/to/plan.md' ,
214+ ) ;
215+
216+ const implementationDecision = await strategy . route (
217+ mockContext ,
218+ mockConfig ,
219+ mockBaseLlmClient ,
220+ ) ;
221+
222+ expect ( implementationDecision ?. model ) . toBe ( PREVIEW_GEMINI_FLASH_MODEL ) ;
223+ } ) ;
224+
225+ it ( 'should route to Preview Flash model when an approved plan exists and Gemini 3.1 is launched' , async ( ) => {
226+ vi . mocked ( mockConfig . getModel ) . mockReturnValue ( GEMINI_MODEL_ALIAS_AUTO ) ;
227+ vi . mocked ( mockConfig . getGemini31Launched ) . mockResolvedValue ( true ) ;
228+
229+ // Exit plan mode with approved plan
230+ vi . mocked ( mockConfig . getApprovalMode ) . mockReturnValue ( ApprovalMode . DEFAULT ) ;
231+ vi . mocked ( mockConfig . getApprovedPlanPath ) . mockReturnValue (
232+ '/path/to/plan.md' ,
233+ ) ;
234+
235+ const decision = await strategy . route (
236+ mockContext ,
237+ mockConfig ,
238+ mockBaseLlmClient ,
239+ ) ;
240+
241+ // Should resolve to Preview Flash (3.0) because resolveClassifierModel uses preview variants for Gemini 3
242+ expect ( decision ?. model ) . toBe ( PREVIEW_GEMINI_FLASH_MODEL ) ;
243+ } ) ;
187244} ) ;
0 commit comments