copilot.go 1.2 KB

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