diff options
| author | adamdottv <[email protected]> | 2025-07-08 05:50:10 -0500 |
|---|---|---|
| committer | adamdottv <[email protected]> | 2025-07-08 05:50:18 -0500 |
| commit | ea96ead346d48f35bcffe829a2b5b667305910c3 (patch) | |
| tree | 06127c95a0dd506451ff1a5846767f5fe8d947c1 /packages/tui/internal/app | |
| parent | 6100a77b853917292a024ccdd818ff43e0acc0f1 (diff) | |
| download | opencode-ea96ead346d48f35bcffe829a2b5b667305910c3.tar.gz opencode-ea96ead346d48f35bcffe829a2b5b667305910c3.zip | |
feat(tui): handle --model and --prompt flags
Diffstat (limited to 'packages/tui/internal/app')
| -rw-r--r-- | packages/tui/internal/app/app.go | 156 |
1 files changed, 93 insertions, 63 deletions
diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go index cffd07391..08a999f14 100644 --- a/packages/tui/internal/app/app.go +++ b/packages/tui/internal/app/app.go @@ -21,17 +21,19 @@ import ( ) type App struct { - Info opencode.App - Version string - StatePath string - Config *opencode.Config - Client *opencode.Client - State *config.State - Provider *opencode.Provider - Model *opencode.Model - Session *opencode.Session - Messages []opencode.MessageUnion - Commands commands.CommandRegistry + Info opencode.App + Version string + StatePath string + Config *opencode.Config + Client *opencode.Client + State *config.State + Provider *opencode.Provider + Model *opencode.Model + Session *opencode.Session + Messages []opencode.MessageUnion + Commands commands.CommandRegistry + InitialModel *string + InitialPrompt *string } type SessionSelectedMsg = *opencode.Session @@ -58,6 +60,8 @@ func New( version string, appInfo opencode.App, httpClient *opencode.Client, + model *string, + prompt *string, ) (*App, error) { util.RootPath = appInfo.Path.Root util.CwdPath = appInfo.Path.Cwd @@ -109,15 +113,17 @@ func New( slog.Debug("Loaded config", "config", configInfo) app := &App{ - Info: appInfo, - Version: version, - StatePath: appStatePath, - Config: configInfo, - State: appState, - Client: httpClient, - Session: &opencode.Session{}, - Messages: []opencode.MessageUnion{}, - Commands: commands.LoadFromConfig(configInfo), + Info: appInfo, + Version: version, + StatePath: appStatePath, + Config: configInfo, + State: appState, + Client: httpClient, + Session: &opencode.Session{}, + Messages: []opencode.MessageUnion{}, + Commands: commands.LoadFromConfig(configInfo), + InitialModel: model, + InitialPrompt: prompt, } return app, nil @@ -141,65 +147,89 @@ func (a *App) Key(commandName commands.CommandName) string { } func (a *App) InitializeProvider() tea.Cmd { - return func() tea.Msg { - providersResponse, err := a.Client.Config.Providers(context.Background()) - if err != nil { - slog.Error("Failed to list providers", "error", err) - // TODO: notify user - return nil + providersResponse, err := a.Client.Config.Providers(context.Background()) + if err != nil { + slog.Error("Failed to list providers", "error", err) + // TODO: notify user + return nil + } + providers := providersResponse.Providers + var defaultProvider *opencode.Provider + var defaultModel *opencode.Model + + var anthropic *opencode.Provider + for _, provider := range providers { + if provider.ID == "anthropic" { + anthropic = &provider } - providers := providersResponse.Providers - var defaultProvider *opencode.Provider - var defaultModel *opencode.Model + } - var anthropic *opencode.Provider - for _, provider := range providers { - if provider.ID == "anthropic" { - anthropic = &provider - } - } + // default to anthropic if available + if anthropic != nil { + defaultProvider = anthropic + defaultModel = getDefaultModel(providersResponse, *anthropic) + } - // default to anthropic if available - if anthropic != nil { - defaultProvider = anthropic - defaultModel = getDefaultModel(providersResponse, *anthropic) + for _, provider := range providers { + if defaultProvider == nil || defaultModel == nil { + defaultProvider = &provider + defaultModel = getDefaultModel(providersResponse, provider) } + providers = append(providers, provider) + } + if len(providers) == 0 { + slog.Error("No providers configured") + return nil + } - for _, provider := range providers { - if defaultProvider == nil || defaultModel == nil { - defaultProvider = &provider - defaultModel = getDefaultModel(providersResponse, provider) + var currentProvider *opencode.Provider + var currentModel *opencode.Model + for _, provider := range providers { + if provider.ID == a.State.Provider { + currentProvider = &provider + + for _, model := range provider.Models { + if model.ID == a.State.Model { + currentModel = &model + } } - providers = append(providers, provider) - } - if len(providers) == 0 { - slog.Error("No providers configured") - return nil } + } + if currentProvider == nil || currentModel == nil { + currentProvider = defaultProvider + currentModel = defaultModel + } - var currentProvider *opencode.Provider - var currentModel *opencode.Model + var initialProvider *opencode.Provider + var initialModel *opencode.Model + if a.InitialModel != nil && *a.InitialModel != "" { + splits := strings.Split(*a.InitialModel, "/") for _, provider := range providers { - if provider.ID == a.State.Provider { - currentProvider = &provider - + if provider.ID == splits[0] { + initialProvider = &provider for _, model := range provider.Models { - if model.ID == a.State.Model { - currentModel = &model + if model.ID == splits[1] { + initialModel = &model } } } } - if currentProvider == nil || currentModel == nil { - currentProvider = defaultProvider - currentModel = defaultModel - } + } - return ModelSelectedMsg{ - Provider: *currentProvider, - Model: *currentModel, - } + if initialProvider != nil && initialModel != nil { + currentProvider = initialProvider + currentModel = initialModel + } + + var cmds []tea.Cmd + cmds = append(cmds, util.CmdHandler(ModelSelectedMsg{ + Provider: *currentProvider, + Model: *currentModel, + })) + if a.InitialPrompt != nil && *a.InitialPrompt != "" { + cmds = append(cmds, util.CmdHandler(SendMsg{Text: *a.InitialPrompt})) } + return tea.Sequence(cmds...) } func getDefaultModel( |
