package executor import ( "context" "net/http" "strings" "time" xaiauth "github.com/router-for-me/CLIProxyAPI/v7/internal/auth/xai" "github.com/router-for-me/CLIProxyAPI/v7/internal/runtime/executor/helps" cliproxyauth "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/auth" log "github.com/sirupsen/logrus" ) // Refresh refreshes xAI OAuth credentials using the stored refresh token. func (e *XAIExecutor) Refresh(ctx context.Context, auth *cliproxyauth.Auth) (*cliproxyauth.Auth, error) { log.Debugf("xai executor: refresh called") if refreshed, handled, err := helps.RefreshAuthViaHome(ctx, e.cfg, auth); handled { return refreshed, err } if auth == nil { return nil, statusErr{code: http.StatusInternalServerError, msg: "xai executor: auth is nil"} } refreshToken := xaiMetadataString(auth.Metadata, "refresh_token") if refreshToken == "" { return auth, nil } tokenEndpoint := xaiMetadataString(auth.Metadata, "token_endpoint") svc := xaiauth.NewXAIAuthWithProxyURL(e.cfg, auth.ProxyURL) td, err := svc.RefreshTokens(ctx, refreshToken, tokenEndpoint) if err != nil { return nil, err } if auth.Metadata == nil { auth.Metadata = make(map[string]any) } auth.Metadata["type"] = "xai" auth.Metadata["auth_kind"] = "oauth" auth.Metadata["access_token"] = td.AccessToken if td.RefreshToken != "" { auth.Metadata["refresh_token"] = td.RefreshToken } if td.IDToken != "" { auth.Metadata["id_token"] = td.IDToken } if td.TokenType != "" { auth.Metadata["token_type"] = td.TokenType } if td.ExpiresIn > 0 { auth.Metadata["expires_in"] = td.ExpiresIn } if td.Expire != "" { auth.Metadata["expired"] = td.Expire } if td.Email != "" { auth.Metadata["email"] = td.Email } if td.Subject != "" { auth.Metadata["sub"] = td.Subject } if tokenEndpoint != "" { auth.Metadata["token_endpoint"] = tokenEndpoint } if xaiMetadataString(auth.Metadata, "base_url") == "" { auth.Metadata["base_url"] = xaiauth.DefaultAPIBaseURL } auth.Metadata["last_refresh"] = time.Now().UTC().Format(time.RFC3339) if auth.Attributes == nil { auth.Attributes = make(map[string]string) } auth.Attributes["auth_kind"] = "oauth" if strings.TrimSpace(auth.Attributes["base_url"]) == "" { auth.Attributes["base_url"] = xaiauth.DefaultAPIBaseURL } return auth, nil }