// 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 } }