vibesurf 0.1.11__tar.gz → 0.1.12__tar.gz

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 (112) hide show
  1. {vibesurf-0.1.11 → vibesurf-0.1.12}/PKG-INFO +1 -1
  2. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/_version.py +3 -3
  3. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/vibe_surf_agent.py +1 -0
  4. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/task.py +1 -1
  5. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/cli.py +2 -1
  6. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/llm/openai_compatible.py +72 -9
  7. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/file_system.py +25 -3
  8. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/PKG-INFO +1 -1
  9. {vibesurf-0.1.11 → vibesurf-0.1.12}/.env.example +0 -0
  10. {vibesurf-0.1.11 → vibesurf-0.1.12}/.github/workflows/publish.yml +0 -0
  11. {vibesurf-0.1.11 → vibesurf-0.1.12}/.gitignore +0 -0
  12. {vibesurf-0.1.11 → vibesurf-0.1.12}/.python-version +0 -0
  13. {vibesurf-0.1.11 → vibesurf-0.1.12}/LICENSE +0 -0
  14. {vibesurf-0.1.11 → vibesurf-0.1.12}/MANIFEST.in +0 -0
  15. {vibesurf-0.1.11 → vibesurf-0.1.12}/README.md +0 -0
  16. {vibesurf-0.1.11 → vibesurf-0.1.12}/docs/EXECUTABLE_BUILD.md +0 -0
  17. {vibesurf-0.1.11 → vibesurf-0.1.12}/docs/PYPI_SETUP.md +0 -0
  18. {vibesurf-0.1.11 → vibesurf-0.1.12}/pyproject.toml +0 -0
  19. {vibesurf-0.1.11 → vibesurf-0.1.12}/scripts/build-local.bat +0 -0
  20. {vibesurf-0.1.11 → vibesurf-0.1.12}/scripts/build-local.sh +0 -0
  21. {vibesurf-0.1.11 → vibesurf-0.1.12}/setup.cfg +0 -0
  22. {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_agents.py +0 -0
  23. {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_backend_api.py +0 -0
  24. {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_browser.py +0 -0
  25. {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_tools.py +0 -0
  26. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/__init__.py +0 -0
  27. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/__init__.py +0 -0
  28. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/browser_use_agent.py +0 -0
  29. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/__init__.py +0 -0
  30. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/report_writer_prompt.py +0 -0
  31. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/vibe_surf_prompt.py +0 -0
  32. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/report_writer_agent.py +0 -0
  33. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/views.py +0 -0
  34. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/__init__.py +0 -0
  35. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/__init__.py +0 -0
  36. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/activity.py +0 -0
  37. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/browser.py +0 -0
  38. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/config.py +0 -0
  39. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/files.py +0 -0
  40. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/models.py +0 -0
  41. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/__init__.py +0 -0
  42. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/manager.py +0 -0
  43. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/models.py +0 -0
  44. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/queries.py +0 -0
  45. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/schemas.py +0 -0
  46. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/llm_config.py +0 -0
  47. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/main.py +0 -0
  48. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/__init__.py +0 -0
  49. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/init_db.py +0 -0
  50. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/seed_data.py +0 -0
  51. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/shared_state.py +0 -0
  52. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/__init__.py +0 -0
  53. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/encryption.py +0 -0
  54. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/llm_factory.py +0 -0
  55. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/__init__.py +0 -0
  56. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/agen_browser_profile.py +0 -0
  57. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/agent_browser_session.py +0 -0
  58. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/browser_manager.py +0 -0
  59. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/utils.py +0 -0
  60. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/__init__.py +0 -0
  61. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/action_watchdog.py +0 -0
  62. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/dom_watchdog.py +0 -0
  63. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/background.js +0 -0
  64. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/config.js +0 -0
  65. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/content.js +0 -0
  66. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/dev-reload.js +0 -0
  67. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/convert-svg.js +0 -0
  68. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo-preview.html +0 -0
  69. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo.icns +0 -0
  70. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo.png +0 -0
  71. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/manifest.json +0 -0
  72. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/popup.html +0 -0
  73. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/api-client.js +0 -0
  74. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/file-manager.js +0 -0
  75. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/history-manager.js +0 -0
  76. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/main.js +0 -0
  77. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/markdown-it.min.js +0 -0
  78. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/modal-manager.js +0 -0
  79. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/session-manager.js +0 -0
  80. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/settings-manager.js +0 -0
  81. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/ui-manager.js +0 -0
  82. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/sidepanel.html +0 -0
  83. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/activity.css +0 -0
  84. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/animations.css +0 -0
  85. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/base.css +0 -0
  86. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/components.css +0 -0
  87. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/history-modal.css +0 -0
  88. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/input.css +0 -0
  89. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/layout.css +0 -0
  90. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/responsive.css +0 -0
  91. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-environment.css +0 -0
  92. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-forms.css +0 -0
  93. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-modal.css +0 -0
  94. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-profiles.css +0 -0
  95. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-responsive.css +0 -0
  96. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-utilities.css +0 -0
  97. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/variables.css +0 -0
  98. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/common.py +0 -0
  99. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/llm/__init__.py +0 -0
  100. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/logger.py +0 -0
  101. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/__init__.py +0 -0
  102. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/browser_use_tools.py +0 -0
  103. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/mcp_client.py +0 -0
  104. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/report_writer_tools.py +0 -0
  105. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/vibesurf_tools.py +0 -0
  106. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/views.py +0 -0
  107. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/SOURCES.txt +0 -0
  108. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/dependency_links.txt +0 -0
  109. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/entry_points.txt +0 -0
  110. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/requires.txt +0 -0
  111. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/top_level.txt +0 -0
  112. {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.spec +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.11
3
+ Version: 0.1.12
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
5
  Author: Shao Warm
6
6
  License: Apache-2.0
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.1.11'
32
- __version_tuple__ = version_tuple = (0, 1, 11)
31
+ __version__ = version = '0.1.12'
32
+ __version_tuple__ = version_tuple = (0, 1, 12)
33
33
 
34
- __commit_id__ = commit_id = 'g542374226'
34
+ __commit_id__ = commit_id = 'gaff176eb4'
@@ -363,6 +363,7 @@ async def _vibesurf_agent_node_impl(state: VibeSurfState) -> VibeSurfState:
363
363
 
364
364
  # Format context information
365
365
  context_info = []
366
+ context_info.append(f"Current Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
366
367
  if browser_tabs:
367
368
  browser_tabs_info = {}
368
369
  for tab in browser_tabs:
@@ -248,7 +248,7 @@ async def stop_task(control_request: TaskControlRequest):
248
248
  active_task["end_time"] = datetime.now()
249
249
 
250
250
  # Clear active task
251
- # clear_active_task()
251
+ clear_active_task()
252
252
 
253
253
  return {
254
254
  "success": True,
@@ -341,7 +341,8 @@ def start_backend(port: int) -> None:
341
341
  def get_browser_execution_path() -> Optional[str]:
342
342
  """Get browser execution path from envs.json or environment variables."""
343
343
  # 1. Load environment variables
344
- from .common import get_workspace_dir
344
+ from vibe_surf.common import get_workspace_dir
345
+
345
346
  workspace_dir = get_workspace_dir()
346
347
  os.makedirs(workspace_dir, exist_ok=True)
347
348
  logger.info("WorkSpace directory: {}".format(workspace_dir))
@@ -53,25 +53,41 @@ from browser_use.llm.views import ChatInvokeCompletion, ChatInvokeUsage
53
53
 
54
54
  T = TypeVar('T', bound=BaseModel)
55
55
 
56
+ from vibe_surf.logger import get_logger
57
+
58
+ logger = get_logger(__name__)
59
+
56
60
 
57
61
  @dataclass
58
62
  class ChatOpenAICompatible(ChatOpenAI):
59
63
  """
60
- OpenAI-compatible chat model with automatic Gemini schema fix support.
64
+ OpenAI-compatible chat model with automatic schema fix support for Gemini, Kimi, and Qwen models.
61
65
 
62
- This class extends browser_use's ChatOpenAI to automatically detect Gemini models
66
+ This class extends browser_use's ChatOpenAI to automatically detect special models
63
67
  and apply the necessary schema fixes to work with OpenAI-compatible APIs.
64
68
 
65
- When a model name starts with 'gemini', this class will automatically apply
66
- the schema transformations required by Gemini models to prevent validation errors
67
- like "Unable to submit request because one or more response schemas specified
68
- other fields alongside any_of".
69
+ Supported models:
70
+ - Gemini models: Removes 'additionalProperties', 'title', 'default' and resolves $ref
71
+ - Kimi/Moonshot models: Removes 'min_items', 'max_items', 'minItems', 'maxItems', 'default' with anyOf
72
+ - Qwen models: Ensures 'json' keyword is present in messages when using response_format
73
+
74
+ The class automatically detects the model type and applies appropriate fixes.
69
75
  """
70
76
 
71
77
  def _is_gemini_model(self) -> bool:
72
78
  """Check if the current model is a Gemini model."""
73
79
  return str(self.model).lower().startswith('gemini')
74
80
 
81
+ def _is_kimi_model(self) -> bool:
82
+ """Check if the current model is a Kimi/Moonshot model."""
83
+ model_str = str(self.model).lower()
84
+ return 'kimi' in model_str or 'moonshot' in model_str
85
+
86
+ def _is_qwen_model(self) -> bool:
87
+ """Check if the current model is a Qwen model."""
88
+ model_str = str(self.model).lower()
89
+ return 'qwen' in model_str
90
+
75
91
  def _fix_gemini_schema(self, schema: dict[str, Any]) -> dict[str, Any]:
76
92
  """
77
93
  Convert a Pydantic model to a Gemini-compatible schema.
@@ -147,6 +163,43 @@ class ChatOpenAICompatible(ChatOpenAI):
147
163
 
148
164
  return clean_schema(schema)
149
165
 
166
+ def _fix_kimi_schema(self, schema: dict[str, Any]) -> dict[str, Any]:
167
+ """
168
+ Convert a Pydantic model to a Kimi/Moonshot-compatible schema.
169
+
170
+ This function removes unsupported keywords like 'min_items' that Moonshot API doesn't support.
171
+
172
+ Args:
173
+ schema: The original JSON schema
174
+
175
+ Returns:
176
+ A cleaned schema compatible with Moonshot API
177
+ """
178
+
179
+ def clean_schema(obj: Any) -> Any:
180
+ if isinstance(obj, dict):
181
+ cleaned = {}
182
+ has_any_of = 'anyOf' in obj
183
+
184
+ for key, value in obj.items():
185
+ # Remove unsupported keywords for Moonshot
186
+ if key in ['min_items', 'minItems']:
187
+ continue
188
+ # Remove 'default' when 'anyOf' is present (Moonshot restriction)
189
+ elif key == 'default' and has_any_of:
190
+ continue
191
+ # Remove other problematic keywords
192
+ elif key in ['title', 'additionalProperties']:
193
+ continue
194
+ else:
195
+ cleaned[key] = clean_schema(value)
196
+ return cleaned
197
+ elif isinstance(obj, list):
198
+ return [clean_schema(item) for item in obj]
199
+ return obj
200
+
201
+ return clean_schema(schema)
202
+
150
203
  @overload
151
204
  async def ainvoke(self, messages: list[BaseMessage], output_format: None = None) -> ChatInvokeCompletion[str]:
152
205
  ...
@@ -168,9 +221,9 @@ class ChatOpenAICompatible(ChatOpenAI):
168
221
  Returns:
169
222
  Either a string response or an instance of output_format
170
223
  """
171
- # If this is not a Gemini model or no structured output is requested,
224
+ # If this is not a special model or no structured output is requested,
172
225
  # use the parent implementation directly
173
- if not self._is_gemini_model() or output_format is None:
226
+ if not (self._is_gemini_model() or self._is_kimi_model()) or output_format is None:
174
227
  return await super().ainvoke(messages, output_format)
175
228
 
176
229
  openai_messages = OpenAIMessageSerializer.serialize_messages(messages)
@@ -217,7 +270,17 @@ class ChatOpenAICompatible(ChatOpenAI):
217
270
 
218
271
  else:
219
272
  original_schema = SchemaOptimizer.create_optimized_json_schema(output_format)
220
- fixed_schema = self._fix_gemini_schema(original_schema)
273
+
274
+ # Apply appropriate schema fix based on model type
275
+ if self._is_gemini_model():
276
+ logger.debug(f"🔧 Applying Gemini schema fixes for model: {self.model}")
277
+ fixed_schema = self._fix_gemini_schema(original_schema)
278
+ elif self._is_kimi_model():
279
+ logger.debug(f"🔧 Applying Kimi/Moonshot schema fixes for model: {self.model}")
280
+ fixed_schema = self._fix_kimi_schema(original_schema)
281
+ else:
282
+ fixed_schema = original_schema
283
+
221
284
  response_format: JSONSchema = {
222
285
  'name': 'agent_output',
223
286
  'strict': True,
@@ -229,6 +229,26 @@ class CustomFileSystem(FileSystem):
229
229
  pattern = rf'^[a-zA-Z0-9_\-]+\.({extensions})$'
230
230
  return bool(re.match(pattern, file_name))
231
231
 
232
+ async def append_file(self, full_filename: str, content: str) -> str:
233
+ """Append content to file using file-specific append method"""
234
+ if not self._is_valid_filename(full_filename):
235
+ return INVALID_FILENAME_ERROR_MESSAGE
236
+
237
+ full_path = self.data_dir / full_filename
238
+ is_file_exist = await self.file_exist(full_filename)
239
+ if not is_file_exist:
240
+ return f"File '{full_filename}' not found."
241
+
242
+ try:
243
+ with open(str(full_path), encoding='utf-8', mode='a') as f:
244
+ f.write(content)
245
+
246
+ return f'Data appended to file {full_filename} successfully.'
247
+ except FileSystemError as e:
248
+ return str(e)
249
+ except Exception as e:
250
+ return f"Error: Could not append to file '{full_filename}'. {str(e)}"
251
+
232
252
  async def write_file(self, full_filename: str, content: str) -> str:
233
253
  """Write content to file using file-specific write method"""
234
254
  if not self._is_valid_filename(full_filename):
@@ -249,8 +269,9 @@ class CustomFileSystem(FileSystem):
249
269
  file_obj = file_class(name=name_without_ext)
250
270
  self.files[full_filename] = file_obj # Use full filename as key
251
271
 
252
- # Use file-specific write method
253
- await file_obj.write(content, self.data_dir)
272
+ with open(str(full_path), encoding='utf-8', mode='w') as f:
273
+ f.write(content)
274
+
254
275
  return f'Data written to file {full_filename} successfully.'
255
276
  except FileSystemError as e:
256
277
  return str(e)
@@ -282,7 +303,8 @@ class CustomFileSystem(FileSystem):
282
303
  self.files[full_filename] = file_obj # Use full filename as key
283
304
 
284
305
  # Use file-specific write method
285
- await file_obj.write('', self.data_dir)
306
+ with open(str(full_path), encoding='utf-8', mode='w') as f:
307
+ f.write('')
286
308
  return f'Create file {full_filename} successfully.'
287
309
  except FileSystemError as e:
288
310
  return str(e)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.11
3
+ Version: 0.1.12
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
5
  Author: Shao Warm
6
6
  License: Apache-2.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes