|
|
@@ -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(
|