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
JavaScript
/**
* 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();