copilot.go

 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}