@@ -279,14 +279,175 @@ beforeEach(() => {
279279
280280describe ( "modelsListCommand forward-compat" , ( ) => {
281281 describe ( "configured rows" , ( ) => {
282- it ( "keeps configured provider filters on the registry-free row path" , async ( ) => {
282+ it ( "returns manifest catalog rows for provider filters without --all" , async ( ) => {
283+ mocks . resolveConfiguredEntries . mockReturnValueOnce ( { entries : [ ] } ) ;
284+ mocks . loadStaticManifestCatalogRowsForList . mockReturnValueOnce ( [
285+ {
286+ provider : "moonshot" ,
287+ id : "kimi-k2.6" ,
288+ ref : "moonshot/kimi-k2.6" ,
289+ mergeKey : "moonshot::kimi-k2.6" ,
290+ name : "Kimi K2.6" ,
291+ source : "manifest" ,
292+ input : [ "text" , "image" ] ,
293+ reasoning : false ,
294+ status : "available" ,
295+ baseUrl : "https://api.moonshot.ai/v1" ,
296+ contextWindow : 262_144 ,
297+ } ,
298+ ] ) ;
299+ const runtime = createRuntime ( ) ;
300+
301+ await modelsListCommand ( { json : true , provider : "moonshot" } , runtime as never ) ;
302+
303+ expect ( mocks . loadModelRegistry ) . not . toHaveBeenCalled ( ) ;
304+ expect ( runtime . log ) . not . toHaveBeenCalledWith ( "No models found." ) ;
305+ expect ( lastPrintedRows < { key : string } > ( ) ) . toEqual ( [
306+ expect . objectContaining ( { key : "moonshot/kimi-k2.6" } ) ,
307+ ] ) ;
308+ } ) ;
309+
310+ it ( "keeps catalog metadata when provider-filtered configured entries overlap" , async ( ) => {
311+ mocks . resolveConfiguredEntries . mockReturnValueOnce ( {
312+ entries : [
313+ {
314+ key : "moonshot/kimi-k2.6" ,
315+ ref : { provider : "moonshot" , model : "kimi-k2.6" } ,
316+ tags : new Set ( [ "configured" ] ) ,
317+ aliases : [ ] ,
318+ } ,
319+ ] ,
320+ } ) ;
321+ mocks . loadStaticManifestCatalogRowsForList . mockReturnValueOnce ( [
322+ {
323+ provider : "moonshot" ,
324+ id : "kimi-k2.6" ,
325+ ref : "moonshot/kimi-k2.6" ,
326+ mergeKey : "moonshot::kimi-k2.6" ,
327+ name : "Kimi K2.6" ,
328+ source : "manifest" ,
329+ input : [ "text" , "image" ] ,
330+ reasoning : false ,
331+ status : "available" ,
332+ baseUrl : "https://api.moonshot.ai/v1" ,
333+ contextWindow : 262_144 ,
334+ } ,
335+ ] ) ;
336+ const runtime = createRuntime ( ) ;
337+
338+ await modelsListCommand ( { json : true , provider : "moonshot" } , runtime as never ) ;
339+
340+ expect ( mocks . loadModelRegistry ) . not . toHaveBeenCalled ( ) ;
341+ expect ( lastPrintedRows < { key : string ; name : string ; tags : string [ ] } > ( ) ) . toEqual ( [
342+ expect . objectContaining ( {
343+ key : "moonshot/kimi-k2.6" ,
344+ name : "Kimi K2.6" ,
345+ tags : [ "configured" ] ,
346+ } ) ,
347+ ] ) ;
348+ } ) ;
349+
350+ it ( "falls back to registry rows for unknown provider filters without --all" , async ( ) => {
351+ mocks . resolveConfiguredEntries . mockReturnValueOnce ( { entries : [ ] } ) ;
352+ mocks . loadModelRegistry . mockResolvedValueOnce ( {
353+ models : [
354+ {
355+ provider : "google" ,
356+ id : "gemini-2.5-pro" ,
357+ name : "Gemini 2.5 Pro" ,
358+ api : "google-gemini" ,
359+ baseUrl : "https://generativelanguage.googleapis.com/v1beta" ,
360+ input : [ "text" , "image" ] ,
361+ contextWindow : 1_048_576 ,
362+ maxTokens : 65_536 ,
363+ cost : { input : 0 , output : 0 , cacheRead : 0 , cacheWrite : 0 } ,
364+ } ,
365+ ] ,
366+ availableKeys : undefined ,
367+ registry : {
368+ getAll : ( ) => [
369+ {
370+ provider : "google" ,
371+ id : "gemini-2.5-pro" ,
372+ name : "Gemini 2.5 Pro" ,
373+ api : "google-gemini" ,
374+ baseUrl : "https://generativelanguage.googleapis.com/v1beta" ,
375+ input : [ "text" , "image" ] ,
376+ contextWindow : 1_048_576 ,
377+ maxTokens : 65_536 ,
378+ cost : { input : 0 , output : 0 , cacheRead : 0 , cacheWrite : 0 } ,
379+ } ,
380+ ] ,
381+ } ,
382+ } ) ;
383+ const runtime = createRuntime ( ) ;
384+
385+ await modelsListCommand ( { json : true , provider : "google" } , runtime as never ) ;
386+
387+ expect ( mocks . loadModelRegistry ) . toHaveBeenCalled ( ) ;
388+ expect ( runtime . log ) . not . toHaveBeenCalledWith ( "No models found." ) ;
389+ expect ( lastPrintedRows < { key : string } > ( ) ) . toEqual ( [
390+ expect . objectContaining ( { key : "google/gemini-2.5-pro" } ) ,
391+ ] ) ;
392+ } ) ;
393+
394+ it ( "uses provider static catalog rows for provider filters without --all" , async ( ) => {
395+ mocks . resolveConfiguredEntries . mockReturnValueOnce ( { entries : [ ] } ) ;
396+ mocks . hasProviderStaticCatalogForFilter . mockResolvedValueOnce ( true ) ;
397+ mocks . loadProviderCatalogModelsForList . mockResolvedValueOnce ( [
398+ {
399+ provider : "google" ,
400+ id : "gemini-2.5-pro" ,
401+ name : "gemini-2.5-pro" ,
402+ api : "google-gemini" ,
403+ baseUrl : "https://generativelanguage.googleapis.com/v1beta" ,
404+ input : [ "text" , "image" ] ,
405+ contextWindow : 1_048_576 ,
406+ maxTokens : 65_536 ,
407+ cost : { input : 0 , output : 0 , cacheRead : 0 , cacheWrite : 0 } ,
408+ } ,
409+ ] ) ;
410+ const runtime = createRuntime ( ) ;
411+
412+ await modelsListCommand ( { json : true , provider : "google" } , runtime as never ) ;
413+
414+ expect ( mocks . loadModelRegistry ) . not . toHaveBeenCalled ( ) ;
415+ expect ( mocks . loadProviderCatalogModelsForList ) . toHaveBeenCalledWith (
416+ expect . objectContaining ( {
417+ providerFilter : "google" ,
418+ staticOnly : true ,
419+ } ) ,
420+ ) ;
421+ expect ( lastPrintedRows < { key : string } > ( ) ) . toEqual ( [
422+ expect . objectContaining ( { key : "google/gemini-2.5-pro" } ) ,
423+ ] ) ;
424+ } ) ;
425+
426+ it ( "uses provider-index catalog rows for provider filters without --all" , async ( ) => {
427+ mocks . resolveConfiguredEntries . mockReturnValueOnce ( { entries : [ ] } ) ;
428+ mocks . loadProviderIndexCatalogRowsForList . mockReturnValueOnce ( [
429+ {
430+ provider : "moonshot" ,
431+ id : "kimi-k2.6" ,
432+ ref : "moonshot/kimi-k2.6" ,
433+ mergeKey : "moonshot::kimi-k2.6" ,
434+ name : "Kimi K2.6" ,
435+ source : "provider-index" ,
436+ input : [ "text" , "image" ] ,
437+ reasoning : false ,
438+ status : "available" ,
439+ baseUrl : "https://api.moonshot.ai/v1" ,
440+ contextWindow : 262_144 ,
441+ } ,
442+ ] ) ;
283443 const runtime = createRuntime ( ) ;
284444
285445 await modelsListCommand ( { json : true , provider : "moonshot" } , runtime as never ) ;
286446
287447 expect ( mocks . loadModelRegistry ) . not . toHaveBeenCalled ( ) ;
288- expect ( mocks . printModelTable ) . not . toHaveBeenCalled ( ) ;
289- expect ( runtime . log ) . toHaveBeenCalledWith ( "No models found." ) ;
448+ expect ( lastPrintedRows < { key : string } > ( ) ) . toEqual ( [
449+ expect . objectContaining ( { key : "moonshot/kimi-k2.6" } ) ,
450+ ] ) ;
290451 } ) ;
291452
292453 it ( "includes configured provider model rows for provider-filtered lists" , async ( ) => {
0 commit comments