diff options
| author | adamdottv <[email protected]> | 2025-06-16 11:53:06 -0500 |
|---|---|---|
| committer | adamdottv <[email protected]> | 2025-06-16 11:54:55 -0500 |
| commit | 7c0d10a4cec17d4cb2e04793c56363f2e746278b (patch) | |
| tree | dd1fef7560a8bdb7803e40e1fa31ab51d7134bad /packages/tui/internal/app | |
| parent | 06af4061469b584744e4a976999bb7a55885c15d (diff) | |
| download | opencode-7c0d10a4cec17d4cb2e04793c56363f2e746278b.tar.gz opencode-7c0d10a4cec17d4cb2e04793c56363f2e746278b.zip | |
feat: faster tui init
Diffstat (limited to 'packages/tui/internal/app')
| -rw-r--r-- | packages/tui/internal/app/app.go | 150 |
1 files changed, 79 insertions, 71 deletions
diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go index 7602bfa17..658dbcbdf 100644 --- a/packages/tui/internal/app/app.go +++ b/packages/tui/internal/app/app.go @@ -17,7 +17,11 @@ import ( "github.com/sst/opencode/pkg/client" ) +var RootPath string + type App struct { + Info client.AppInfo + Version string ConfigPath string Config *config.Config Client *client.ClientWithResponses @@ -28,95 +32,99 @@ type App struct { Commands commands.Registry } -type AppInfo struct { - client.AppInfo - Version string -} - -var Info AppInfo - -func New(ctx context.Context, version string, httpClient *client.ClientWithResponses) (*App, error) { - appInfoResponse, _ := httpClient.PostAppInfoWithResponse(ctx) - appInfo := appInfoResponse.JSON200 - Info = AppInfo{ - AppInfo: *appInfo, - Version: version, - } - - providersResponse, err := httpClient.PostProviderListWithResponse(ctx) - if err != nil { - return nil, err - } - providers := []client.ProviderInfo{} - var defaultProvider *client.ProviderInfo - var defaultModel *client.ModelInfo - - var anthropic *client.ProviderInfo - for _, provider := range providersResponse.JSON200.Providers { - if provider.Id == "anthropic" { - anthropic = &provider - } - } - - // default to anthropic if available - if anthropic != nil { - defaultProvider = anthropic - defaultModel = getDefaultModel(providersResponse, *anthropic) - } +func New( + ctx context.Context, + version string, + appInfo client.AppInfo, + httpClient *client.ClientWithResponses, +) (*App, error) { + RootPath = appInfo.Path.Root - for _, provider := range providersResponse.JSON200.Providers { - if defaultProvider == nil || defaultModel == nil { - defaultProvider = &provider - defaultModel = getDefaultModel(providersResponse, provider) - } - providers = append(providers, provider) - } - if len(providers) == 0 { - return nil, fmt.Errorf("no providers found") - } - - appConfigPath := filepath.Join(Info.Path.Config, "config") + appConfigPath := filepath.Join(appInfo.Path.Config, "config") appConfig, err := config.LoadConfig(appConfigPath) if err != nil { - slog.Info("No TUI config found, using default values", "error", err) - appConfig = config.NewConfig("opencode", defaultProvider.Id, defaultModel.Id) + appConfig = config.NewConfig() config.SaveConfig(appConfigPath, appConfig) } - - var currentProvider *client.ProviderInfo - var currentModel *client.ModelInfo - for _, provider := range providers { - if provider.Id == appConfig.Provider { - currentProvider = &provider - - for _, model := range provider.Models { - if model.Id == appConfig.Model { - currentModel = &model - } - } - } - } - if currentProvider == nil || currentModel == nil { - currentProvider = defaultProvider - currentModel = defaultModel - } + theme.SetTheme(appConfig.Theme) app := &App{ + Info: appInfo, + Version: version, ConfigPath: appConfigPath, Config: appConfig, Client: httpClient, - Provider: currentProvider, - Model: currentModel, Session: &client.SessionInfo{}, Messages: []client.MessageInfo{}, Commands: commands.NewCommandRegistry(), } - theme.SetTheme(appConfig.Theme) - return app, nil } +func (a *App) InitializeProvider() tea.Cmd { + return func() tea.Msg { + providersResponse, err := a.Client.PostProviderListWithResponse(context.Background()) + if err != nil { + slog.Error("Failed to list providers", "error", err) + // TODO: notify user + return nil + } + providers := []client.ProviderInfo{} + var defaultProvider *client.ProviderInfo + var defaultModel *client.ModelInfo + + var anthropic *client.ProviderInfo + for _, provider := range providersResponse.JSON200.Providers { + if provider.Id == "anthropic" { + anthropic = &provider + } + } + + // default to anthropic if available + if anthropic != nil { + defaultProvider = anthropic + defaultModel = getDefaultModel(providersResponse, *anthropic) + } + + for _, provider := range providersResponse.JSON200.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 + } + + var currentProvider *client.ProviderInfo + var currentModel *client.ModelInfo + for _, provider := range providers { + if provider.Id == a.Config.Provider { + currentProvider = &provider + + for _, model := range provider.Models { + if model.Id == a.Config.Model { + currentModel = &model + } + } + } + } + if currentProvider == nil || currentModel == nil { + currentProvider = defaultProvider + currentModel = defaultModel + } + + // TODO: handle no provider or model setup, yet + return state.ModelSelectedMsg{ + Provider: *currentProvider, + Model: *currentModel, + } + } +} + func getDefaultModel(response *client.PostProviderListResponse, provider client.ProviderInfo) *client.ModelInfo { if match, ok := response.JSON200.Default[provider.Id]; ok { model := provider.Models[match] |
