package auth import ( "sync" "time" ) // Credential represents an Anthropic API credential loaded from a JSON file. type Credential struct { ID string Email string AccessToken string RefreshToken string ExpiresAt time.Time FilePath string CooldownUntil time.Time nextRefreshAfter time.Time mu sync.Mutex } // IsExpired returns true if the credential's access token has expired. func (c *Credential) IsExpired() bool { c.mu.Lock() defer c.mu.Unlock() return time.Now().After(c.ExpiresAt) } // IsOnCooldown returns true if the credential is currently on cooldown. func (c *Credential) IsOnCooldown() bool { c.mu.Lock() defer c.mu.Unlock() return time.Now().Before(c.CooldownUntil) } // SetCooldown puts the credential on cooldown for the given duration. func (c *Credential) SetCooldown(duration time.Duration) { c.mu.Lock() defer c.mu.Unlock() c.CooldownUntil = time.Now().Add(duration) } // Token returns the current access token. func (c *Credential) Token() string { c.mu.Lock() defer c.mu.Unlock() return c.AccessToken }