1package config
2
3import (
4 "cmp"
5 "context"
6 "log/slog"
7 "testing"
8
9 "github.com/charmbracelet/catwalk/pkg/catwalk"
10 "github.com/charmbracelet/crush/internal/oauth"
11 "github.com/charmbracelet/crush/internal/oauth/copilot"
12)
13
14func (c *Config) ImportCopilot() (*oauth.Token, bool) {
15 if testing.Testing() {
16 return nil, false
17 }
18
19 if c.HasConfigField("providers.copilot.api_key") || c.HasConfigField("providers.copilot.oauth") {
20 return nil, false
21 }
22
23 diskToken, hasDiskToken := copilot.RefreshTokenFromDisk()
24 if !hasDiskToken {
25 return nil, false
26 }
27
28 slog.Info("Found existing GitHub Copilot token on disk. Authenticating...")
29 token, err := copilot.RefreshToken(context.TODO(), diskToken)
30 if err != nil {
31 slog.Error("Unable to import GitHub Copilot token", "error", err)
32 return nil, false
33 }
34
35 if err := c.SetProviderAPIKey(string(catwalk.InferenceProviderCopilot), token); err != nil {
36 return token, false
37 }
38
39 if err := cmp.Or(
40 c.SetConfigField("providers.copilot.api_key", token.AccessToken),
41 c.SetConfigField("providers.copilot.oauth", token),
42 ); err != nil {
43 slog.Error("Unable to save GitHub Copilot token to disk", "error", err)
44 }
45
46 slog.Info("GitHub Copilot successfully imported")
47 return token, true
48}