1- import type { Argv } from "yargs "
2- import { Instance } from "../../project/instance "
1+ import { EOL } from "os "
2+ import { Effect } from "effect "
33import { Provider } from "@/provider/provider"
44import { ProviderID } from "../../provider/schema"
55import { ModelsDev } from "@/provider/models"
6- import { cmd } from "./ cmd"
6+ import { effectCmd , fail } from "../effect- cmd"
77import { UI } from "../ui"
8- import { EOL } from "os"
9- import { AppRuntime } from "@/effect/app-runtime"
10- import { Effect } from "effect"
118
12- export const ModelsCommand = cmd ( {
9+ export const ModelsCommand = effectCmd ( {
1310 command : "models [provider]" ,
1411 describe : "list all available models" ,
15- builder : ( yargs : Argv ) => {
16- return yargs
12+ builder : ( yargs ) =>
13+ yargs
1714 . positional ( "provider" , {
1815 describe : "provider ID to filter models by" ,
1916 type : "string" ,
@@ -26,63 +23,45 @@ export const ModelsCommand = cmd({
2623 . option ( "refresh" , {
2724 describe : "refresh the models cache from models.dev" ,
2825 type : "boolean" ,
29- } )
30- } ,
31- handler : async ( args ) => {
26+ } ) ,
27+ handler : Effect . fn ( "Cli.models" ) ( function * ( args ) {
3228 if ( args . refresh ) {
33- await ModelsDev . refresh ( true )
29+ // followup: lift ModelsDev into an Effect Service so this drops the Effect.promise wrap.
30+ yield * Effect . promise ( ( ) => ModelsDev . refresh ( true ) )
3431 UI . println ( UI . Style . TEXT_SUCCESS_BOLD + "Models cache refreshed" + UI . Style . TEXT_NORMAL )
3532 }
3633
37- await Instance . provide ( {
38- directory : process . cwd ( ) ,
39- async fn ( ) {
40- await AppRuntime . runPromise (
41- Effect . gen ( function * ( ) {
42- const svc = yield * Provider . Service
43- const providers = yield * svc . list ( )
34+ const provider = yield * Provider . Service
35+ const providers = yield * provider . list ( )
4436
45- const print = ( providerID : ProviderID , verbose ?: boolean ) => {
46- const provider = providers [ providerID ]
47- const sorted = Object . entries ( provider . models ) . sort ( ( [ a ] , [ b ] ) => a . localeCompare ( b ) )
48- for ( const [ modelID , model ] of sorted ) {
49- process . stdout . write ( `${ providerID } /${ modelID } ` )
50- process . stdout . write ( EOL )
51- if ( verbose ) {
52- process . stdout . write ( JSON . stringify ( model , null , 2 ) )
53- process . stdout . write ( EOL )
54- }
55- }
56- }
57-
58- if ( args . provider ) {
59- const providerID = ProviderID . make ( args . provider )
60- const provider = providers [ providerID ]
61- if ( ! provider ) {
62- yield * Effect . sync ( ( ) => UI . error ( `Provider not found: ${ args . provider } ` ) )
63- return
64- }
65-
66- yield * Effect . sync ( ( ) => print ( providerID , args . verbose ) )
67- return
68- }
37+ const print = ( providerID : ProviderID , verbose ?: boolean ) => {
38+ const p = providers [ providerID ]
39+ const sorted = Object . entries ( p . models ) . sort ( ( [ a ] , [ b ] ) => a . localeCompare ( b ) )
40+ for ( const [ modelID , model ] of sorted ) {
41+ process . stdout . write ( `${ providerID } /${ modelID } ` )
42+ process . stdout . write ( EOL )
43+ if ( verbose ) {
44+ process . stdout . write ( JSON . stringify ( model , null , 2 ) )
45+ process . stdout . write ( EOL )
46+ }
47+ }
48+ }
6949
70- const ids = Object . keys ( providers ) . sort ( ( a , b ) => {
71- const aIsOpencode = a . startsWith ( "opencode" )
72- const bIsOpencode = b . startsWith ( "opencode" )
73- if ( aIsOpencode && ! bIsOpencode ) return - 1
74- if ( ! aIsOpencode && bIsOpencode ) return 1
75- return a . localeCompare ( b )
76- } )
50+ if ( args . provider ) {
51+ const providerID = ProviderID . make ( args . provider )
52+ if ( ! providers [ providerID ] ) return yield * fail ( `Provider not found: ${ args . provider } ` )
53+ print ( providerID , args . verbose )
54+ return
55+ }
7756
78- yield * Effect . sync ( ( ) => {
79- for ( const providerID of ids ) {
80- print ( ProviderID . make ( providerID ) , args . verbose )
81- }
82- } )
83- } ) ,
84- )
85- } ,
57+ const ids = Object . keys ( providers ) . sort ( ( a , b ) => {
58+ const aIsOpencode = a . startsWith ( "opencode" )
59+ const bIsOpencode = b . startsWith ( "opencode" )
60+ if ( aIsOpencode && ! bIsOpencode ) return - 1
61+ if ( ! aIsOpencode && bIsOpencode ) return 1
62+ return a . localeCompare ( b )
8663 } )
87- } ,
64+
65+ for ( const providerID of ids ) print ( ProviderID . make ( providerID ) , args . verbose )
66+ } ) ,
8867} )
0 commit comments