copilot.go

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