on main help sign in
fix(copilot): change import to happen on demand, and also on onboarding
commit68ad2981a0017a510f1df6ba89c7492ecb1b4338 authorAndrey Nering <andreynering@users.noreply.github.com> dateThu 18 Dec 2025, 16:19 (1 year ago) parent13f315c
5 files changed+19−9
internal/config/config.go+4−1 internal/config/copilot.go+6−1 internal/config/load.go−7 internal/tui/components/chat/splash/splash.go+4 internal/tui/components/dialogs/models/models.go+5
internal/config/config.go+4−1
@@ -9,6 +9,7 @@ import (
99 "net/http"
1010 "net/url"
1111 "os"
12+ "path/filepath"
1213 "slices"
1314 "strings"
1415 "time"
@@ -498,7 +499,6 @@ func (c *Config) HasConfigField(key string) bool {
498499}
499500
500501func (c *Config) SetConfigField(key string, value any) error {
501− // read the data
502502 data, err := os.ReadFile(c.dataConfigDir)
503503 if err != nil {
504504 if os.IsNotExist(err) {
@@ -512,6 +512,9 @@ func (c *Config) SetConfigField(key string, value any) error {
512512 if err != nil {
513513 return fmt.Errorf("failed to set config field %s: %w", key, err)
514514 }
515+ if err := os.MkdirAll(filepath.Dir(c.dataConfigDir), 0o755); err != nil {
516+ return fmt.Errorf("failed to create config directory %q: %w", c.dataConfigDir, err)
517+ }
515518 if err := os.WriteFile(c.dataConfigDir, []byte(newValue), 0o600); err != nil {
516519 return fmt.Errorf("failed to write config file: %w", err)
517520 }
internal/config/copilot.go+6−1
@@ -6,11 +6,12 @@ import (
66 "log/slog"
77 "testing"
88
9+ "github.com/charmbracelet/catwalk/pkg/catwalk"
910 "github.com/charmbracelet/crush/internal/oauth"
1011 "github.com/charmbracelet/crush/internal/oauth/copilot"
1112)
1213
13−func (c *Config) importCopilot() (*oauth.Token, bool) {
14+func (c *Config) ImportCopilot() (*oauth.Token, bool) {
1415 if testing.Testing() {
1516 return nil, false
1617 }
@@ -31,6 +32,10 @@ func (c *Config) importCopilot() (*oauth.Token, bool) {
3132 return nil, false
3233 }
3334
35+ if err := c.SetProviderAPIKey(string(catwalk.InferenceProviderCopilot), token); err != nil {
36+ return token, false
37+ }
38+
3439 if err := cmp.Or(
3540 c.SetConfigField("providers.copilot.api_key", token.AccessToken),
3641 c.SetConfigField("providers.copilot.oauth", token),
internal/config/load.go−7
@@ -133,8 +133,6 @@ func PushPopCrushEnv() func() {
133133}
134134
135135func (c *Config) configureProviders(env env.Env, resolver VariableResolver, knownProviders []catwalk.Provider) error {
136− c.importCopilot()
137−
138136 knownProviderNames := make(map[string]bool)
139137 restore := PushPopCrushEnv()
140138 defer restore()
@@ -206,11 +204,6 @@ func (c *Config) configureProviders(env env.Env, resolver VariableResolver, know
206204 case p.ID == catwalk.InferenceProviderAnthropic && config.OAuthToken != nil:
207205 prepared.SetupClaudeCode()
208206 case p.ID == catwalk.InferenceProviderCopilot:
209− if config.OAuthToken != nil {
210− if token, ok := c.importCopilot(); ok {
211− prepared.OAuthToken = token
212− }
213− }
214207 if config.OAuthToken != nil {
215208 prepared.SetupGitHubCopilot()
216209 }
internal/tui/components/chat/splash/splash.go+4
@@ -346,6 +346,10 @@ func (s *splashCmp) Update(msg tea.Msg) (util.Model, tea.Cmd) {
346346 s.hyperDeviceFlow.SetWidth(min(s.width-2, 60))
347347 return s, s.hyperDeviceFlow.Init()
348348 case catwalk.InferenceProviderCopilot:
349+ if token, ok := config.Get().ImportCopilot(); ok {
350+ s.selectedModel = selectedItem
351+ return s, s.saveAPIKeyAndContinue(token, true)
352+ }
349353 s.selectedModel = selectedItem
350354 s.showCopilotDeviceFlow = true
351355 s.copilotDeviceFlow = copilot.NewDeviceFlow()
internal/tui/components/dialogs/models/models.go+5
@@ -307,6 +307,11 @@ func (m *modelDialogCmp) Update(msg tea.Msg) (util.Model, tea.Cmd) {
307307 m.hyperDeviceFlow.SetWidth(m.width - 2)
308308 return m, m.hyperDeviceFlow.Init()
309309 case catwalk.InferenceProviderCopilot:
310+ if token, ok := config.Get().ImportCopilot(); ok {
311+ m.selectedModel = selectedItem
312+ m.selectedModelType = modelType
313+ return m, m.saveOauthTokenAndContinue(token, true)
314+ }
310315 m.showCopilotDeviceFlow = true
311316 m.selectedModel = selectedItem
312317 m.selectedModelType = modelType