summaryrefslogtreecommitdiffhomepage
path: root/packages/tui/internal/app
diff options
context:
space:
mode:
authoradamdottv <[email protected]>2025-06-16 11:53:06 -0500
committeradamdottv <[email protected]>2025-06-16 11:54:55 -0500
commit7c0d10a4cec17d4cb2e04793c56363f2e746278b (patch)
treedd1fef7560a8bdb7803e40e1fa31ab51d7134bad /packages/tui/internal/app
parent06af4061469b584744e4a976999bb7a55885c15d (diff)
downloadopencode-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.go150
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]