vibesurf 0.1.9a6__py3-none-any.whl → 0.1.11__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 (69) hide show
  1. vibe_surf/_version.py +2 -2
  2. vibe_surf/agents/browser_use_agent.py +68 -45
  3. vibe_surf/agents/prompts/report_writer_prompt.py +73 -0
  4. vibe_surf/agents/prompts/vibe_surf_prompt.py +85 -172
  5. vibe_surf/agents/report_writer_agent.py +380 -226
  6. vibe_surf/agents/vibe_surf_agent.py +878 -814
  7. vibe_surf/agents/views.py +130 -0
  8. vibe_surf/backend/api/activity.py +3 -1
  9. vibe_surf/backend/api/browser.py +70 -0
  10. vibe_surf/backend/api/config.py +8 -5
  11. vibe_surf/backend/api/files.py +59 -50
  12. vibe_surf/backend/api/models.py +2 -2
  13. vibe_surf/backend/api/task.py +47 -13
  14. vibe_surf/backend/database/manager.py +24 -18
  15. vibe_surf/backend/database/queries.py +199 -192
  16. vibe_surf/backend/database/schemas.py +1 -1
  17. vibe_surf/backend/main.py +80 -3
  18. vibe_surf/backend/shared_state.py +30 -35
  19. vibe_surf/backend/utils/encryption.py +3 -1
  20. vibe_surf/backend/utils/llm_factory.py +41 -36
  21. vibe_surf/browser/agent_browser_session.py +308 -62
  22. vibe_surf/browser/browser_manager.py +71 -100
  23. vibe_surf/browser/utils.py +5 -3
  24. vibe_surf/browser/watchdogs/dom_watchdog.py +0 -45
  25. vibe_surf/chrome_extension/background.js +88 -0
  26. vibe_surf/chrome_extension/manifest.json +3 -1
  27. vibe_surf/chrome_extension/scripts/api-client.js +13 -0
  28. vibe_surf/chrome_extension/scripts/file-manager.js +482 -0
  29. vibe_surf/chrome_extension/scripts/history-manager.js +658 -0
  30. vibe_surf/chrome_extension/scripts/modal-manager.js +487 -0
  31. vibe_surf/chrome_extension/scripts/session-manager.js +52 -11
  32. vibe_surf/chrome_extension/scripts/settings-manager.js +1214 -0
  33. vibe_surf/chrome_extension/scripts/ui-manager.js +1530 -3163
  34. vibe_surf/chrome_extension/sidepanel.html +47 -7
  35. vibe_surf/chrome_extension/styles/activity.css +934 -0
  36. vibe_surf/chrome_extension/styles/base.css +76 -0
  37. vibe_surf/chrome_extension/styles/history-modal.css +791 -0
  38. vibe_surf/chrome_extension/styles/input.css +568 -0
  39. vibe_surf/chrome_extension/styles/layout.css +186 -0
  40. vibe_surf/chrome_extension/styles/responsive.css +454 -0
  41. vibe_surf/chrome_extension/styles/settings-environment.css +165 -0
  42. vibe_surf/chrome_extension/styles/settings-forms.css +389 -0
  43. vibe_surf/chrome_extension/styles/settings-modal.css +141 -0
  44. vibe_surf/chrome_extension/styles/settings-profiles.css +244 -0
  45. vibe_surf/chrome_extension/styles/settings-responsive.css +144 -0
  46. vibe_surf/chrome_extension/styles/settings-utilities.css +25 -0
  47. vibe_surf/chrome_extension/styles/variables.css +54 -0
  48. vibe_surf/cli.py +5 -22
  49. vibe_surf/common.py +35 -0
  50. vibe_surf/llm/openai_compatible.py +148 -93
  51. vibe_surf/logger.py +99 -0
  52. vibe_surf/{controller/vibesurf_tools.py → tools/browser_use_tools.py} +233 -221
  53. vibe_surf/tools/file_system.py +415 -0
  54. vibe_surf/{controller → tools}/mcp_client.py +4 -3
  55. vibe_surf/tools/report_writer_tools.py +21 -0
  56. vibe_surf/tools/vibesurf_tools.py +657 -0
  57. vibe_surf/tools/views.py +120 -0
  58. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/METADATA +23 -3
  59. vibesurf-0.1.11.dist-info/RECORD +93 -0
  60. vibe_surf/chrome_extension/styles/main.css +0 -2338
  61. vibe_surf/chrome_extension/styles/settings.css +0 -1100
  62. vibe_surf/controller/file_system.py +0 -53
  63. vibe_surf/controller/views.py +0 -37
  64. vibesurf-0.1.9a6.dist-info/RECORD +0 -71
  65. /vibe_surf/{controller → tools}/__init__.py +0 -0
  66. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/WHEEL +0 -0
  67. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/entry_points.txt +0 -0
  68. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/licenses/LICENSE +0 -0
  69. {vibesurf-0.1.9a6.dist-info → vibesurf-0.1.11.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,568 @@
1
+ /* Input and Control Styles - VibeSurf Extension */
2
+
3
+ /* Control Panel */
4
+ .control-panel {
5
+ padding: var(--spacing-md);
6
+ background-color: var(--bg-secondary);
7
+ border-bottom: 1px solid var(--border-color);
8
+ display: flex;
9
+ gap: var(--spacing-sm);
10
+ align-items: center;
11
+ }
12
+
13
+ .control-btn {
14
+ display: flex;
15
+ align-items: center;
16
+ gap: var(--spacing-xs);
17
+ padding: var(--spacing-sm) var(--spacing-md);
18
+ border: 1px solid var(--border-color);
19
+ border-radius: var(--radius-md);
20
+ background-color: var(--bg-primary);
21
+ color: var(--text-primary);
22
+ font-size: var(--font-size-sm);
23
+ font-weight: var(--font-weight-medium);
24
+ cursor: pointer;
25
+ transition: all var(--transition-fast);
26
+ }
27
+
28
+ .control-btn:hover {
29
+ border-color: var(--border-hover);
30
+ background-color: var(--bg-hover);
31
+ }
32
+
33
+ .control-btn:active {
34
+ transform: scale(0.98);
35
+ }
36
+
37
+ .cancel-btn {
38
+ color: var(--danger-color);
39
+ border-color: var(--danger-color);
40
+ }
41
+
42
+ .cancel-btn:hover {
43
+ background-color: rgba(220, 53, 69, 0.1);
44
+ }
45
+
46
+ .resume-btn {
47
+ color: var(--accent-color);
48
+ border-color: var(--accent-color);
49
+ }
50
+
51
+ .resume-btn:hover {
52
+ background-color: rgba(40, 167, 69, 0.1);
53
+ }
54
+
55
+ .terminate-btn {
56
+ color: var(--danger-color);
57
+ border-color: var(--danger-color);
58
+ }
59
+
60
+ .terminate-btn:hover {
61
+ background-color: rgba(220, 53, 69, 0.1);
62
+ }
63
+
64
+ /* Control Panel Error State */
65
+ .control-panel.error-state {
66
+ background-color: rgba(220, 53, 69, 0.05);
67
+ border-left: 4px solid var(--danger-color);
68
+ border-color: rgba(220, 53, 69, 0.2);
69
+ box-shadow: 0 2px 8px rgba(220, 53, 69, 0.1);
70
+ }
71
+
72
+ .control-panel.error-state::before {
73
+ content: '⚠️ Error occurred - task controls remain available';
74
+ display: block;
75
+ font-size: var(--font-size-xs);
76
+ color: var(--danger-color);
77
+ margin-bottom: var(--spacing-sm);
78
+ padding: var(--spacing-xs) var(--spacing-sm);
79
+ background-color: rgba(220, 53, 69, 0.1);
80
+ border-radius: var(--radius-sm);
81
+ border: 1px solid rgba(220, 53, 69, 0.2);
82
+ font-weight: var(--font-weight-medium);
83
+ }
84
+
85
+ .control-panel.error-state .control-btn {
86
+ border-color: rgba(220, 53, 69, 0.3);
87
+ background-color: rgba(255, 255, 255, 0.9);
88
+ }
89
+
90
+ .control-panel.error-state .control-btn:hover {
91
+ background-color: var(--bg-primary);
92
+ box-shadow: 0 2px 4px rgba(220, 53, 69, 0.2);
93
+ }
94
+
95
+ /* Input Section */
96
+ .input-section {
97
+ background-color: var(--bg-primary);
98
+ border-top: 1px solid var(--border-color);
99
+ padding: var(--spacing-md);
100
+ }
101
+
102
+ .input-container {
103
+ display: flex;
104
+ flex-direction: column;
105
+ gap: var(--spacing-sm);
106
+ }
107
+
108
+ .input-main {
109
+ display: flex;
110
+ flex-direction: column;
111
+ }
112
+
113
+ .textarea-container {
114
+ position: relative;
115
+ display: flex;
116
+ flex-direction: column;
117
+ }
118
+
119
+ .input-footer {
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: flex-start;
123
+ margin-top: calc(var(--spacing-xs) / 2);
124
+ }
125
+
126
+ .llm-select {
127
+ padding: var(--spacing-sm) var(--spacing-md);
128
+ border: 1px solid var(--border-color);
129
+ border-radius: var(--radius-md);
130
+ background-color: var(--bg-primary);
131
+ font-size: var(--font-size-sm);
132
+ color: var(--text-primary);
133
+ cursor: pointer;
134
+ transition: border-color var(--transition-fast);
135
+ min-width: 120px;
136
+ }
137
+
138
+ .llm-select.compact {
139
+ max-width: 100px;
140
+ font-size: var(--font-size-xs);
141
+ padding: var(--spacing-xs) var(--spacing-sm);
142
+ }
143
+
144
+ .llm-select:focus {
145
+ outline: none;
146
+ border-color: var(--primary-color);
147
+ box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.1);
148
+ }
149
+
150
+ .task-input {
151
+ width: 100%;
152
+ padding: var(--spacing-md);
153
+ padding-right: 80px; /* Make space for buttons */
154
+ border: 1px solid var(--border-color);
155
+ border-radius: var(--radius-lg);
156
+ background-color: var(--bg-primary);
157
+ font-size: var(--font-size-sm);
158
+ font-family: inherit;
159
+ line-height: 1.5;
160
+ resize: vertical;
161
+ transition: all var(--transition-fast);
162
+ min-height: 44px;
163
+ max-height: 200px;
164
+ overflow-y: auto;
165
+ }
166
+
167
+ .task-input:focus {
168
+ outline: none;
169
+ border-color: var(--primary-color);
170
+ box-shadow: 0 0 0 3px rgba(0, 122, 204, 0.1);
171
+ }
172
+
173
+ .task-input::placeholder {
174
+ color: var(--text-muted);
175
+ }
176
+
177
+ .input-actions {
178
+ position: absolute;
179
+ right: var(--spacing-sm);
180
+ bottom: var(--spacing-sm);
181
+ display: flex;
182
+ gap: var(--spacing-xs);
183
+ z-index: 1;
184
+ }
185
+
186
+ .send-btn {
187
+ background-color: var(--primary-color);
188
+ border-color: var(--primary-color);
189
+ color: white;
190
+ }
191
+
192
+ .send-btn:hover {
193
+ background-color: var(--primary-hover);
194
+ border-color: var(--primary-hover);
195
+ }
196
+
197
+ .send-btn:disabled {
198
+ background-color: var(--border-color);
199
+ border-color: var(--border-color);
200
+ color: var(--text-muted);
201
+ cursor: not-allowed;
202
+ transform: none;
203
+ opacity: 0.5;
204
+ }
205
+
206
+ /* Task Running Disabled State */
207
+ .task-running-disabled {
208
+ opacity: 0.5 !important;
209
+ cursor: not-allowed !important;
210
+ pointer-events: none !important;
211
+ position: relative;
212
+ }
213
+
214
+ .task-running-disabled::after {
215
+ content: '🔒';
216
+ position: absolute;
217
+ top: 50%;
218
+ right: 8px;
219
+ transform: translateY(-50%);
220
+ font-size: 12px;
221
+ opacity: 0.7;
222
+ pointer-events: none;
223
+ }
224
+
225
+ /* Specific styles for different elements when disabled */
226
+ button.task-running-disabled {
227
+ background-color: #f0f0f0 !important;
228
+ border-color: #ddd !important;
229
+ color: #999 !important;
230
+ }
231
+
232
+ input.task-running-disabled,
233
+ textarea.task-running-disabled,
234
+ select.task-running-disabled {
235
+ background-color: #f9f9f9 !important;
236
+ border-color: #ddd !important;
237
+ color: #999 !important;
238
+ }
239
+
240
+ /* Task status indicator in control panel */
241
+ .control-panel .task-status-indicator {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 8px;
245
+ padding: 8px 12px;
246
+ background: rgba(255, 193, 7, 0.1);
247
+ border: 1px solid rgba(255, 193, 7, 0.3);
248
+ border-radius: 6px;
249
+ font-size: 12px;
250
+ color: #856404;
251
+ margin-bottom: 8px;
252
+ }
253
+
254
+ .control-panel .task-status-indicator::before {
255
+ content: '⚠️';
256
+ font-size: 14px;
257
+ }
258
+
259
+ /* Enhanced warning modal styles */
260
+ .modal-overlay.warning-modal {
261
+ z-index: 15000;
262
+ }
263
+
264
+ .warning-modal .modal-content {
265
+ max-width: 500px;
266
+ background: white;
267
+ border-radius: 12px;
268
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
269
+ }
270
+
271
+ .warning-header {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 12px;
275
+ padding: 20px 20px 0;
276
+ border-bottom: 1px solid #eee;
277
+ margin-bottom: 16px;
278
+ }
279
+
280
+ .warning-icon {
281
+ font-size: 24px;
282
+ }
283
+
284
+ .warning-header h3 {
285
+ margin: 0;
286
+ color: #dc3545;
287
+ font-size: 18px;
288
+ }
289
+
290
+ .warning-body {
291
+ padding: 0 20px 16px;
292
+ }
293
+
294
+ .warning-body p {
295
+ margin: 0 0 12px;
296
+ color: #666;
297
+ line-height: 1.5;
298
+ }
299
+
300
+ .warning-details {
301
+ background: #f8f9fa;
302
+ border: 1px solid #e9ecef;
303
+ border-radius: 4px;
304
+ padding: 12px;
305
+ font-family: monospace;
306
+ font-size: 12px;
307
+ color: #495057;
308
+ white-space: pre-wrap;
309
+ margin: 0;
310
+ }
311
+
312
+ .warning-actions {
313
+ display: flex;
314
+ gap: 8px;
315
+ padding: 16px 20px 20px;
316
+ justify-content: flex-end;
317
+ }
318
+
319
+ .warning-actions .btn {
320
+ padding: 8px 16px;
321
+ border: none;
322
+ border-radius: 6px;
323
+ font-size: 14px;
324
+ cursor: pointer;
325
+ transition: all 0.2s ease;
326
+ }
327
+
328
+ .warning-actions .btn-danger {
329
+ background: #dc3545;
330
+ color: white;
331
+ }
332
+
333
+ .warning-actions .btn-danger:hover {
334
+ background: #c82333;
335
+ }
336
+
337
+ .warning-actions .btn-secondary {
338
+ background: #6c757d;
339
+ color: white;
340
+ }
341
+
342
+ .warning-actions .btn-secondary:hover {
343
+ background: #545b62;
344
+ }
345
+
346
+ .warning-actions .btn-primary {
347
+ background: #007bff;
348
+ color: white;
349
+ }
350
+
351
+ .warning-actions .btn-primary:hover {
352
+ background: #0056b3;
353
+ }
354
+
355
+ /* File Upload Styles */
356
+ .uploaded-files-container {
357
+ margin-top: var(--spacing-sm);
358
+ margin-bottom: var(--spacing-sm);
359
+ padding: var(--spacing-sm);
360
+ background-color: var(--bg-secondary);
361
+ border: 1px solid var(--border-color);
362
+ border-radius: var(--radius-md);
363
+ max-height: 120px;
364
+ overflow-y: auto;
365
+ display: none; /* Hidden by default */
366
+ }
367
+
368
+ .uploaded-files-container .files-items {
369
+ display: flex;
370
+ flex-direction: column;
371
+ gap: var(--spacing-xs);
372
+ }
373
+
374
+ .uploaded-files-container .file-item {
375
+ display: flex;
376
+ align-items: center;
377
+ justify-content: space-between;
378
+ padding: var(--spacing-xs) var(--spacing-sm);
379
+ background-color: var(--bg-primary);
380
+ border: 1px solid var(--border-color);
381
+ border-radius: var(--radius-sm);
382
+ font-size: var(--font-size-sm);
383
+ }
384
+
385
+ .uploaded-files-container .file-name {
386
+ flex: 1;
387
+ color: var(--text-primary);
388
+ font-weight: var(--font-weight-medium);
389
+ overflow: hidden;
390
+ text-overflow: ellipsis;
391
+ white-space: nowrap;
392
+ margin-right: var(--spacing-sm);
393
+ }
394
+
395
+ .uploaded-files-container .file-remove-btn {
396
+ display: flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ width: 20px;
400
+ height: 20px;
401
+ border: none;
402
+ border-radius: var(--radius-sm);
403
+ background-color: var(--danger-color);
404
+ color: white;
405
+ font-size: 14px;
406
+ font-weight: bold;
407
+ cursor: pointer;
408
+ transition: all var(--transition-fast);
409
+ flex-shrink: 0;
410
+ }
411
+
412
+ .uploaded-files-container .file-remove-btn:hover {
413
+ background-color: #c82333;
414
+ transform: scale(1.1);
415
+ }
416
+
417
+ .uploaded-files-container .file-remove-btn:active {
418
+ transform: scale(0.95);
419
+ }
420
+
421
+ .uploaded-files-container .error-message {
422
+ padding: var(--spacing-sm);
423
+ background-color: rgba(220, 53, 69, 0.1);
424
+ border: 1px solid var(--danger-color);
425
+ border-radius: var(--radius-sm);
426
+ color: var(--danger-color);
427
+ font-size: var(--font-size-sm);
428
+ text-align: center;
429
+ }
430
+
431
+ /* Tab Selection Dropdown */
432
+ .tab-selector-dropdown {
433
+ position: fixed !important;
434
+ z-index: 1000;
435
+ background: var(--bg-primary);
436
+ border: 1px solid var(--border-color);
437
+ border-radius: var(--radius-md);
438
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
439
+ max-height: 300px;
440
+ overflow: hidden;
441
+ display: none;
442
+ }
443
+
444
+ .tab-selector-header {
445
+ display: flex;
446
+ align-items: center;
447
+ justify-content: space-between;
448
+ padding: var(--spacing-sm) var(--spacing-md);
449
+ background: var(--bg-secondary);
450
+ border-bottom: 1px solid var(--border-color);
451
+ }
452
+
453
+ .tab-selector-title {
454
+ font-size: var(--font-size-sm);
455
+ font-weight: var(--font-weight-medium);
456
+ color: var(--text-primary);
457
+ }
458
+
459
+ .tab-selector-close {
460
+ width: 24px;
461
+ height: 24px;
462
+ border: none;
463
+ background: none;
464
+ font-size: 18px;
465
+ color: var(--text-muted);
466
+ cursor: pointer;
467
+ border-radius: var(--radius-sm);
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ transition: all var(--transition-fast);
472
+ }
473
+
474
+ .tab-selector-close:hover {
475
+ background: var(--bg-hover);
476
+ color: var(--text-primary);
477
+ }
478
+
479
+ .tab-selector-content {
480
+ max-height: 200px;
481
+ overflow-y: auto;
482
+ padding: var(--spacing-xs);
483
+ }
484
+
485
+ .tab-selector-controls {
486
+ padding: var(--spacing-xs) var(--spacing-sm);
487
+ border-bottom: 1px solid var(--border-color);
488
+ margin-bottom: var(--spacing-xs);
489
+ }
490
+
491
+ .select-all-option {
492
+ font-weight: var(--font-weight-medium);
493
+ color: var(--primary-color);
494
+ }
495
+
496
+ .tab-options-list {
497
+ display: flex;
498
+ flex-direction: column;
499
+ gap: 2px;
500
+ }
501
+
502
+ .tab-option {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: var(--spacing-sm);
506
+ padding: var(--spacing-xs) var(--spacing-sm);
507
+ cursor: pointer;
508
+ border-radius: var(--radius-sm);
509
+ transition: background-color var(--transition-fast);
510
+ }
511
+
512
+ .tab-option:hover {
513
+ background: var(--bg-hover);
514
+ }
515
+
516
+ .tab-option.active-tab {
517
+ background: rgba(144, 238, 144, 0.3);
518
+ border: 1px solid rgba(144, 238, 144, 0.6);
519
+ box-shadow: 0 2px 4px rgba(144, 238, 144, 0.2);
520
+ }
521
+
522
+ .tab-option.active-tab .tab-name {
523
+ color: #2d5a2d;
524
+ font-weight: var(--font-weight-medium);
525
+ }
526
+
527
+ .tab-option.active-tab .tab-id {
528
+ color: #1a4d1a;
529
+ font-weight: var(--font-weight-medium);
530
+ }
531
+
532
+ .tab-radio {
533
+ width: 16px;
534
+ height: 16px;
535
+ cursor: pointer;
536
+ }
537
+
538
+ .tab-name {
539
+ flex: 1;
540
+ font-size: var(--font-size-sm);
541
+ color: var(--text-primary);
542
+ overflow: hidden;
543
+ text-overflow: ellipsis;
544
+ white-space: nowrap;
545
+ }
546
+
547
+ /* Remove footer and buttons for single-select auto-confirm */
548
+
549
+ /* Tab selection indicator in textarea */
550
+ .task-input.has-selected-tabs {
551
+ border-color: var(--primary-color);
552
+ background: rgba(0, 122, 204, 0.02);
553
+ }
554
+
555
+ /* Selected tabs display */
556
+ .selected-tabs-indicator {
557
+ position: absolute;
558
+ bottom: 8px;
559
+ left: 8px;
560
+ background: var(--primary-color);
561
+ color: white;
562
+ padding: 2px 6px;
563
+ border-radius: var(--radius-sm);
564
+ font-size: 10px;
565
+ font-weight: var(--font-weight-medium);
566
+ pointer-events: none;
567
+ z-index: 2;
568
+ }