package service import ( "encoding/json" "time" ) type WindsurfCredentials struct { Email string `json:"email,omitempty"` APIKey string `json:"api_key,omitempty"` RefreshToken string `json:"refresh_token,omitempty"` IDToken string `json:"id_token,omitempty"` SessionToken string `json:"session_token,omitempty"` Auth1Token string `json:"auth1_token,omitempty"` APIServerURL string `json:"api_server_url,omitempty"` AuthMethod string `json:"auth_method,omitempty"` Tier string `json:"tier,omitempty"` ExpiresAt string `json:"expires_at,omitempty"` RegisteredAt string `json:"registered_at,omitempty"` LastRefreshAt string `json:"last_refresh_at,omitempty"` LastReregisterAt string `json:"last_reregister_at,omitempty"` LastErrorCode string `json:"last_error_code,omitempty"` TokenVersion int64 `json:"_token_version,omitempty"` } type WindsurfExtra struct { Profile WindsurfProfileSnapshot `json:"profile,omitempty"` UserStatus WindsurfUserStatusSnapshot `json:"user_status,omitempty"` Quota WindsurfQuotaSnapshot `json:"quota,omitempty"` Refresh WindsurfRefreshState `json:"refresh,omitempty"` Probe WindsurfProbeState `json:"probe,omitempty"` Capabilities map[string]WindsurfModelCapability `json:"capabilities,omitempty"` ModelMatrix map[string]WindsurfModelAvail `json:"model_matrix,omitempty"` LSBinding WindsurfLSBinding `json:"ls_binding,omitempty"` } type WindsurfLSBinding struct { ContainerID string `json:"container_id,omitempty"` ContainerName string `json:"container_name,omitempty"` Host string `json:"host,omitempty"` Port int `json:"port,omitempty"` } type WindsurfProfileSnapshot struct { UserID string `json:"user_id,omitempty"` TeamID string `json:"team_id,omitempty"` Email string `json:"email,omitempty"` DisplayName string `json:"display_name,omitempty"` PlanName string `json:"plan_name,omitempty"` TeamsTier string `json:"teams_tier,omitempty"` TierSource string `json:"tier_source,omitempty"` TrialEndAt string `json:"trial_end_at,omitempty"` IsTeams bool `json:"is_teams,omitempty"` IsEnterprise bool `json:"is_enterprise,omitempty"` } type WindsurfUserStatusSnapshot struct { AllowedModels []WindsurfAllowedModel `json:"allowed_models,omitempty"` MonthlyPromptCredits int64 `json:"monthly_prompt_credits,omitempty"` MonthlyFlowCredits int64 `json:"monthly_flow_credits,omitempty"` UserUsedPromptCredits int64 `json:"user_used_prompt_credits,omitempty"` UserUsedFlowCredits int64 `json:"user_used_flow_credits,omitempty"` MaxPremiumChatMessages int64 `json:"max_premium_chat_messages,omitempty"` LastFetchedAt string `json:"last_fetched_at,omitempty"` } type WindsurfAllowedModel struct { ModelKey string `json:"model_key,omitempty"` ModelEnum int32 `json:"model_enum,omitempty"` ModelUID string `json:"model_uid,omitempty"` Alias string `json:"alias,omitempty"` CreditMultiplier float64 `json:"credit_multiplier,omitempty"` } type WindsurfQuotaSnapshot struct { DailyPercent *float64 `json:"daily_percent,omitempty"` WeeklyPercent *float64 `json:"weekly_percent,omitempty"` PromptUsed *float64 `json:"prompt_used,omitempty"` PromptLimit *float64 `json:"prompt_limit,omitempty"` FlexUsed *float64 `json:"flex_used,omitempty"` FlexLimit *float64 `json:"flex_limit,omitempty"` LastCheckedAt string `json:"last_checked_at,omitempty"` LastError string `json:"last_error,omitempty"` } type WindsurfRefreshState struct { LastTokenRefreshAt string `json:"last_token_refresh_at,omitempty"` LastStatusRefreshAt string `json:"last_status_refresh_at,omitempty"` TokenRefreshFailures int `json:"token_refresh_failures,omitempty"` StatusRefreshFailures int `json:"status_refresh_failures,omitempty"` } type WindsurfProbeState struct { LastProbeAt string `json:"last_probe_at,omitempty"` LastCanaryAt string `json:"last_canary_at,omitempty"` LastProbeError string `json:"last_probe_error,omitempty"` ModelCatalogEtag string `json:"model_catalog_etag,omitempty"` ModelCatalogAt string `json:"model_catalog_at,omitempty"` } type WindsurfModelCapability struct { Available bool `json:"available"` Mode string `json:"mode,omitempty"` Reason string `json:"reason,omitempty"` CheckedAt string `json:"checked_at,omitempty"` } type WindsurfModelAvail struct { Visible bool `json:"visible"` Available bool `json:"available"` Blocked bool `json:"blocked"` Mode string `json:"mode,omitempty"` Source string `json:"source,omitempty"` } func LoadWindsurfCredentials(m map[string]any) WindsurfCredentials { data, _ := json.Marshal(m) var creds WindsurfCredentials _ = json.Unmarshal(data, &creds) return creds } func StoreWindsurfCredentials(creds WindsurfCredentials) map[string]any { data, _ := json.Marshal(creds) var m map[string]any _ = json.Unmarshal(data, &m) return m } func LoadWindsurfExtra(m map[string]any) WindsurfExtra { data, _ := json.Marshal(m) var extra WindsurfExtra _ = json.Unmarshal(data, &extra) return extra } func StoreWindsurfExtra(extra WindsurfExtra) map[string]any { data, _ := json.Marshal(extra) var m map[string]any _ = json.Unmarshal(data, &m) return m } func (c *WindsurfCredentials) IsExpired() bool { if c.ExpiresAt == "" { return false } t, err := time.Parse(time.RFC3339, c.ExpiresAt) if err != nil { return false } return time.Now().After(t) } func (c *WindsurfCredentials) NeedsRefresh(beforeExpiry time.Duration) bool { if c.ExpiresAt == "" || c.RefreshToken == "" { return false } t, err := time.Parse(time.RFC3339, c.ExpiresAt) if err != nil { return false } return time.Now().Add(beforeExpiry).After(t) } func WindsurfBaseRPM(tier string, cfg struct{ RPMPro, RPMFree, RPMUnknown, RPMExpired int }) int { switch tier { case "pro": return cfg.RPMPro case "free": return cfg.RPMFree case "expired": return cfg.RPMExpired default: return cfg.RPMUnknown } }