vibesurf 0.1.19__py3-none-any.whl → 0.1.21__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vibesurf might be problematic. Click here for more details.

Files changed (42) hide show
  1. vibe_surf/_version.py +2 -2
  2. vibe_surf/agents/report_writer_agent.py +1 -1
  3. vibe_surf/backend/api/task.py +1 -1
  4. vibe_surf/backend/api/voices.py +481 -0
  5. vibe_surf/backend/database/migrations/v003_fix_task_status_case.sql +11 -0
  6. vibe_surf/backend/database/migrations/v004_add_voice_profiles.sql +35 -0
  7. vibe_surf/backend/database/models.py +38 -1
  8. vibe_surf/backend/database/queries.py +189 -1
  9. vibe_surf/backend/main.py +2 -0
  10. vibe_surf/backend/shared_state.py +1 -1
  11. vibe_surf/backend/voice_model_config.py +25 -0
  12. vibe_surf/browser/agen_browser_profile.py +2 -0
  13. vibe_surf/browser/agent_browser_session.py +3 -3
  14. vibe_surf/chrome_extension/background.js +224 -9
  15. vibe_surf/chrome_extension/content.js +147 -0
  16. vibe_surf/chrome_extension/manifest.json +11 -2
  17. vibe_surf/chrome_extension/permission-iframe.html +38 -0
  18. vibe_surf/chrome_extension/permission-request.html +104 -0
  19. vibe_surf/chrome_extension/scripts/api-client.js +61 -0
  20. vibe_surf/chrome_extension/scripts/main.js +8 -2
  21. vibe_surf/chrome_extension/scripts/permission-iframe-request.js +188 -0
  22. vibe_surf/chrome_extension/scripts/permission-request.js +118 -0
  23. vibe_surf/chrome_extension/scripts/settings-manager.js +690 -3
  24. vibe_surf/chrome_extension/scripts/ui-manager.js +730 -119
  25. vibe_surf/chrome_extension/scripts/user-settings-storage.js +422 -0
  26. vibe_surf/chrome_extension/scripts/voice-recorder.js +514 -0
  27. vibe_surf/chrome_extension/sidepanel.html +106 -29
  28. vibe_surf/chrome_extension/styles/components.css +35 -0
  29. vibe_surf/chrome_extension/styles/input.css +164 -1
  30. vibe_surf/chrome_extension/styles/layout.css +1 -1
  31. vibe_surf/chrome_extension/styles/settings-environment.css +138 -0
  32. vibe_surf/chrome_extension/styles/settings-forms.css +7 -7
  33. vibe_surf/chrome_extension/styles/variables.css +51 -0
  34. vibe_surf/tools/voice_asr.py +125 -0
  35. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/METADATA +9 -12
  36. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/RECORD +40 -31
  37. vibe_surf/chrome_extension/icons/convert-svg.js +0 -33
  38. vibe_surf/chrome_extension/icons/logo-preview.html +0 -187
  39. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/WHEEL +0 -0
  40. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/entry_points.txt +0 -0
  41. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/licenses/LICENSE +0 -0
  42. {vibesurf-0.1.19.dist-info → vibesurf-0.1.21.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,422 @@
1
+ // User Settings Storage Manager - Unified local storage management for user settings
2
+ // Supports Chrome extension storage API and localStorage with unified settings interface
3
+
4
+ class VibeSurfUserSettingsStorage {
5
+ constructor() {
6
+ this.storageKeys = {
7
+ // Chrome storage keys
8
+ userSettings: 'vibesurf-user-settings',
9
+
10
+ // LocalStorage keys (for backward compatibility)
11
+ theme: 'vibesurf-theme',
12
+ defaultAsr: 'vibesurf-default-asr',
13
+ defaultTts: 'vibesurf-default-tts',
14
+
15
+ // New setting keys
16
+ selectedLlmProfile: 'vibesurf-selected-llm-profile',
17
+ selectedAgentMode: 'vibesurf-selected-agent-mode'
18
+ };
19
+
20
+ // Default settings
21
+ this.defaultSettings = {
22
+ // General settings
23
+ theme: 'auto',
24
+ defaultAsr: '',
25
+ defaultTts: '',
26
+
27
+ // UI state settings
28
+ selectedLlmProfile: '',
29
+ selectedAgentMode: 'thinking',
30
+
31
+ // Additional settings can be extended here
32
+ lastSessionId: '',
33
+ rememberSelections: true,
34
+ autoSaveSettings: true
35
+ };
36
+
37
+ this.eventListeners = new Map();
38
+ this.isInitialized = false;
39
+ }
40
+
41
+ // Initialize the storage manager
42
+ async initialize() {
43
+ try {
44
+ console.log('[UserSettingsStorage] Initializing user settings storage...');
45
+
46
+ // Check if this is first run and migrate existing settings if needed
47
+ await this.migrateExistingSettings();
48
+
49
+ // Ensure all default settings exist
50
+ await this.ensureDefaultSettings();
51
+
52
+ this.isInitialized = true;
53
+ console.log('[UserSettingsStorage] User settings storage initialized successfully');
54
+
55
+ this.emit('initialized', await this.getAllSettings());
56
+ } catch (error) {
57
+ console.error('[UserSettingsStorage] Failed to initialize:', error);
58
+ throw error;
59
+ }
60
+ }
61
+
62
+ // Migrate existing localStorage settings to unified storage
63
+ async migrateExistingSettings() {
64
+ try {
65
+ console.log('[UserSettingsStorage] Checking for existing settings to migrate...');
66
+
67
+ const existingSettings = {};
68
+
69
+ // Check and migrate existing localStorage settings
70
+ const localStorageKeys = [
71
+ { old: this.storageKeys.theme, new: 'theme' },
72
+ { old: this.storageKeys.defaultAsr, new: 'defaultAsr' },
73
+ { old: this.storageKeys.defaultTts, new: 'defaultTts' }
74
+ ];
75
+
76
+ localStorageKeys.forEach(({ old, new: newKey }) => {
77
+ const value = localStorage.getItem(old);
78
+ if (value !== null) {
79
+ existingSettings[newKey] = value;
80
+ console.log(`[UserSettingsStorage] Found existing ${newKey}:`, value);
81
+ }
82
+ });
83
+
84
+ // If there are existing settings, merge them with current Chrome storage
85
+ if (Object.keys(existingSettings).length > 0) {
86
+ console.log('[UserSettingsStorage] Migrating existing settings:', existingSettings);
87
+
88
+ // Get current Chrome storage settings to preserve them
89
+ const currentSettings = await this.getAllSettings();
90
+
91
+ // Merge localStorage settings with existing Chrome storage (don't overwrite)
92
+ const mergedSettings = { ...currentSettings };
93
+
94
+ // Only migrate localStorage values if they don't already exist in Chrome storage
95
+ Object.keys(existingSettings).forEach(key => {
96
+ if (!(key in mergedSettings)) {
97
+ mergedSettings[key] = existingSettings[key];
98
+ console.log(`[UserSettingsStorage] Migrated ${key}:`, existingSettings[key]);
99
+ }
100
+ });
101
+
102
+ // Save merged settings only if something was actually migrated
103
+ if (Object.keys(mergedSettings).length !== Object.keys(currentSettings).length) {
104
+ await this.saveSettings(mergedSettings);
105
+ console.log('[UserSettingsStorage] Migration completed successfully');
106
+ }
107
+ }
108
+ } catch (error) {
109
+ console.warn('[UserSettingsStorage] Failed to migrate existing settings:', error);
110
+ }
111
+ }
112
+
113
+ // Ensure all default settings exist
114
+ async ensureDefaultSettings() {
115
+ try {
116
+ const currentSettings = await this.getAllSettings();
117
+ const mergedSettings = { ...this.defaultSettings, ...currentSettings };
118
+
119
+ // Only save if there are missing settings
120
+ if (Object.keys(currentSettings).length !== Object.keys(mergedSettings).length) {
121
+ await this.saveSettings(mergedSettings);
122
+ console.log('[UserSettingsStorage] Default settings ensured');
123
+ }
124
+ } catch (error) {
125
+ console.error('[UserSettingsStorage] Failed to ensure default settings:', error);
126
+ }
127
+ }
128
+
129
+ // Get all settings from storage
130
+ async getAllSettings() {
131
+ try {
132
+ if (chrome && chrome.storage && chrome.storage.local) {
133
+ // Use Chrome storage API with proper promise wrapping
134
+ const result = await new Promise((resolve, reject) => {
135
+ chrome.storage.local.get(this.storageKeys.userSettings, (result) => {
136
+ if (chrome.runtime.lastError) {
137
+ reject(new Error(chrome.runtime.lastError.message));
138
+ } else {
139
+ resolve(result);
140
+ }
141
+ });
142
+ });
143
+ return result[this.storageKeys.userSettings] || {};
144
+ } else {
145
+
146
+ // Fallback to localStorage
147
+ const stored = localStorage.getItem(this.storageKeys.userSettings);
148
+ const settings = stored ? JSON.parse(stored) : {};
149
+ return settings;
150
+ }
151
+ } catch (error) {
152
+ console.error('[UserSettingsStorage] Failed to get all settings:', error);
153
+ // Fallback to localStorage if Chrome storage fails
154
+ try {
155
+ const stored = localStorage.getItem(this.storageKeys.userSettings);
156
+ const settings = stored ? JSON.parse(stored) : {};
157
+ return settings;
158
+ } catch (fallbackError) {
159
+ console.error('[UserSettingsStorage] localStorage fallback also failed:', fallbackError);
160
+ return {};
161
+ }
162
+ }
163
+ }
164
+
165
+ // Save settings to storage
166
+ async saveSettings(settings) {
167
+ try {
168
+ if (chrome && chrome.storage && chrome.storage.local) {
169
+ // Get current settings first to merge
170
+ const currentSettings = await this.getAllSettings();
171
+ const mergedSettings = { ...currentSettings, ...settings };
172
+
173
+ // Use Chrome storage API with proper promise wrapping
174
+ await new Promise((resolve, reject) => {
175
+ chrome.storage.local.set({ [this.storageKeys.userSettings]: mergedSettings }, () => {
176
+ if (chrome.runtime.lastError) {
177
+ reject(new Error(chrome.runtime.lastError.message));
178
+ } else {
179
+ resolve();
180
+ }
181
+ });
182
+ });
183
+
184
+ this.emit('settingsChanged', mergedSettings);
185
+ return mergedSettings;
186
+ } else {
187
+ // Fallback to localStorage
188
+ const currentSettings = await this.getAllSettings();
189
+ const mergedSettings = { ...currentSettings, ...settings };
190
+ localStorage.setItem(this.storageKeys.userSettings, JSON.stringify(mergedSettings));
191
+ this.emit('settingsChanged', mergedSettings);
192
+ return mergedSettings;
193
+ }
194
+ } catch (error) {
195
+ console.error('[UserSettingsStorage] Failed to save settings:', error);
196
+ // Fallback to localStorage if Chrome storage fails
197
+ try {
198
+ const currentSettings = await this.getAllSettings();
199
+ const mergedSettings = { ...currentSettings, ...settings };
200
+ localStorage.setItem(this.storageKeys.userSettings, JSON.stringify(mergedSettings));
201
+ this.emit('settingsChanged', mergedSettings);
202
+ return mergedSettings;
203
+ } catch (fallbackError) {
204
+ console.error('[UserSettingsStorage] localStorage fallback save also failed:', fallbackError);
205
+ throw error; // Throw original error
206
+ }
207
+ }
208
+ }
209
+
210
+ // Get a specific setting value
211
+ async getSetting(key) {
212
+ try {
213
+ const allSettings = await this.getAllSettings();
214
+ return allSettings[key] !== undefined ? allSettings[key] : this.defaultSettings[key];
215
+ } catch (error) {
216
+ console.error(`[UserSettingsStorage] Failed to get setting ${key}:`, error);
217
+ return this.defaultSettings[key];
218
+ }
219
+ }
220
+
221
+ // Set a specific setting value
222
+ async setSetting(key, value) {
223
+ try {
224
+ const allSettings = await this.getAllSettings();
225
+ allSettings[key] = value;
226
+ await this.saveSettings(allSettings);
227
+
228
+ console.log(`[UserSettingsStorage] Setting updated: ${key} = ${value}`);
229
+ this.emit('settingChanged', { key, value, allSettings });
230
+ } catch (error) {
231
+ console.error(`[UserSettingsStorage] Failed to set setting ${key}:`, error);
232
+ throw error;
233
+ }
234
+ }
235
+
236
+ // Update multiple settings at once
237
+ async updateSettings(updates) {
238
+ try {
239
+ const allSettings = await this.getAllSettings();
240
+ const updatedSettings = { ...allSettings, ...updates };
241
+ await this.saveSettings(updatedSettings);
242
+
243
+ console.log('[UserSettingsStorage] Multiple settings updated:', updates);
244
+ this.emit('settingsUpdated', { updates, allSettings: updatedSettings });
245
+ } catch (error) {
246
+ console.error('[UserSettingsStorage] Failed to update settings:', error);
247
+ throw error;
248
+ }
249
+ }
250
+
251
+ // Remove a setting
252
+ async removeSetting(key) {
253
+ try {
254
+ const allSettings = await this.getAllSettings();
255
+ delete allSettings[key];
256
+ await this.saveSettings(allSettings);
257
+
258
+ console.log(`[UserSettingsStorage] Setting removed: ${key}`);
259
+ this.emit('settingRemoved', { key, allSettings });
260
+ } catch (error) {
261
+ console.error(`[UserSettingsStorage] Failed to remove setting ${key}:`, error);
262
+ throw error;
263
+ }
264
+ }
265
+
266
+ // Clear all settings (reset to defaults)
267
+ async clearAllSettings() {
268
+ try {
269
+ await this.saveSettings(this.defaultSettings);
270
+ console.log('[UserSettingsStorage] All settings cleared, reset to defaults');
271
+ this.emit('settingsCleared', this.defaultSettings);
272
+ } catch (error) {
273
+ console.error('[UserSettingsStorage] Failed to clear settings:', error);
274
+ throw error;
275
+ }
276
+ }
277
+
278
+ // Specific methods for commonly used settings
279
+
280
+ // Theme settings
281
+ async getTheme() {
282
+ return await this.getSetting('theme');
283
+ }
284
+
285
+ async setTheme(theme) {
286
+ await this.setSetting('theme', theme);
287
+ // Also update localStorage for backward compatibility
288
+ localStorage.setItem(this.storageKeys.theme, theme);
289
+ }
290
+
291
+ // LLM Profile settings
292
+ async getSelectedLlmProfile() {
293
+ return await this.getSetting('selectedLlmProfile');
294
+ }
295
+
296
+ async setSelectedLlmProfile(profileName) {
297
+ await this.setSetting('selectedLlmProfile', profileName);
298
+ }
299
+
300
+ // Agent Mode settings
301
+ async getSelectedAgentMode() {
302
+ return await this.getSetting('selectedAgentMode');
303
+ }
304
+
305
+ async setSelectedAgentMode(mode) {
306
+ await this.setSetting('selectedAgentMode', mode);
307
+ console.log('[UserSettingsStorage] Setting updated: selectedAgentMode =', mode);
308
+ }
309
+
310
+ // Default Voice settings
311
+ async getDefaultAsr() {
312
+ return await this.getSetting('defaultAsr');
313
+ }
314
+
315
+ async setDefaultAsr(asrProfile) {
316
+ await this.setSetting('defaultAsr', asrProfile);
317
+ // Also update localStorage for backward compatibility
318
+ localStorage.setItem(this.storageKeys.defaultAsr, asrProfile);
319
+ }
320
+
321
+ async getDefaultTts() {
322
+ return await this.getSetting('defaultTts');
323
+ }
324
+
325
+ async setDefaultTts(ttsProfile) {
326
+ await this.setSetting('defaultTts', ttsProfile);
327
+ // Also update localStorage for backward compatibility
328
+ localStorage.setItem(this.storageKeys.defaultTts, ttsProfile);
329
+ }
330
+
331
+ // Event system for components to listen to setting changes
332
+ on(event, callback) {
333
+ if (!this.eventListeners.has(event)) {
334
+ this.eventListeners.set(event, []);
335
+ }
336
+ this.eventListeners.get(event).push(callback);
337
+ }
338
+
339
+ off(event, callback) {
340
+ if (this.eventListeners.has(event)) {
341
+ const listeners = this.eventListeners.get(event);
342
+ const index = listeners.indexOf(callback);
343
+ if (index > -1) {
344
+ listeners.splice(index, 1);
345
+ }
346
+ }
347
+ }
348
+
349
+ emit(event, data) {
350
+ if (this.eventListeners.has(event)) {
351
+ this.eventListeners.get(event).forEach(callback => {
352
+ try {
353
+ callback(data);
354
+ } catch (error) {
355
+ console.error(`[UserSettingsStorage] Event callback error for ${event}:`, error);
356
+ }
357
+ });
358
+ }
359
+ }
360
+
361
+ // Export settings for backup
362
+ async exportSettings() {
363
+ try {
364
+ const allSettings = await this.getAllSettings();
365
+ return {
366
+ version: '1.0',
367
+ timestamp: new Date().toISOString(),
368
+ settings: allSettings
369
+ };
370
+ } catch (error) {
371
+ console.error('[UserSettingsStorage] Failed to export settings:', error);
372
+ throw error;
373
+ }
374
+ }
375
+
376
+ // Import settings from backup
377
+ async importSettings(exportedData) {
378
+ try {
379
+ if (!exportedData || !exportedData.settings) {
380
+ throw new Error('Invalid settings data');
381
+ }
382
+
383
+ await this.saveSettings(exportedData.settings);
384
+ console.log('[UserSettingsStorage] Settings imported successfully');
385
+ return true;
386
+ } catch (error) {
387
+ console.error('[UserSettingsStorage] Failed to import settings:', error);
388
+ throw error;
389
+ }
390
+ }
391
+
392
+ // Get storage info
393
+ async getStorageInfo() {
394
+ try {
395
+ const allSettings = await this.getAllSettings();
396
+ const settingsSize = JSON.stringify(allSettings).length;
397
+
398
+ return {
399
+ isInitialized: this.isInitialized,
400
+ settingsCount: Object.keys(allSettings).length,
401
+ estimatedSize: settingsSize,
402
+ storageType: (chrome && chrome.storage && chrome.storage.local) ? 'chrome.storage.local' : 'localStorage',
403
+ lastUpdated: allSettings.lastUpdated || null
404
+ };
405
+ } catch (error) {
406
+ console.error('[UserSettingsStorage] Failed to get storage info:', error);
407
+ return null;
408
+ }
409
+ }
410
+
411
+ // Destroy the storage manager
412
+ destroy() {
413
+ this.eventListeners.clear();
414
+ this.isInitialized = false;
415
+ console.log('[UserSettingsStorage] Storage manager destroyed');
416
+ }
417
+ }
418
+
419
+ // Export for use in other modules
420
+ if (typeof window !== 'undefined') {
421
+ window.VibeSurfUserSettingsStorage = VibeSurfUserSettingsStorage;
422
+ }