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
@@ -174,6 +174,14 @@
174
174
  </div>
175
175
  </div>
176
176
  <div class="input-actions">
177
+ <button id="voice-record-btn" class="action-btn voice-record-btn" title="Voice Input">
178
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
179
+ <path d="M12 1C10.34 1 9 2.34 9 4V10C9 11.66 10.34 13 12 13C13.66 13 15 11.66 15 10V4C15 2.34 13.66 1 12 1Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
180
+ <path d="M19 10V11C19 14.87 15.87 18 12 18C8.13 18 5 14.87 5 11V10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
181
+ <path d="M12 18V23" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
182
+ <path d="M8 23H16" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
183
+ </svg>
184
+ </button>
177
185
  <button id="attach-file-btn" class="action-btn attach-btn" title="Attach Files">
178
186
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
179
187
  <path d="M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59722 21.9983 8.005 21.9983C6.41278 21.9983 4.88583 21.3658 3.76 20.24C2.63417 19.1142 2.00166 17.5872 2.00166 15.995C2.00166 14.4028 2.63417 12.8758 3.76 11.75L12.33 3.18C13.0806 2.42944 14.0986 2.00696 15.16 2.00696C16.2214 2.00696 17.2394 2.42944 17.99 3.18C18.7406 3.93056 19.163 4.94859 19.163 6.01C19.163 7.07141 18.7406 8.08944 17.99 8.84L10.07 16.76C9.69469 17.1353 9.1897 17.3442 8.665 17.3442C8.1403 17.3442 7.63531 17.1353 7.26 16.76C6.88469 16.3847 6.67581 15.8797 6.67581 15.355C6.67581 14.8303 6.88469 14.3253 7.26 13.95L15.19 6.02" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
@@ -283,32 +291,105 @@
283
291
 
284
292
  <!-- Tab Navigation -->
285
293
  <div class="settings-tabs">
286
- <button class="settings-tab active" data-tab="llm-profiles">
294
+ <button class="settings-tab active" data-tab="general">
295
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 8px;">
296
+ <path d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z" stroke="currentColor" stroke-width="2"/>
297
+ <path d="M19.4 15C19.2669 15.3016 19.2272 15.6362 19.286 15.9606C19.3448 16.285 19.4995 16.5843 19.73 16.82L19.79 16.88C19.976 17.0657 20.1235 17.2863 20.2241 17.5291C20.3248 17.7719 20.3766 18.0322 20.3766 18.295C20.3766 18.5578 20.3248 18.8181 20.2241 19.0609C20.1235 19.3037 19.976 19.5243 19.79 19.71C19.6043 19.896 19.3837 20.0435 19.1409 20.1441C18.8981 20.2448 18.6378 20.2966 18.375 20.2966C18.1122 20.2966 17.8519 20.2448 17.6091 20.1441C17.3663 20.0435 17.1457 19.896 16.96 19.71L16.9 19.65C16.6643 19.4195 16.365 19.2648 16.0406 19.206C15.7162 19.1472 15.3816 19.1869 15.08 19.32C14.7842 19.4468 14.532 19.6572 14.3543 19.9255C14.1766 20.1938 14.0813 20.5082 14.08 20.83V21C14.08 21.5304 13.8693 22.0391 13.4942 22.4142C13.1191 22.7893 12.6104 23 12.08 23C11.5496 23 11.0409 22.7893 10.6658 22.4142C10.2907 22.0391 10.08 21.5304 10.08 21V20.91C10.0723 20.579 9.96512 20.2579 9.77251 19.9887C9.5799 19.7194 9.31074 19.5143 9 19.4C8.69838 19.2669 8.36381 19.2272 8.03941 19.286C7.71502 19.3448 7.41568 19.4995 7.18 19.73L7.12 19.79C6.93425 19.976 6.71368 20.1235 6.47088 20.2241C6.22808 20.3248 5.96783 20.3766 5.705 20.3766C5.44217 20.3766 5.18192 20.3248 4.93912 20.2241C4.69632 20.1235 4.47575 19.976 4.29 19.79C4.10405 19.6043 3.95653 19.3837 3.85588 19.1409C3.75523 18.8981 3.70343 18.6378 3.70343 18.375C3.70343 18.1122 3.75523 17.8519 3.85588 17.6091C3.95653 17.3663 4.10405 17.1457 4.29 16.96L4.35 16.9C4.58054 16.6643 4.73519 16.365 4.794 16.0406C4.85282 15.7162 4.81312 15.3816 4.68 15.08C4.55324 14.7842 4.34276 14.532 4.07447 14.3543C3.80618 14.1766 3.49179 14.0813 3.17 14.08H3C2.46957 14.08 1.96086 13.8693 1.58579 13.4942C1.21071 13.1191 1 12.6104 1 12.08C1 11.5496 1.21071 11.0409 1.58579 10.6658C1.96086 10.2907 2.46957 10.08 3 10.08H3.09C3.42099 10.0723 3.742 9.96512 4.01127 9.77251C4.28053 9.5799 4.48572 9.31074 4.6 9C4.73312 8.69838 4.77282 8.36381 4.714 8.03941C4.65519 7.71502 4.50054 7.41568 4.27 7.18L4.21 7.12C4.02405 6.93425 3.87653 6.71368 3.77588 6.47088C3.67523 6.22808 3.62343 5.96783 3.62343 5.705C3.62343 5.44217 3.67523 5.18192 3.77588 4.93912C3.87653 4.69632 4.02405 4.47575 4.21 4.29C4.39575 4.10405 4.61632 3.95653 4.85912 3.85588C5.10192 3.75523 5.36217 3.70343 5.625 3.70343C5.88783 3.70343 6.14808 3.75523 6.39088 3.85588C6.63368 3.95653 6.85425 4.10405 7.04 4.29L7.1 4.35C7.33568 4.58054 7.63502 4.73519 7.95941 4.794C8.28381 4.85282 8.61838 4.81312 8.92 4.68H9C9.29577 4.55324 9.54802 4.34276 9.72569 4.07447C9.90337 3.80618 9.99872 3.49179 10 3.17V3C10 2.46957 10.2107 1.96086 10.5858 1.58579C10.9609 1.21071 11.4696 1 12 1C12.5304 1 13.0391 1.21071 13.4142 1.58579C13.7893 1.96086 14 2.46957 14 3V3.09C14.0013 3.41179 14.0966 3.72618 14.2743 3.99447C14.452 4.26276 14.7042 4.47324 15 4.6C15.3016 4.73312 15.6362 4.77282 15.9606 4.714C16.285 4.65519 16.5843 4.50054 16.82 4.27L16.88 4.21C17.0657 4.02405 17.2863 3.87653 17.5291 3.77588C17.7719 3.67523 18.0322 3.62343 18.295 3.62343C18.5578 3.62343 18.8181 3.67523 19.0609 3.77588C19.3037 3.87653 19.5243 4.02405 19.71 4.21C19.896 4.39575 20.0435 4.61632 20.1441 4.85912C20.2448 5.10192 20.2966 5.36217 20.2966 5.625C20.2966 5.88783 20.2448 6.14808 20.1441 6.39088C20.0435 6.63368 19.896 6.85425 19.71 7.04L19.65 7.1C19.4195 7.33568 19.2648 7.63502 19.206 7.95941C19.1472 8.28381 19.1869 8.61838 19.32 8.92V9C19.4468 9.29577 19.6572 9.54802 19.9255 9.72569C20.1938 9.90337 20.5082 9.99872 20.83 10H21C21.5304 10 22.0391 10.2107 22.4142 10.5858C22.7893 10.9609 23 11.4696 23 12C23 12.5304 22.7893 13.0391 22.4142 13.4142C22.0391 13.7893 21.5304 14 21 14H20.91C20.5882 14.0013 20.2738 14.0966 20.0055 14.2743C19.7372 14.452 19.5268 14.7042 19.4 15Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
298
+ </svg>
299
+ General
300
+ </button>
301
+ <button class="settings-tab" data-tab="llm-profiles">
287
302
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 8px;">
288
303
  <path d="M12 2L2 7L12 12L22 7L12 2Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
289
304
  <path d="M2 17L12 22L22 17" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
290
305
  <path d="M2 12L12 17L22 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
291
306
  </svg>
292
- LLM Profiles
307
+ LLM
293
308
  </button>
294
309
  <button class="settings-tab" data-tab="mcp-profiles">
295
310
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 8px;">
296
311
  <path d="M13 2L3 14H12L11 22L21 10H12L13 2Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
297
312
  </svg>
298
- MCP Profiles
313
+ MCP
299
314
  </button>
300
- <button class="settings-tab" data-tab="environment">
315
+ <button class="settings-tab" data-tab="voice-profiles">
301
316
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right: 8px;">
302
- <path d="M12 3C16.97 3 21 7.03 21 12S16.97 21 12 21S3 16.97 3 12S7.03 3 12 3ZM12 8C9.79 8 8 9.79 8 12S9.79 16 12 16S16 14.21 16 12S14.21 8 12 8Z" fill="currentColor"/>
317
+ <path d="M19 14C19 18.5 15.5 22 11 22C6.5 22 3 18.5 3 14V12C3 7.5 6.5 4 11 4S19 7.5 19 12V14ZM11 8C8.8 8 7 9.8 7 12V14C7 16.2 8.8 18 11 18S15 16.2 15 14V12C15 9.8 13.2 8 11 8Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
318
+ <circle cx="11" cy="11" r="2" stroke="currentColor" stroke-width="2"/>
303
319
  </svg>
304
- Environment
320
+ Voice
305
321
  </button>
306
322
  </div>
307
323
 
308
324
  <!-- Tab Content -->
309
325
  <div class="settings-content">
326
+ <!-- General Tab -->
327
+ <div id="general-tab" class="settings-tab-content active">
328
+ <div class="general-sections">
329
+ <!-- General Settings Section -->
330
+ <div class="general-section">
331
+ <div class="section-header">
332
+ <h3>General Settings</h3>
333
+ <p class="section-description">Configure application-wide settings</p>
334
+ </div>
335
+ <div class="general-settings-content">
336
+ <div class="form-group">
337
+ <label class="form-label">Application Theme</label>
338
+ <select class="form-select" id="theme-select">
339
+ <option value="auto">Auto (System)</option>
340
+ <option value="light">Light</option>
341
+ <option value="dark">Dark</option>
342
+ </select>
343
+ <div class="form-help">Choose your preferred theme</div>
344
+ </div>
345
+ <div class="form-group">
346
+ <label class="form-label">Default ASR Profile</label>
347
+ <select class="form-select" id="default-asr-select">
348
+ <option value="">No ASR profile selected</option>
349
+ </select>
350
+ <div class="form-help">Default voice recognition profile for speech-to-text</div>
351
+ </div>
352
+ <div class="form-group">
353
+ <label class="form-label">Default TTS Profile</label>
354
+ <select class="form-select" id="default-tts-select">
355
+ <option value="">No TTS profile selected</option>
356
+ </select>
357
+ <div class="form-help">Default text-to-speech profile for voice output</div>
358
+ </div>
359
+ </div>
360
+ </div>
361
+
362
+ <!-- Environment Variables Section -->
363
+ <div class="general-section">
364
+ <div class="section-header">
365
+ <h3>Environment Variables</h3>
366
+ <p class="section-description">Manage environment variables for the application</p>
367
+ </div>
368
+ <div class="env-variables-container">
369
+ <div class="form-group">
370
+ <label class="form-label">Environment Variables</label>
371
+ <div id="env-variables-list">
372
+ <!-- Environment variables will be populated here -->
373
+ </div>
374
+ </div>
375
+ <div class="env-var-actions-center">
376
+ <button id="save-env-vars-btn" class="save-env-vars-btn-compact">
377
+ <div class="btn-icon">
378
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
379
+ <path d="M19 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H16L21 8V19C21 19.5304 20.7893 20.0391 20.4142 20.4142C20.0391 20.7893 19.5304 21 19 21Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
380
+ <path d="M17 21V13H7V21M7 3V8H15" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
381
+ </svg>
382
+ </div>
383
+ <span class="btn-text">Update Variables</span>
384
+ </button>
385
+ </div>
386
+ </div>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
310
391
  <!-- LLM Profiles Tab -->
311
- <div id="llm-profiles-tab" class="settings-tab-content active">
392
+ <div id="llm-profiles-tab" class="settings-tab-content">
312
393
  <div id="llm-profiles-container" class="profiles-container">
313
394
  <div id="llm-profiles-list" class="profiles-list">
314
395
  <!-- LLM profiles will be populated here -->
@@ -318,7 +399,7 @@
318
399
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
319
400
  <path d="M12 4V20M4 12H20" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
320
401
  </svg>
321
- Add LLM Profile
402
+ Add LLM
322
403
  </button>
323
404
  </div>
324
405
 
@@ -333,31 +414,23 @@
333
414
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
334
415
  <path d="M12 4V20M4 12H20" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
335
416
  </svg>
336
- Add MCP Profile
417
+ Add MCP
337
418
  </button>
338
419
  </div>
339
420
 
340
- <!-- Environment Variables Tab -->
341
- <div id="environment-tab" class="settings-tab-content">
342
- <div class="env-variables-container">
343
- <div class="form-group">
344
- <label class="form-label">Environment Variables</label>
345
- <div id="env-variables-list">
346
- <!-- Environment variables will be populated here -->
347
- </div>
348
- </div>
349
- <div class="env-var-actions-center">
350
- <button id="save-env-vars-btn" class="save-env-vars-btn-modern">
351
- <div class="btn-icon">
352
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
353
- <path d="M19 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H16L21 8V19C21 19.5304 20.7893 20.0391 20.4142 20.4142C20.0391 20.7893 19.5304 21 19 21Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
354
- <path d="M17 21V13H7V21M7 3V8H15" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
355
- </svg>
356
- </div>
357
- <span class="btn-text">Update Variables</span>
358
- </button>
421
+ <!-- Voice Profiles Tab -->
422
+ <div id="voice-profiles-tab" class="settings-tab-content">
423
+ <div id="voice-profiles-container" class="profiles-container">
424
+ <div id="voice-profiles-list" class="profiles-list">
425
+ <!-- Voice profiles will be populated here -->
359
426
  </div>
360
427
  </div>
428
+ <button id="add-voice-profile-btn" class="add-profile-btn">
429
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
430
+ <path d="M12 4V20M4 12H20" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
431
+ </svg>
432
+ Add Voice
433
+ </button>
361
434
  </div>
362
435
  </div>
363
436
  </div>
@@ -367,7 +440,7 @@
367
440
  <div id="profile-form-modal" class="profile-form-modal hidden">
368
441
  <div class="profile-form-container">
369
442
  <div class="profile-form-header">
370
- <h3 id="profile-form-title">Add LLM Profile</h3>
443
+ <h3 id="profile-form-title">Add LLM</h3>
371
444
  <button class="profile-form-close">
372
445
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
373
446
  <path d="M6 6L18 18M6 18L18 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
@@ -397,6 +470,10 @@
397
470
  <script src="scripts/markdown-it.min.js"></script>
398
471
  <script src="scripts/api-client.js"></script>
399
472
  <script src="scripts/session-manager.js"></script>
473
+ <!-- User Settings Storage (must load before managers) -->
474
+ <script src="scripts/user-settings-storage.js"></script>
475
+ <!-- Voice Recording -->
476
+ <script src="scripts/voice-recorder.js"></script>
400
477
  <!-- Specialized UI Managers -->
401
478
  <script src="scripts/modal-manager.js"></script>
402
479
  <script src="scripts/settings-manager.js"></script>
@@ -860,4 +860,39 @@
860
860
  background-color: var(--bg-tertiary);
861
861
  color: var(--text-muted);
862
862
  border-color: var(--border-color);
863
+ }
864
+
865
+ /* Voice recording disabled state */
866
+ .voice-disabled {
867
+ opacity: 0.5;
868
+ cursor: not-allowed !important;
869
+ filter: grayscale(100%);
870
+ position: relative;
871
+ }
872
+
873
+ .voice-disabled::after {
874
+ content: '🔇';
875
+ position: absolute;
876
+ top: 50%;
877
+ left: 50%;
878
+ transform: translate(-50%, -50%);
879
+ font-size: 12px;
880
+ opacity: 0.8;
881
+ }
882
+
883
+ .voice-disabled:hover {
884
+ opacity: 0.5;
885
+ filter: grayscale(100%);
886
+ }
887
+
888
+ /* Task running disabled state (existing) */
889
+ .task-running-disabled {
890
+ opacity: 0.5;
891
+ cursor: not-allowed !important;
892
+ filter: grayscale(100%);
893
+ }
894
+
895
+ .task-running-disabled:hover {
896
+ opacity: 0.5;
897
+ filter: grayscale(100%);
863
898
  }
@@ -129,8 +129,8 @@
129
129
  border: 1px solid var(--border-color);
130
130
  border-radius: var(--radius-md);
131
131
  background-color: var(--bg-primary);
132
- font-size: var(--font-size-sm);
133
132
  color: var(--text-primary);
133
+ font-size: var(--font-size-sm);
134
134
  cursor: pointer;
135
135
  transition: border-color var(--transition-fast);
136
136
  min-width: 120px;
@@ -162,6 +162,7 @@
162
162
  border: 1px solid var(--border-color);
163
163
  border-radius: var(--radius-lg);
164
164
  background-color: var(--bg-primary);
165
+ color: var(--text-primary);
165
166
  font-size: var(--font-size-sm);
166
167
  font-family: inherit;
167
168
  line-height: 1.5;
@@ -479,4 +480,166 @@ select.task-running-disabled {
479
480
  font-weight: var(--font-weight-medium);
480
481
  pointer-events: none;
481
482
  z-index: 2;
483
+ }
484
+
485
+ /* Voice Recording Button Styles */
486
+ .voice-record-btn {
487
+ background-color: var(--bg-primary);
488
+ border-color: var(--border-color);
489
+ color: var(--text-primary);
490
+ transition: all var(--transition-fast);
491
+ }
492
+
493
+ .voice-record-btn:hover {
494
+ border-color: var(--primary-color);
495
+ background-color: var(--bg-hover);
496
+ color: var(--primary-color);
497
+ }
498
+
499
+ .voice-record-btn.recording {
500
+ background-color: var(--danger-color);
501
+ border-color: var(--danger-color);
502
+ color: white;
503
+ animation: pulse-recording 1.5s infinite;
504
+ }
505
+
506
+ .voice-record-btn.recording:hover {
507
+ background-color: #c82333;
508
+ border-color: #c82333;
509
+ }
510
+
511
+ /* Recording pulse animation */
512
+ @keyframes pulse-recording {
513
+ 0% {
514
+ box-shadow: 0 0 0 0 rgba(220, 53, 69, 0.7);
515
+ }
516
+ 70% {
517
+ box-shadow: 0 0 0 10px rgba(220, 53, 69, 0);
518
+ }
519
+ 100% {
520
+ box-shadow: 0 0 0 0 rgba(220, 53, 69, 0);
521
+ }
522
+ }
523
+
524
+ /* Disabled state for voice recording */
525
+ .voice-record-btn:disabled {
526
+ opacity: 0.5;
527
+ cursor: not-allowed;
528
+ background-color: var(--border-color);
529
+ border-color: var(--border-color);
530
+ color: var(--text-muted);
531
+ animation: none;
532
+ }
533
+
534
+ /* Task running disabled state for voice recording */
535
+ .voice-record-btn.task-running-disabled {
536
+ opacity: 0.6;
537
+ cursor: not-allowed;
538
+ background-color: var(--bg-tertiary);
539
+ border-color: var(--border-color);
540
+ color: var(--text-muted);
541
+ animation: none;
542
+ position: relative;
543
+ }
544
+
545
+ .voice-record-btn.task-running-disabled:hover {
546
+ background-color: var(--bg-tertiary);
547
+ border-color: var(--border-color);
548
+ color: var(--text-muted);
549
+ transform: none;
550
+ }
551
+
552
+ /* Add lock icon for task running disabled state */
553
+ .voice-record-btn.task-running-disabled::before {
554
+ content: '🔒';
555
+ position: absolute;
556
+ top: 50%;
557
+ left: 50%;
558
+ transform: translate(-50%, -50%);
559
+ font-size: 16px;
560
+ opacity: 0.8;
561
+ z-index: 1;
562
+ }
563
+
564
+ .voice-record-btn.task-running-disabled .recording-status {
565
+ display: none;
566
+ }
567
+
568
+ /* Recording status indicator */
569
+ .recording-status {
570
+ position: absolute;
571
+ top: -8px;
572
+ right: -8px;
573
+ width: 8px;
574
+ height: 8px;
575
+ background-color: var(--danger-color);
576
+ border-radius: 50%;
577
+ animation: pulse-dot 1s infinite;
578
+ }
579
+
580
+ @keyframes pulse-dot {
581
+ 0% {
582
+ transform: scale(0.8);
583
+ opacity: 1;
584
+ }
585
+ 50% {
586
+ transform: scale(1.2);
587
+ opacity: 0.7;
588
+ }
589
+ 100% {
590
+ transform: scale(0.8);
591
+ opacity: 1;
592
+ }
593
+ }
594
+
595
+ /* Voice recording tooltip */
596
+ .voice-record-btn::after {
597
+ content: attr(data-tooltip);
598
+ position: absolute;
599
+ bottom: 100%;
600
+ left: 50%;
601
+ transform: translateX(-50%);
602
+ background-color: var(--bg-secondary);
603
+ color: var(--text-primary);
604
+ padding: 4px 8px;
605
+ border-radius: var(--radius-sm);
606
+ font-size: 12px;
607
+ white-space: nowrap;
608
+ opacity: 0;
609
+ visibility: hidden;
610
+ transition: all var(--transition-fast);
611
+ pointer-events: none;
612
+ border: 1px solid var(--border-color);
613
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
614
+ z-index: 1000;
615
+ }
616
+
617
+ .voice-record-btn:hover::after {
618
+ opacity: 1;
619
+ visibility: visible;
620
+ transform: translateX(-50%) translateY(-4px);
621
+ }
622
+
623
+ /* Recording duration display */
624
+ .recording-duration {
625
+ position: absolute;
626
+ top: -20px;
627
+ left: 50%;
628
+ transform: translateX(-50%);
629
+ background-color: var(--danger-color);
630
+ color: white;
631
+ padding: 2px 6px;
632
+ border-radius: var(--radius-sm);
633
+ font-size: 10px;
634
+ font-weight: var(--font-weight-medium);
635
+ white-space: nowrap;
636
+ opacity: 0;
637
+ visibility: hidden;
638
+ transition: all var(--transition-fast);
639
+ pointer-events: none;
640
+ }
641
+
642
+ .voice-record-btn.recording .recording-duration {
643
+ opacity: 1;
644
+ visibility: visible;
482
645
  }
@@ -9,7 +9,7 @@
9
9
  min-width: 320px;
10
10
  background-color: var(--bg-primary);
11
11
  resize: horizontal;
12
- overflow: auto;
12
+ overflow: hidden;
13
13
  }
14
14
 
15
15
  /* Header */
@@ -162,4 +162,142 @@
162
162
 
163
163
  .save-env-vars-btn-modern:disabled::before {
164
164
  display: none;
165
+ }
166
+
167
+ /* Compact Button for General Tab */
168
+ .save-env-vars-btn-compact {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 8px;
172
+ padding: 8px 16px;
173
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
174
+ color: white;
175
+ border: none;
176
+ border-radius: 8px;
177
+ font-size: 14px;
178
+ font-weight: 500;
179
+ cursor: pointer;
180
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
181
+ box-shadow: 0 2px 8px rgba(0, 122, 204, 0.15);
182
+ position: relative;
183
+ overflow: hidden;
184
+ }
185
+
186
+ .save-env-vars-btn-compact::before {
187
+ content: '';
188
+ position: absolute;
189
+ top: 0;
190
+ left: -100%;
191
+ width: 100%;
192
+ height: 100%;
193
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
194
+ transition: left 0.5s ease;
195
+ }
196
+
197
+ .save-env-vars-btn-compact:hover {
198
+ transform: translateY(-1px);
199
+ box-shadow: 0 4px 16px rgba(0, 122, 204, 0.25);
200
+ background: linear-gradient(135deg, var(--primary-hover), var(--primary-color));
201
+ }
202
+
203
+ .save-env-vars-btn-compact:hover::before {
204
+ left: 100%;
205
+ }
206
+
207
+ .save-env-vars-btn-compact:active {
208
+ transform: translateY(0);
209
+ box-shadow: 0 2px 8px rgba(0, 122, 204, 0.15);
210
+ }
211
+
212
+ .save-env-vars-btn-compact .btn-icon {
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ width: 16px;
217
+ height: 16px;
218
+ }
219
+
220
+ .save-env-vars-btn-compact .btn-text {
221
+ font-weight: 500;
222
+ letter-spacing: 0.3px;
223
+ }
224
+
225
+ .save-env-vars-btn-compact:disabled {
226
+ opacity: 0.6;
227
+ cursor: not-allowed;
228
+ transform: none !important;
229
+ box-shadow: 0 2px 8px rgba(0, 122, 204, 0.1) !important;
230
+ }
231
+
232
+ .save-env-vars-btn-compact:disabled::before {
233
+ display: none;
234
+ }
235
+
236
+ /* General Tab Sections Layout */
237
+ .general-sections {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 20px;
241
+ }
242
+
243
+ .general-section {
244
+ background: var(--bg-secondary);
245
+ border: 1px solid var(--border-color);
246
+ border-radius: 12px;
247
+ padding: 20px;
248
+ transition: all 0.3s ease;
249
+ }
250
+
251
+ .general-section:hover {
252
+ border-color: var(--border-hover);
253
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
254
+ }
255
+
256
+ .general-section .section-header {
257
+ margin-bottom: 16px;
258
+ padding-bottom: 12px;
259
+ border-bottom: 1px solid var(--border-color);
260
+ }
261
+
262
+ .general-section .section-header h3 {
263
+ font-size: 18px;
264
+ font-weight: 600;
265
+ color: var(--text-primary);
266
+ margin: 0 0 8px 0;
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 8px;
270
+ }
271
+
272
+ .general-section .section-description {
273
+ font-size: 14px;
274
+ color: var(--text-secondary);
275
+ margin: 0;
276
+ line-height: 1.5;
277
+ }
278
+
279
+ .general-settings-content {
280
+ display: flex;
281
+ flex-direction: column;
282
+ gap: 16px;
283
+ }
284
+
285
+ /* Responsive adjustments for general sections */
286
+ @media (max-width: 768px) {
287
+ .general-section {
288
+ padding: 16px;
289
+ }
290
+
291
+ .general-sections {
292
+ gap: 16px;
293
+ }
294
+
295
+ .general-section .section-header h3 {
296
+ font-size: 16px;
297
+ }
298
+
299
+ .general-section .section-header {
300
+ margin-bottom: 12px;
301
+ padding-bottom: 8px;
302
+ }
165
303
  }
@@ -343,16 +343,16 @@
343
343
  align-items: center;
344
344
  gap: 4px;
345
345
  padding: 2px 6px;
346
- background: #f0f0f0;
347
- border: 1px solid #d0d0d0;
346
+ background: var(--bg-secondary);
347
+ border: 1px solid var(--border-color);
348
348
  border-radius: 12px;
349
349
  font-size: 11px;
350
- color: #555;
350
+ color: var(--text-secondary);
351
351
  max-width: 150px;
352
352
  }
353
353
 
354
354
  .file-item:hover {
355
- background: #e8e8e8;
355
+ background: var(--bg-hover);
356
356
  }
357
357
 
358
358
  .file-name {
@@ -364,8 +364,8 @@
364
364
  }
365
365
 
366
366
  .file-remove-btn {
367
- background: #999;
368
- color: white;
367
+ background: var(--text-muted);
368
+ color: var(--bg-primary);
369
369
  border: none;
370
370
  border-radius: 50%;
371
371
  width: 14px;
@@ -381,7 +381,7 @@
381
381
  }
382
382
 
383
383
  .file-remove-btn:hover {
384
- background: #666;
384
+ background: var(--text-secondary);
385
385
  }
386
386
 
387
387
  .file-remove-btn:active {