mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-04-28 03:20:11 +00:00
Implements server-side persistence for AI chat sessions, allowing users to continue conversations across devices and browser sessions. Related to #1059. Backend: - Add chat session CRUD API endpoints (GET/PUT/DELETE) - Add persistence layer with per-user session storage - Support session cleanup for old sessions (90 days) - Multi-user support via auth context Frontend: - Rewrite aiChat store with server sync (debounced) - Add session management UI (new conversation, switch, delete) - Local storage as fallback/cache - Initialize sync on app startup when AI is enabled
153 lines
4 KiB
Go
153 lines
4 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 - AI
|
|
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)
|
|
|
|
// Pro tier features - Fleet Management
|
|
FeatureAgentProfiles = "agent_profiles" // Centralized agent configuration profiles
|
|
|
|
// Free tier features - Monitoring
|
|
FeatureUpdateAlerts = "update_alerts" // Alerts for pending container/package updates (free feature)
|
|
|
|
// 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 includes update alerts (container image updates) - basic monitoring feature
|
|
FeatureUpdateAlerts,
|
|
},
|
|
TierPro: {
|
|
FeatureAIPatrol,
|
|
FeatureAIAlerts,
|
|
FeatureAIAutoFix,
|
|
FeatureKubernetesAI,
|
|
FeatureAgentProfiles,
|
|
FeatureUpdateAlerts,
|
|
},
|
|
TierProAnnual: {
|
|
FeatureAIPatrol,
|
|
FeatureAIAlerts,
|
|
FeatureAIAutoFix,
|
|
FeatureKubernetesAI,
|
|
FeatureAgentProfiles,
|
|
FeatureUpdateAlerts,
|
|
},
|
|
TierLifetime: {
|
|
FeatureAIPatrol,
|
|
FeatureAIAlerts,
|
|
FeatureAIAutoFix,
|
|
FeatureKubernetesAI,
|
|
FeatureAgentProfiles,
|
|
FeatureUpdateAlerts,
|
|
},
|
|
TierMSP: {
|
|
FeatureAIPatrol,
|
|
FeatureAIAlerts,
|
|
FeatureAIAutoFix,
|
|
FeatureKubernetesAI,
|
|
FeatureAgentProfiles,
|
|
FeatureUpdateAlerts,
|
|
FeatureUnlimited,
|
|
// Note: FeatureMultiUser, FeatureWhiteLabel, FeatureMultiTenant
|
|
// are on the roadmap but NOT included until implemented
|
|
},
|
|
TierEnterprise: {
|
|
FeatureAIPatrol,
|
|
FeatureAIAlerts,
|
|
FeatureAIAutoFix,
|
|
FeatureKubernetesAI,
|
|
FeatureAgentProfiles,
|
|
FeatureUpdateAlerts,
|
|
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 Intelligence (Monthly)"
|
|
case TierProAnnual:
|
|
return "Pro Intelligence (Annual)"
|
|
case TierLifetime:
|
|
return "Pro Intelligence (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 FeatureUpdateAlerts:
|
|
return "Update Alerts (Container/Package Updates)"
|
|
case FeatureMultiUser:
|
|
return "Multi-User / RBAC"
|
|
case FeatureWhiteLabel:
|
|
return "White-Label Branding"
|
|
case FeatureMultiTenant:
|
|
return "Multi-Tenant Mode"
|
|
case FeatureUnlimited:
|
|
return "Unlimited Instances"
|
|
case FeatureAgentProfiles:
|
|
return "Centralized Agent Profiles"
|
|
default:
|
|
return feature
|
|
}
|
|
}
|