UNPKG

claritykit-svelte

Version:

A comprehensive Svelte component library focused on accessibility, ADHD-optimized design, developer experience, and full SSR compatibility

488 lines (487 loc) 15.6 kB
/** * Configuration Manager for Personal AI Writing Assistant * * Handles user preferences, privacy settings, and personalization options */ export class ConfigurationManager { constructor() { Object.defineProperty(this, "settings", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "colors", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "shortcuts", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "personalizationData", { enumerable: true, configurable: true, writable: true, value: null }); Object.defineProperty(this, "changeListeners", { enumerable: true, configurable: true, writable: true, value: [] }); this.settings = this.loadSettings(); this.colors = this.loadColors(); this.shortcuts = this.loadShortcuts(); this.personalizationData = this.loadPersonalizationData(); } /** * Get current settings */ getSettings() { return { ...this.settings }; } /** * Update settings */ updateSettings(updates) { const previousSettings = { ...this.settings }; this.settings = { ...this.settings, ...updates }; // Validate settings this.validateSettings(); // Save to storage this.saveSettings(); // Notify listeners this.notifyListeners(previousSettings); } /** * Reset settings to defaults */ resetSettings() { this.settings = { ...ConfigurationManager.DEFAULTS }; this.saveSettings(); this.notifyListeners(this.settings); } /** * Get color theme */ getColors() { return { ...this.colors }; } /** * Update color theme */ updateColors(updates) { this.colors = { ...this.colors, ...updates }; this.saveColors(); } /** * Reset colors to defaults */ resetColors() { this.colors = { ...ConfigurationManager.DEFAULT_COLORS }; this.saveColors(); } /** * Get keyboard shortcuts */ getShortcuts() { return { ...this.shortcuts }; } /** * Update keyboard shortcuts */ updateShortcuts(updates) { this.shortcuts = { ...this.shortcuts, ...updates }; this.saveShortcuts(); } /** * Get personalization data */ getPersonalizationData() { return this.personalizationData ? { ...this.personalizationData } : null; } /** * Update personalization data */ updatePersonalizationData(data) { if (this.personalizationData) { this.personalizationData = { ...this.personalizationData, ...data }; } else { this.personalizationData = { userId: 'anonymous', writingPatterns: [], preferredSuggestions: [], dismissedRules: [], acceptanceRates: {}, avgResponseTime: 0, languageLevel: 'intermediate', domainExpertise: [], lastUpdated: new Date(), ...data }; } this.savePersonalizationData(); } /** * Clear personalization data */ clearPersonalizationData() { this.personalizationData = null; this.removeFromStorage('ai_assistant_personalization'); } /** * Generate pipeline configuration from current settings */ getPipelineConfig() { return { endpoint: this.settings.endpoint, apiKey: this.settings.apiKey, provider: this.settings.serviceProvider === 'mcp' ? 'mcp' : this.settings.serviceProvider === 'local' ? 'local' : 'agent', // Pipeline settings debounceDelay: this.settings.analysisDelay, batchSize: 5, maxConcurrentRequests: this.settings.maxConcurrentRequests, // Caching settings cacheSize: 100, cacheTTL: 10 * 60 * 1000, // 10 minutes enablePersistentCache: this.settings.enableCaching, // Analysis settings enabledTypes: this.settings.enabledSuggestionTypes, maxSuggestions: this.settings.maxSuggestions, confidenceThreshold: this.settings.confidenceThreshold, // Personalization enablePersonalization: this.settings.enablePersonalization, learningRate: this.settings.learningRate, // Privacy privacyMode: this.mapPrivacyMode(this.settings.privacyMode), allowTelemetry: this.settings.allowTelemetry, dataRetention: this.settings.dataRetentionDays, // Performance enableStreaming: this.settings.enableStreaming, streamingChunkSize: 1000, enableOfflineMode: this.settings.enableOfflineMode }; } /** * Add change listener */ addChangeListener(listener) { this.changeListeners.push(listener); } /** * Remove change listener */ removeChangeListener(listener) { const index = this.changeListeners.indexOf(listener); if (index >= 0) { this.changeListeners.splice(index, 1); } } /** * Export configuration for backup */ exportConfiguration() { return JSON.stringify({ settings: this.settings, colors: this.colors, shortcuts: this.shortcuts, personalizationData: this.personalizationData, exportedAt: new Date().toISOString(), version: '1.0' }, null, 2); } /** * Import configuration from backup */ importConfiguration(configJson) { try { const config = JSON.parse(configJson); if (config.settings) { this.settings = { ...ConfigurationManager.DEFAULTS, ...config.settings }; this.validateSettings(); this.saveSettings(); } if (config.colors) { this.colors = { ...ConfigurationManager.DEFAULT_COLORS, ...config.colors }; this.saveColors(); } if (config.shortcuts) { this.shortcuts = { ...ConfigurationManager.DEFAULT_SHORTCUTS, ...config.shortcuts }; this.saveShortcuts(); } if (config.personalizationData) { this.personalizationData = config.personalizationData; this.savePersonalizationData(); } this.notifyListeners(this.settings); return true; } catch (error) { console.error('Failed to import configuration:', error); return false; } } /** * Get privacy-compliant settings summary */ getPrivacySummary() { return { dataCollection: { telemetry: this.settings.allowTelemetry, analytics: this.settings.allowTelemetry, personalization: this.settings.enablePersonalization, caching: this.settings.enableCaching }, dataRetention: { days: this.settings.dataRetentionDays, localEncryption: this.settings.encryptLocalData, mode: this.settings.privacyMode }, integrations: { knowledgeGraph: this.settings.enableKnowledgeIntegration, chatContext: this.settings.enableChatContext, collaborative: this.settings.enableCollaborativeAnalysis } }; } /** * Private methods */ loadSettings() { try { const stored = localStorage.getItem(ConfigurationManager.STORAGE_KEY); if (stored) { const parsed = JSON.parse(stored); return { ...ConfigurationManager.DEFAULTS, ...parsed }; } } catch (error) { console.error('Failed to load settings:', error); } return { ...ConfigurationManager.DEFAULTS }; } saveSettings() { try { localStorage.setItem(ConfigurationManager.STORAGE_KEY, JSON.stringify(this.settings)); } catch (error) { console.error('Failed to save settings:', error); } } loadColors() { try { const stored = localStorage.getItem('ai_assistant_colors'); if (stored) { const parsed = JSON.parse(stored); return { ...ConfigurationManager.DEFAULT_COLORS, ...parsed }; } } catch (error) { console.error('Failed to load colors:', error); } return { ...ConfigurationManager.DEFAULT_COLORS }; } saveColors() { try { localStorage.setItem('ai_assistant_colors', JSON.stringify(this.colors)); } catch (error) { console.error('Failed to save colors:', error); } } loadShortcuts() { try { const stored = localStorage.getItem('ai_assistant_shortcuts'); if (stored) { const parsed = JSON.parse(stored); return { ...ConfigurationManager.DEFAULT_SHORTCUTS, ...parsed }; } } catch (error) { console.error('Failed to load shortcuts:', error); } return { ...ConfigurationManager.DEFAULT_SHORTCUTS }; } saveShortcuts() { try { localStorage.setItem('ai_assistant_shortcuts', JSON.stringify(this.shortcuts)); } catch (error) { console.error('Failed to save shortcuts:', error); } } loadPersonalizationData() { try { const stored = localStorage.getItem('ai_assistant_personalization'); if (stored) { const parsed = JSON.parse(stored); // Convert dates back from strings if (parsed.lastUpdated) { parsed.lastUpdated = new Date(parsed.lastUpdated); } if (parsed.writingPatterns) { parsed.writingPatterns.forEach((pattern) => { if (pattern.lastUsed) { pattern.lastUsed = new Date(pattern.lastUsed); } }); } return parsed; } } catch (error) { console.error('Failed to load personalization data:', error); } return null; } savePersonalizationData() { if (!this.personalizationData) return; try { localStorage.setItem('ai_assistant_personalization', JSON.stringify(this.personalizationData)); } catch (error) { console.error('Failed to save personalization data:', error); } } removeFromStorage(key) { try { localStorage.removeItem(key); } catch (error) { console.error(`Failed to remove ${key} from storage:`, error); } } validateSettings() { // Ensure analysis delay is reasonable if (this.settings.analysisDelay < 100 || this.settings.analysisDelay > 5000) { this.settings.analysisDelay = 300; } // Ensure max suggestions is reasonable if (this.settings.maxSuggestions < 1 || this.settings.maxSuggestions > 50) { this.settings.maxSuggestions = 10; } // Ensure confidence threshold is valid if (this.settings.confidenceThreshold < 0 || this.settings.confidenceThreshold > 100) { this.settings.confidenceThreshold = 60; } // Ensure data retention is reasonable if (this.settings.dataRetentionDays < 1 || this.settings.dataRetentionDays > 365) { this.settings.dataRetentionDays = 30; } // Ensure at least one suggestion type is enabled if (this.settings.enabledSuggestionTypes.length === 0) { this.settings.enabledSuggestionTypes = ['grammar', 'style']; } } mapPrivacyMode(mode) { switch (mode) { case 'private': return 'strict'; case 'public': return 'permissive'; case 'local': default: return 'balanced'; } } notifyListeners(settings) { this.changeListeners.forEach(listener => { try { listener(settings); } catch (error) { console.error('Error in settings change listener:', error); } }); } } Object.defineProperty(ConfigurationManager, "STORAGE_KEY", { enumerable: true, configurable: true, writable: true, value: 'ai_assistant_config' }); Object.defineProperty(ConfigurationManager, "DEFAULTS", { enumerable: true, configurable: true, writable: true, value: { // Core settings enabled: true, serviceProvider: 'mcp', // Analysis preferences enabledSuggestionTypes: ['grammar', 'tone', 'clarity', 'style'], analysisDelay: 300, maxSuggestions: 10, confidenceThreshold: 60, // UI preferences showInlineAnnotations: true, showSuggestionPopover: true, animationsEnabled: true, popoverDelay: 500, maxPopoverWidth: 300, // Writing preferences writingStyle: 'casual', tonePreference: ['helpful', 'clear'], languageLevel: 'intermediate', // Privacy settings privacyMode: 'balanced', dataRetentionDays: 30, allowTelemetry: false, encryptLocalData: true, // Performance settings enableStreaming: true, enableCaching: true, enableOfflineMode: false, maxConcurrentRequests: 3, // Integration settings enableKnowledgeIntegration: true, enableChatContext: true, enableCollaborativeAnalysis: false, // Personalization enablePersonalization: true, learningRate: 0.1, adaptToWritingStyle: true, rememberDismissedSuggestions: true } }); Object.defineProperty(ConfigurationManager, "DEFAULT_COLORS", { enumerable: true, configurable: true, writable: true, value: { grammar: '#ef4444', tone: '#f59e0b', clarity: '#06b6d4', facts: '#8b5cf6', style: '#10b981', conciseness: '#f97316', sensitivity: '#ec4899', knowledge: '#6366f1', completion: '#84cc16' } }); Object.defineProperty(ConfigurationManager, "DEFAULT_SHORTCUTS", { enumerable: true, configurable: true, writable: true, value: { toggleAssistant: 'Ctrl+Shift+A', acceptSuggestion: 'Ctrl+Enter', dismissSuggestion: 'Escape', nextSuggestion: 'Ctrl+ArrowDown', previousSuggestion: 'Ctrl+ArrowUp', openSettings: 'Ctrl+Comma' } }); // Singleton instance export const configManager = new ConfigurationManager();