Pulse/internal/license/features.go

132 lines
3.3 KiB
Go

// Package license handles Pulse Pro license validation and feature gating.
package license
// Feature constants represent gated features in Pulse Pro.
// These are embedded in license JWTs and checked at runtime.
const (
// Pro tier features
FeatureAIPatrol = "ai_patrol" // Background AI health monitoring
FeatureAIAlerts = "ai_alerts" // AI analysis when alerts fire
FeatureAIAutoFix = "ai_autofix" // Automatic remediation
FeatureKubernetesAI = "kubernetes_ai" // AI analysis of K8s (NOT basic monitoring)
// MSP tier features (FUTURE - not in v1 launch)
FeatureMultiUser = "multi_user" // RBAC - NOT IMPLEMENTED YET
FeatureWhiteLabel = "white_label" // Custom branding - NOT IMPLEMENTED YET
FeatureMultiTenant = "multi_tenant" // Multi-tenant - NOT IMPLEMENTED YET
FeatureUnlimited = "unlimited" // Unlimited instances (explicit for contracts)
)
// Tier represents a license tier.
type Tier string
const (
TierFree Tier = "free"
TierPro Tier = "pro"
TierProAnnual Tier = "pro_annual"
TierLifetime Tier = "lifetime"
TierMSP Tier = "msp"
TierEnterprise Tier = "enterprise"
)
// TierFeatures maps each tier to its included features.
var TierFeatures = map[Tier][]string{
TierFree: {
// Free tier has no Pro features, but full monitoring
},
TierPro: {
FeatureAIPatrol,
FeatureAIAlerts,
FeatureAIAutoFix,
FeatureKubernetesAI,
},
TierProAnnual: {
FeatureAIPatrol,
FeatureAIAlerts,
FeatureAIAutoFix,
FeatureKubernetesAI,
},
TierLifetime: {
FeatureAIPatrol,
FeatureAIAlerts,
FeatureAIAutoFix,
FeatureKubernetesAI,
},
TierMSP: {
FeatureAIPatrol,
FeatureAIAlerts,
FeatureAIAutoFix,
FeatureKubernetesAI,
FeatureUnlimited,
// Note: FeatureMultiUser, FeatureWhiteLabel, FeatureMultiTenant
// are on the roadmap but NOT included until implemented
},
TierEnterprise: {
FeatureAIPatrol,
FeatureAIAlerts,
FeatureAIAutoFix,
FeatureKubernetesAI,
FeatureUnlimited,
FeatureMultiUser,
FeatureWhiteLabel,
FeatureMultiTenant,
},
}
// TierHasFeature checks if a tier includes a specific feature.
func TierHasFeature(tier Tier, feature string) bool {
features, ok := TierFeatures[tier]
if !ok {
return false
}
for _, f := range features {
if f == feature {
return true
}
}
return false
}
// GetTierDisplayName returns a human-readable name for the tier.
func GetTierDisplayName(tier Tier) string {
switch tier {
case TierFree:
return "Free"
case TierPro:
return "Pro (Monthly)"
case TierProAnnual:
return "Pro (Annual)"
case TierLifetime:
return "Pro (Lifetime)"
case TierMSP:
return "MSP"
case TierEnterprise:
return "Enterprise"
default:
return "Unknown"
}
}
// GetFeatureDisplayName returns a human-readable name for a feature.
func GetFeatureDisplayName(feature string) string {
switch feature {
case FeatureAIPatrol:
return "AI Patrol (Background Health Checks)"
case FeatureAIAlerts:
return "AI Alert Analysis"
case FeatureAIAutoFix:
return "AI Auto-Fix"
case FeatureKubernetesAI:
return "Kubernetes AI Analysis"
case FeatureMultiUser:
return "Multi-User / RBAC"
case FeatureWhiteLabel:
return "White-Label Branding"
case FeatureMultiTenant:
return "Multi-Tenant Mode"
case FeatureUnlimited:
return "Unlimited Instances"
default:
return feature
}
}