vibesurf 0.1.0__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 (70) hide show
  1. vibe_surf/__init__.py +12 -0
  2. vibe_surf/_version.py +34 -0
  3. vibe_surf/agents/__init__.py +0 -0
  4. vibe_surf/agents/browser_use_agent.py +1106 -0
  5. vibe_surf/agents/prompts/__init__.py +1 -0
  6. vibe_surf/agents/prompts/vibe_surf_prompt.py +176 -0
  7. vibe_surf/agents/report_writer_agent.py +360 -0
  8. vibe_surf/agents/vibe_surf_agent.py +1632 -0
  9. vibe_surf/backend/__init__.py +0 -0
  10. vibe_surf/backend/api/__init__.py +3 -0
  11. vibe_surf/backend/api/activity.py +243 -0
  12. vibe_surf/backend/api/config.py +740 -0
  13. vibe_surf/backend/api/files.py +322 -0
  14. vibe_surf/backend/api/models.py +257 -0
  15. vibe_surf/backend/api/task.py +300 -0
  16. vibe_surf/backend/database/__init__.py +13 -0
  17. vibe_surf/backend/database/manager.py +129 -0
  18. vibe_surf/backend/database/models.py +164 -0
  19. vibe_surf/backend/database/queries.py +922 -0
  20. vibe_surf/backend/database/schemas.py +100 -0
  21. vibe_surf/backend/llm_config.py +182 -0
  22. vibe_surf/backend/main.py +137 -0
  23. vibe_surf/backend/migrations/__init__.py +16 -0
  24. vibe_surf/backend/migrations/init_db.py +303 -0
  25. vibe_surf/backend/migrations/seed_data.py +236 -0
  26. vibe_surf/backend/shared_state.py +601 -0
  27. vibe_surf/backend/utils/__init__.py +7 -0
  28. vibe_surf/backend/utils/encryption.py +164 -0
  29. vibe_surf/backend/utils/llm_factory.py +225 -0
  30. vibe_surf/browser/__init__.py +8 -0
  31. vibe_surf/browser/agen_browser_profile.py +130 -0
  32. vibe_surf/browser/agent_browser_session.py +416 -0
  33. vibe_surf/browser/browser_manager.py +296 -0
  34. vibe_surf/browser/utils.py +790 -0
  35. vibe_surf/browser/watchdogs/__init__.py +0 -0
  36. vibe_surf/browser/watchdogs/action_watchdog.py +291 -0
  37. vibe_surf/browser/watchdogs/dom_watchdog.py +954 -0
  38. vibe_surf/chrome_extension/background.js +558 -0
  39. vibe_surf/chrome_extension/config.js +48 -0
  40. vibe_surf/chrome_extension/content.js +284 -0
  41. vibe_surf/chrome_extension/dev-reload.js +47 -0
  42. vibe_surf/chrome_extension/icons/convert-svg.js +33 -0
  43. vibe_surf/chrome_extension/icons/logo-preview.html +187 -0
  44. vibe_surf/chrome_extension/icons/logo.png +0 -0
  45. vibe_surf/chrome_extension/manifest.json +53 -0
  46. vibe_surf/chrome_extension/popup.html +134 -0
  47. vibe_surf/chrome_extension/scripts/api-client.js +473 -0
  48. vibe_surf/chrome_extension/scripts/main.js +491 -0
  49. vibe_surf/chrome_extension/scripts/markdown-it.min.js +3 -0
  50. vibe_surf/chrome_extension/scripts/session-manager.js +599 -0
  51. vibe_surf/chrome_extension/scripts/ui-manager.js +3687 -0
  52. vibe_surf/chrome_extension/sidepanel.html +347 -0
  53. vibe_surf/chrome_extension/styles/animations.css +471 -0
  54. vibe_surf/chrome_extension/styles/components.css +670 -0
  55. vibe_surf/chrome_extension/styles/main.css +2307 -0
  56. vibe_surf/chrome_extension/styles/settings.css +1100 -0
  57. vibe_surf/cli.py +357 -0
  58. vibe_surf/controller/__init__.py +0 -0
  59. vibe_surf/controller/file_system.py +53 -0
  60. vibe_surf/controller/mcp_client.py +68 -0
  61. vibe_surf/controller/vibesurf_controller.py +616 -0
  62. vibe_surf/controller/views.py +37 -0
  63. vibe_surf/llm/__init__.py +21 -0
  64. vibe_surf/llm/openai_compatible.py +237 -0
  65. vibesurf-0.1.0.dist-info/METADATA +97 -0
  66. vibesurf-0.1.0.dist-info/RECORD +70 -0
  67. vibesurf-0.1.0.dist-info/WHEEL +5 -0
  68. vibesurf-0.1.0.dist-info/entry_points.txt +2 -0
  69. vibesurf-0.1.0.dist-info/licenses/LICENSE +201 -0
  70. vibesurf-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,284 @@
1
+ // Content Script - VibeSurf Extension
2
+ // Runs in the context of web pages and can interact with page content
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ // Avoid running multiple times
8
+ if (window.vibeSurfContentLoaded) {
9
+ return;
10
+ }
11
+ window.vibeSurfContentLoaded = true;
12
+
13
+ console.log('[VibeSurf Content] Content script loaded on:', window.location.href);
14
+
15
+ class VibeSurfContent {
16
+ constructor() {
17
+ this.initialized = false;
18
+ this.pageContext = null;
19
+ this.setupMessageListener();
20
+ this.collectPageContext();
21
+ }
22
+
23
+ setupMessageListener() {
24
+ // Listen for messages from background script or side panel
25
+ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
26
+ console.log('[VibeSurf Content] Received message:', message.type);
27
+
28
+ switch (message.type) {
29
+ case 'GET_PAGE_CONTEXT':
30
+ sendResponse(this.getPageContext());
31
+ break;
32
+
33
+ case 'SCROLL_TO_ELEMENT':
34
+ this.scrollToElement(message.data?.selector);
35
+ sendResponse({ success: true });
36
+ break;
37
+
38
+ case 'HIGHLIGHT_ELEMENT':
39
+ this.highlightElement(message.data?.selector);
40
+ sendResponse({ success: true });
41
+ break;
42
+
43
+ case 'GET_PAGE_TEXT':
44
+ sendResponse({ text: this.getPageText() });
45
+ break;
46
+
47
+ case 'GET_PAGE_LINKS':
48
+ sendResponse({ links: this.getPageLinks() });
49
+ break;
50
+
51
+ case 'CLICK_ELEMENT':
52
+ const clickResult = this.clickElement(message.data?.selector);
53
+ sendResponse(clickResult);
54
+ break;
55
+
56
+ default:
57
+ console.warn('[VibeSurf Content] Unknown message type:', message.type);
58
+ }
59
+ });
60
+ }
61
+
62
+ collectPageContext() {
63
+ this.pageContext = {
64
+ url: window.location.href,
65
+ title: document.title,
66
+ domain: window.location.hostname,
67
+ timestamp: Date.now(),
68
+ meta: this.getPageMeta(),
69
+ hasForm: document.querySelector('form') !== null,
70
+ hasTable: document.querySelector('table') !== null,
71
+ linkCount: document.querySelectorAll('a[href]').length,
72
+ imageCount: document.querySelectorAll('img').length,
73
+ inputCount: document.querySelectorAll('input, textarea, select').length
74
+ };
75
+ }
76
+
77
+ getPageContext() {
78
+ // Refresh context data
79
+ this.collectPageContext();
80
+ return this.pageContext;
81
+ }
82
+
83
+ getPageMeta() {
84
+ const meta = {};
85
+
86
+ // Get meta tags
87
+ const metaTags = document.querySelectorAll('meta');
88
+ metaTags.forEach(tag => {
89
+ const name = tag.getAttribute('name') || tag.getAttribute('property');
90
+ const content = tag.getAttribute('content');
91
+ if (name && content) {
92
+ meta[name] = content;
93
+ }
94
+ });
95
+
96
+ return meta;
97
+ }
98
+
99
+ getPageText() {
100
+ // Get main content text, excluding scripts and styles
101
+ const walker = document.createTreeWalker(
102
+ document.body,
103
+ NodeFilter.SHOW_TEXT,
104
+ {
105
+ acceptNode: function(node) {
106
+ const parent = node.parentElement;
107
+ if (parent && (
108
+ parent.tagName === 'SCRIPT' ||
109
+ parent.tagName === 'STYLE' ||
110
+ parent.tagName === 'NOSCRIPT'
111
+ )) {
112
+ return NodeFilter.FILTER_REJECT;
113
+ }
114
+ return NodeFilter.FILTER_ACCEPT;
115
+ }
116
+ }
117
+ );
118
+
119
+ let text = '';
120
+ let node;
121
+ while (node = walker.nextNode()) {
122
+ const textContent = node.textContent.trim();
123
+ if (textContent) {
124
+ text += textContent + ' ';
125
+ }
126
+ }
127
+
128
+ return text.trim();
129
+ }
130
+
131
+ getPageLinks() {
132
+ const links = [];
133
+ const linkElements = document.querySelectorAll('a[href]');
134
+
135
+ linkElements.forEach((link, index) => {
136
+ const href = link.getAttribute('href');
137
+ const text = link.textContent.trim();
138
+
139
+ if (href && text) {
140
+ links.push({
141
+ index,
142
+ href: this.resolveURL(href),
143
+ text,
144
+ title: link.getAttribute('title') || '',
145
+ target: link.getAttribute('target') || '_self'
146
+ });
147
+ }
148
+ });
149
+
150
+ return links;
151
+ }
152
+
153
+ resolveURL(url) {
154
+ try {
155
+ return new URL(url, window.location.href).href;
156
+ } catch (error) {
157
+ return url;
158
+ }
159
+ }
160
+
161
+ scrollToElement(selector) {
162
+ try {
163
+ const element = document.querySelector(selector);
164
+ if (element) {
165
+ element.scrollIntoView({
166
+ behavior: 'smooth',
167
+ block: 'center'
168
+ });
169
+ return true;
170
+ }
171
+ } catch (error) {
172
+ console.error('[VibeSurf Content] Scroll error:', error);
173
+ }
174
+ return false;
175
+ }
176
+
177
+ highlightElement(selector) {
178
+ try {
179
+ // Remove previous highlights
180
+ this.removeHighlights();
181
+
182
+ const element = document.querySelector(selector);
183
+ if (element) {
184
+ // Add highlight styling
185
+ element.style.outline = '3px solid #007acc';
186
+ element.style.outlineOffset = '2px';
187
+ element.setAttribute('data-vibesurf-highlight', 'true');
188
+
189
+ // Auto-remove highlight after 5 seconds
190
+ setTimeout(() => {
191
+ this.removeHighlights();
192
+ }, 5000);
193
+
194
+ return true;
195
+ }
196
+ } catch (error) {
197
+ console.error('[VibeSurf Content] Highlight error:', error);
198
+ }
199
+ return false;
200
+ }
201
+
202
+ removeHighlights() {
203
+ const highlighted = document.querySelectorAll('[data-vibesurf-highlight]');
204
+ highlighted.forEach(element => {
205
+ element.style.outline = '';
206
+ element.style.outlineOffset = '';
207
+ element.removeAttribute('data-vibesurf-highlight');
208
+ });
209
+ }
210
+
211
+ clickElement(selector) {
212
+ try {
213
+ const element = document.querySelector(selector);
214
+ if (element) {
215
+ // Scroll to element first
216
+ element.scrollIntoView({
217
+ behavior: 'smooth',
218
+ block: 'center'
219
+ });
220
+
221
+ // Wait a bit for scroll, then click
222
+ setTimeout(() => {
223
+ element.click();
224
+ }, 500);
225
+
226
+ return { success: true, message: 'Element clicked' };
227
+ } else {
228
+ return { success: false, message: 'Element not found' };
229
+ }
230
+ } catch (error) {
231
+ console.error('[VibeSurf Content] Click error:', error);
232
+ return { success: false, message: error.message };
233
+ }
234
+ }
235
+
236
+ // Utility method to send context updates to background
237
+ sendContextUpdate() {
238
+ try {
239
+ chrome.runtime.sendMessage({
240
+ type: 'PAGE_CONTEXT_UPDATE',
241
+ data: this.getPageContext()
242
+ });
243
+ } catch (error) {
244
+ // Silently handle errors (extension might be reloading)
245
+ }
246
+ }
247
+ }
248
+
249
+ // Initialize content script
250
+ const vibeSurfContent = new VibeSurfContent();
251
+
252
+ // Send initial context when page loads
253
+ if (document.readyState === 'loading') {
254
+ document.addEventListener('DOMContentLoaded', () => {
255
+ vibeSurfContent.sendContextUpdate();
256
+ });
257
+ } else {
258
+ vibeSurfContent.sendContextUpdate();
259
+ }
260
+
261
+ // Send context updates on navigation
262
+ let lastUrl = window.location.href;
263
+ const observer = new MutationObserver(() => {
264
+ if (window.location.href !== lastUrl) {
265
+ lastUrl = window.location.href;
266
+ vibeSurfContent.collectPageContext();
267
+ vibeSurfContent.sendContextUpdate();
268
+ }
269
+ });
270
+
271
+ observer.observe(document.body, {
272
+ childList: true,
273
+ subtree: true
274
+ });
275
+
276
+ // Cleanup on page unload
277
+ window.addEventListener('beforeunload', () => {
278
+ vibeSurfContent.removeHighlights();
279
+ observer.disconnect();
280
+ });
281
+
282
+ console.log('[VibeSurf Content] Content script initialized');
283
+
284
+ })();
@@ -0,0 +1,47 @@
1
+ // Development Auto-Reload Script for VibeSurf Extension
2
+ // This script enables automatic reloading when files change
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ // Only run in development mode
8
+ if (typeof chrome !== 'undefined' && chrome.runtime && chrome.runtime.getManifest) {
9
+ const manifest = chrome.runtime.getManifest();
10
+
11
+ // Check if this is a development extension (unpacked)
12
+ const isDevelopment = !('update_url' in manifest);
13
+
14
+ if (isDevelopment) {
15
+ console.log('[VibeSurf Dev] Auto-reload enabled');
16
+
17
+ // Check for file changes every 2 seconds
18
+ setInterval(() => {
19
+ fetch(chrome.runtime.getURL('manifest.json'))
20
+ .then(response => response.text())
21
+ .then(content => {
22
+ const currentTime = new Date().getTime();
23
+ const storageKey = 'vibesurf_last_reload';
24
+
25
+ chrome.storage.local.get([storageKey], (result) => {
26
+ const lastReload = result[storageKey] || 0;
27
+
28
+ // Check if manifest was modified (simple content check)
29
+ const contentHash = content.length + content.charCodeAt(0);
30
+ const lastHash = localStorage.getItem('vibesurf_content_hash');
31
+
32
+ if (lastHash && lastHash !== contentHash.toString()) {
33
+ console.log('[VibeSurf Dev] Files changed, reloading extension...');
34
+ chrome.runtime.reload();
35
+ }
36
+
37
+ localStorage.setItem('vibesurf_content_hash', contentHash.toString());
38
+ chrome.storage.local.set({ [storageKey]: currentTime });
39
+ });
40
+ })
41
+ .catch(error => {
42
+ // Silently ignore errors (extension might be reloading)
43
+ });
44
+ }, 2000);
45
+ }
46
+ }
47
+ })();
@@ -0,0 +1,33 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ // Simple SVG to PNG conversion using Canvas API in Node.js
5
+ // This is a fallback method when imagemagick/rsvg-convert is not available
6
+
7
+ const svgFiles = [
8
+ 'logo-neural.svg',
9
+ 'logo-data.svg',
10
+ 'logo-swarm.svg',
11
+ 'logo-wave.svg'
12
+ ];
13
+
14
+ const sizes = [16, 48, 128];
15
+
16
+ console.log('Note: For proper SVG to PNG conversion, please install one of these tools:');
17
+ console.log('- ImageMagick: brew install imagemagick');
18
+ console.log('- rsvg-convert: brew install librsvg');
19
+ console.log('- Or use online SVG to PNG converter');
20
+ console.log('');
21
+ console.log('SVG files created successfully:');
22
+ svgFiles.forEach(file => {
23
+ console.log(`- ${file}`);
24
+ });
25
+
26
+ console.log('');
27
+ console.log('Required PNG sizes for Chrome extension:');
28
+ sizes.forEach(size => {
29
+ svgFiles.forEach(file => {
30
+ const pngFile = file.replace('.svg', `-${size}.png`);
31
+ console.log(`- ${pngFile}`);
32
+ });
33
+ });
@@ -0,0 +1,187 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>VibeSurf Logo Preview</title>
7
+ <style>
8
+ body {
9
+ font-family: system-ui, -apple-system, sans-serif;
10
+ padding: 20px;
11
+ background: #f5f5f5;
12
+ margin: 0;
13
+ }
14
+ .container {
15
+ max-width: 800px;
16
+ margin: 0 auto;
17
+ background: white;
18
+ padding: 30px;
19
+ border-radius: 12px;
20
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
21
+ }
22
+ h1 {
23
+ text-align: center;
24
+ color: #333;
25
+ margin-bottom: 30px;
26
+ }
27
+ .logo-grid {
28
+ display: grid;
29
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
30
+ gap: 20px;
31
+ margin-bottom: 30px;
32
+ }
33
+ .logo-card {
34
+ padding: 20px;
35
+ border: 1px solid #e1e5e9;
36
+ border-radius: 8px;
37
+ text-align: center;
38
+ background: #fafbfc;
39
+ transition: all 0.2s ease;
40
+ }
41
+ .logo-card:hover {
42
+ border-color: #007acc;
43
+ transform: translateY(-2px);
44
+ box-shadow: 0 4px 12px rgba(0, 122, 204, 0.15);
45
+ }
46
+ .logo-display {
47
+ margin: 15px 0;
48
+ }
49
+ .logo-title {
50
+ font-weight: 600;
51
+ color: #333;
52
+ margin-bottom: 10px;
53
+ }
54
+ .logo-sizes {
55
+ display: flex;
56
+ justify-content: center;
57
+ align-items: center;
58
+ gap: 10px;
59
+ margin: 10px 0;
60
+ }
61
+ .size-label {
62
+ font-size: 12px;
63
+ color: #666;
64
+ }
65
+ .note {
66
+ background: #e6f3ff;
67
+ border: 1px solid #b8daff;
68
+ border-radius: 6px;
69
+ padding: 15px;
70
+ color: #004085;
71
+ font-size: 14px;
72
+ line-height: 1.5;
73
+ }
74
+ .note strong {
75
+ color: #002752;
76
+ }
77
+ </style>
78
+ </head>
79
+ <body>
80
+ <div class="container">
81
+ <h1>VibeSurf Logo Designs</h1>
82
+
83
+ <div class="logo-grid">
84
+ <!-- Neural Network Logo -->
85
+ <div class="logo-card">
86
+ <div class="logo-title">Neural Network</div>
87
+ <div class="logo-display">
88
+ <div class="logo-sizes">
89
+ <div>
90
+ <div class="size-label">16px</div>
91
+ <img src="logo-neural.svg" width="16" height="16" alt="Neural 16px">
92
+ </div>
93
+ <div>
94
+ <div class="size-label">48px</div>
95
+ <img src="logo-neural.svg" width="48" height="48" alt="Neural 48px">
96
+ </div>
97
+ <div>
98
+ <div class="size-label">128px</div>
99
+ <img src="logo-neural.svg" width="128" height="128" alt="Neural 128px">
100
+ </div>
101
+ </div>
102
+ </div>
103
+ <div>AI-focused with neural network pattern</div>
104
+ </div>
105
+
106
+ <!-- Data Flow Logo -->
107
+ <div class="logo-card">
108
+ <div class="logo-title">Data Flow</div>
109
+ <div class="logo-display">
110
+ <div class="logo-sizes">
111
+ <div>
112
+ <div class="size-label">16px</div>
113
+ <img src="logo-data.svg" width="16" height="16" alt="Data 16px">
114
+ </div>
115
+ <div>
116
+ <div class="size-label">48px</div>
117
+ <img src="logo-data.svg" width="48" height="48" alt="Data 48px">
118
+ </div>
119
+ <div>
120
+ <div class="size-label">128px</div>
121
+ <img src="logo-data.svg" width="128" height="128" alt="Data 128px">
122
+ </div>
123
+ </div>
124
+ </div>
125
+ <div>Data processing and connection flows</div>
126
+ </div>
127
+
128
+ <!-- Swarm Intelligence Logo -->
129
+ <div class="logo-card">
130
+ <div class="logo-title">Swarm Intelligence</div>
131
+ <div class="logo-display">
132
+ <div class="logo-sizes">
133
+ <div>
134
+ <div class="size-label">16px</div>
135
+ <img src="logo-swarm.svg" width="16" height="16" alt="Swarm 16px">
136
+ </div>
137
+ <div>
138
+ <div class="size-label">48px</div>
139
+ <img src="logo-swarm.svg" width="48" height="48" alt="Swarm 48px">
140
+ </div>
141
+ <div>
142
+ <div class="size-label">128px</div>
143
+ <img src="logo-swarm.svg" width="128" height="128" alt="Swarm 128px">
144
+ </div>
145
+ </div>
146
+ </div>
147
+ <div>Hexagonal swarm pattern with connections</div>
148
+ </div>
149
+
150
+ <!-- Wave Surf Logo -->
151
+ <div class="logo-card">
152
+ <div class="logo-title">Wave Surf</div>
153
+ <div class="logo-display">
154
+ <div class="logo-sizes">
155
+ <div>
156
+ <div class="size-label">16px</div>
157
+ <img src="logo-wave.svg" width="16" height="16" alt="Wave 16px">
158
+ </div>
159
+ <div>
160
+ <div class="size-label">48px</div>
161
+ <img src="logo-wave.svg" width="48" height="48" alt="Wave 48px">
162
+ </div>
163
+ <div>
164
+ <div class="size-label">128px</div>
165
+ <img src="logo-wave.svg" width="128" height="128" alt="Wave 128px">
166
+ </div>
167
+ </div>
168
+ </div>
169
+ <div>Surfing waves with connection nodes</div>
170
+ </div>
171
+ </div>
172
+
173
+ <div class="note">
174
+ <strong>Note:</strong> These SVG logos are modern, tech-focused designs for the VibeSurf AI browser extension.
175
+ For best Chrome extension compatibility, convert to PNG format using:
176
+ <br><br>
177
+ • <strong>ImageMagick:</strong> <code>brew install imagemagick</code>
178
+ <br>
179
+ • <strong>rsvg-convert:</strong> <code>brew install librsvg</code>
180
+ <br>
181
+ • <strong>Online converter:</strong> Use any SVG to PNG converter website
182
+ <br><br>
183
+ The current manifest.json uses the Neural Network logo by default.
184
+ </div>
185
+ </div>
186
+ </body>
187
+ </html>
@@ -0,0 +1,53 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "VibeSurf: Your browser assistant for vibe surfing",
4
+ "version": "1.0.0",
5
+ "description": "Let's vibe surfing the world",
6
+ "icons": {
7
+ "16": "icons/logo.png",
8
+ "48": "icons/logo.png",
9
+ "128": "icons/logo.png"
10
+ },
11
+ "permissions": [
12
+ "activeTab",
13
+ "storage",
14
+ "notifications",
15
+ "sidePanel",
16
+ "contextMenus",
17
+ "tabs"
18
+ ],
19
+ "host_permissions": [
20
+ "http://localhost:*/*",
21
+ "http://127.0.0.1:*/*",
22
+ "file:///*"
23
+ ],
24
+ "background": {
25
+ "service_worker": "background.js",
26
+ "type": "module"
27
+ },
28
+ "content_scripts": [
29
+ {
30
+ "matches": ["<all_urls>"],
31
+ "js": ["content.js"],
32
+ "run_at": "document_end"
33
+ }
34
+ ],
35
+ "action": {
36
+ "default_title": "VibeSurf",
37
+ "default_icon": {
38
+ "16": "icons/logo.png",
39
+ "24": "icons/logo.png",
40
+ "32": "icons/logo.png"
41
+ }
42
+ },
43
+ "side_panel": {
44
+ "default_path": "sidepanel.html"
45
+ },
46
+
47
+ "web_accessible_resources": [
48
+ {
49
+ "resources": ["sidepanel.html", "styles/*", "scripts/*", "config.js", "icons/*"],
50
+ "matches": ["<all_urls>"]
51
+ }
52
+ ]
53
+ }