vibesurf 0.1.28__tar.gz → 0.1.30__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 (139) hide show
  1. {vibesurf-0.1.28 → vibesurf-0.1.30}/PKG-INFO +56 -24
  2. {vibesurf-0.1.28 → vibesurf-0.1.30}/README.md +54 -22
  3. {vibesurf-0.1.28 → vibesurf-0.1.30}/README_zh.md +54 -22
  4. {vibesurf-0.1.28 → vibesurf-0.1.30}/pyproject.toml +1 -1
  5. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/_version.py +3 -3
  6. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/vibe_surf_agent.py +2 -0
  7. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/shared_state.py +2 -2
  8. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/config.js +8 -0
  9. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/ui-manager.js +146 -0
  10. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/sidepanel.html +2 -16
  11. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/browser_use_tools.py +21 -5
  12. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/PKG-INFO +56 -24
  13. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/requires.txt +1 -1
  14. {vibesurf-0.1.28 → vibesurf-0.1.30}/.env.example +0 -0
  15. {vibesurf-0.1.28 → vibesurf-0.1.30}/.github/workflows/publish.yml +0 -0
  16. {vibesurf-0.1.28 → vibesurf-0.1.30}/.gitignore +0 -0
  17. {vibesurf-0.1.28 → vibesurf-0.1.30}/.python-version +0 -0
  18. {vibesurf-0.1.28 → vibesurf-0.1.30}/LICENSE +0 -0
  19. {vibesurf-0.1.28 → vibesurf-0.1.30}/MANIFEST.in +0 -0
  20. {vibesurf-0.1.28 → vibesurf-0.1.30}/docs/EXECUTABLE_BUILD.md +0 -0
  21. {vibesurf-0.1.28 → vibesurf-0.1.30}/docs/PYPI_SETUP.md +0 -0
  22. {vibesurf-0.1.28 → vibesurf-0.1.30}/scripts/build-local.bat +0 -0
  23. {vibesurf-0.1.28 → vibesurf-0.1.30}/scripts/build-local.sh +0 -0
  24. {vibesurf-0.1.28 → vibesurf-0.1.30}/setup.cfg +0 -0
  25. {vibesurf-0.1.28 → vibesurf-0.1.30}/tests/test_agents.py +0 -0
  26. {vibesurf-0.1.28 → vibesurf-0.1.30}/tests/test_backend_api.py +0 -0
  27. {vibesurf-0.1.28 → vibesurf-0.1.30}/tests/test_browser.py +0 -0
  28. {vibesurf-0.1.28 → vibesurf-0.1.30}/tests/test_tools.py +0 -0
  29. {vibesurf-0.1.28 → vibesurf-0.1.30}/tests/test_voice_api.py +0 -0
  30. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/__init__.py +0 -0
  31. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/__init__.py +0 -0
  32. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/browser_use_agent.py +0 -0
  33. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/prompts/__init__.py +0 -0
  34. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/prompts/report_writer_prompt.py +0 -0
  35. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/prompts/vibe_surf_prompt.py +0 -0
  36. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/report_writer_agent.py +0 -0
  37. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/agents/views.py +0 -0
  38. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/__init__.py +0 -0
  39. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/__init__.py +0 -0
  40. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/activity.py +0 -0
  41. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/agent.py +0 -0
  42. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/browser.py +0 -0
  43. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/config.py +0 -0
  44. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/files.py +0 -0
  45. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/models.py +0 -0
  46. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/task.py +0 -0
  47. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/api/voices.py +0 -0
  48. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/__init__.py +0 -0
  49. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/manager.py +0 -0
  50. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/migrations/v001_initial_schema.sql +0 -0
  51. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/migrations/v002_add_agent_mode.sql +0 -0
  52. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/migrations/v003_fix_task_status_case.sql +0 -0
  53. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/migrations/v004_add_voice_profiles.sql +0 -0
  54. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/models.py +0 -0
  55. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/queries.py +0 -0
  56. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/database/schemas.py +0 -0
  57. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/llm_config.py +0 -0
  58. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/main.py +0 -0
  59. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/utils/__init__.py +0 -0
  60. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/utils/encryption.py +0 -0
  61. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/utils/llm_factory.py +0 -0
  62. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/backend/voice_model_config.py +0 -0
  63. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/__init__.py +0 -0
  64. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/agen_browser_profile.py +0 -0
  65. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/agent_browser_session.py +0 -0
  66. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/browser_manager.py +0 -0
  67. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/utils.py +0 -0
  68. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/watchdogs/__init__.py +0 -0
  69. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/watchdogs/action_watchdog.py +0 -0
  70. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/browser/watchdogs/dom_watchdog.py +0 -0
  71. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/background.js +0 -0
  72. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/content.js +0 -0
  73. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/dev-reload.js +0 -0
  74. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/icons/logo.icns +0 -0
  75. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/icons/logo.png +0 -0
  76. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/manifest.json +0 -0
  77. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/permission-iframe.html +0 -0
  78. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/permission-request.html +0 -0
  79. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/popup.html +0 -0
  80. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/api-client.js +0 -0
  81. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/file-manager.js +0 -0
  82. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/history-manager.js +0 -0
  83. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/main.js +0 -0
  84. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/markdown-it.min.js +0 -0
  85. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/modal-manager.js +0 -0
  86. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/permission-iframe-request.js +0 -0
  87. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/permission-request.js +0 -0
  88. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/session-manager.js +0 -0
  89. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/settings-manager.js +0 -0
  90. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/user-settings-storage.js +0 -0
  91. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/scripts/voice-recorder.js +0 -0
  92. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/activity.css +0 -0
  93. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/animations.css +0 -0
  94. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/base.css +0 -0
  95. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/components.css +0 -0
  96. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/history-modal.css +0 -0
  97. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/input.css +0 -0
  98. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/layout.css +0 -0
  99. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/responsive.css +0 -0
  100. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-environment.css +0 -0
  101. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-forms.css +0 -0
  102. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-modal.css +0 -0
  103. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-profiles.css +0 -0
  104. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-responsive.css +0 -0
  105. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/settings-utilities.css +0 -0
  106. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/chrome_extension/styles/variables.css +0 -0
  107. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/cli.py +0 -0
  108. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/common.py +0 -0
  109. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/llm/__init__.py +0 -0
  110. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/llm/openai_compatible.py +0 -0
  111. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/logger.py +0 -0
  112. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/__init__.py +0 -0
  113. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/file_system.py +0 -0
  114. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/finance_tools.py +0 -0
  115. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/mcp_client.py +0 -0
  116. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/report_writer_tools.py +0 -0
  117. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/vibesurf_registry.py +0 -0
  118. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/vibesurf_tools.py +0 -0
  119. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/views.py +0 -0
  120. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/voice_asr.py +0 -0
  121. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/__init__.py +0 -0
  122. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/douyin/__init__.py +0 -0
  123. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/douyin/client.py +0 -0
  124. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/douyin/douyin.js +0 -0
  125. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/douyin/helpers.py +0 -0
  126. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/weibo/__init__.py +0 -0
  127. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/weibo/client.py +0 -0
  128. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/weibo/helpers.py +0 -0
  129. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/xhs/__init__.py +0 -0
  130. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/xhs/client.py +0 -0
  131. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/xhs/helpers.py +0 -0
  132. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/youtube/__init__.py +0 -0
  133. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/youtube/client.py +0 -0
  134. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibe_surf/tools/website_api/youtube/helpers.py +0 -0
  135. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/SOURCES.txt +0 -0
  136. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/dependency_links.txt +0 -0
  137. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/entry_points.txt +0 -0
  138. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.egg-info/top_level.txt +0 -0
  139. {vibesurf-0.1.28 → vibesurf-0.1.30}/vibesurf.spec +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.28
3
+ Version: 0.1.30
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
5
  Author: Shao Warm
6
6
  License: Apache-2.0
@@ -37,7 +37,7 @@ Requires-Dist: aiosqlite>=0.21.0
37
37
  Requires-Dist: rich>=13.0.0
38
38
  Requires-Dist: greenlet>=3.2.4
39
39
  Requires-Dist: getmac>=0.9.5
40
- Requires-Dist: browser-use==0.7.9
40
+ Requires-Dist: browser-use==0.7.10
41
41
  Requires-Dist: markdown-pdf>=1.9
42
42
  Requires-Dist: nanoid>=2.0.0
43
43
  Requires-Dist: markdownify>=1.2.0
@@ -71,56 +71,88 @@ If you're as excited about open-source AI browsing as I am, give it a star! ⭐
71
71
 
72
72
  ## 🛠️ Installation
73
73
 
74
- ### Step 1: Install uv
75
- Install uv from [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/):
74
+ Get VibeSurf up and running in just three simple steps. No complex configuration required.
76
75
 
76
+ ### 1. Install uv
77
+ Install uv package manager from the official website
78
+
79
+ **MacOS/Linux**
77
80
  ```bash
78
- # On macOS and Linux
79
81
  curl -LsSf https://astral.sh/uv/install.sh | sh
82
+ ```
80
83
 
81
- # On Windows
84
+ **Windows**
85
+ ```bash
82
86
  powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
83
87
  ```
84
88
 
85
- ### Step 2: Setup and Install
89
+ ### 2. Setup Environment
90
+ Install VibeSurf
91
+
86
92
  ```bash
87
- uv venv --python 3.12
88
93
  uv pip install vibesurf -U
89
94
  ```
90
95
 
91
- ### Step 3: Launch
96
+ ### 3. Launch VibeSurf
97
+ Start the VibeSurf browser assistant
98
+
92
99
  ```bash
93
100
  uv run vibesurf
94
101
  ```
95
102
 
96
103
  ## 👩‍💻 For Contributors
97
104
 
98
- Want to contribute to VibeSurf? Here are two ways to set up your development environment:
105
+ Want to contribute to VibeSurf? Follow these steps to set up your development environment:
99
106
 
100
- ### Method 1: Direct Server Run
101
- Run the backend server directly using uvicorn:
107
+ ### 1. Clone Repository
102
108
  ```bash
103
- uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
109
+ git clone https://github.com/vibesurf-ai/VibeSurf.git
110
+ cd VibeSurf
104
111
  ```
105
112
 
106
- ### Method 2: Editable Installation
107
- Install the package in editable mode and run using the CLI:
113
+ ### 2. Setup Environment
114
+ **MacOS/Linux**
108
115
  ```bash
116
+ uv venv --python 3.12
117
+ source .venv/bin/activate
109
118
  uv pip install -e .
110
- uv run vibesurf
111
119
  ```
112
120
 
113
- Choose the method that works best for your development workflow!
114
- ## �️ Roadmap
121
+ **Windows**
122
+ ```bash
123
+ uv venv --python 3.12
124
+ .venv\Scripts\activate
125
+ uv pip install -e .
126
+ ```
127
+
128
+ ### 3. Start Debugging
129
+ **Option 1: Direct Server**
130
+ ```bash
131
+ uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
132
+ ```
133
+
134
+ **Option 2: CLI Entry**
135
+ ```bash
136
+ uv run vibesurf
137
+ ```
138
+ ## 🗺️ Roadmap
115
139
 
116
140
  We're building VibeSurf to be your ultimate AI browser companion. Here's what's coming next:
117
141
 
118
- - [x] **Smart Skills System**: Add `/search` for quick information search and `/crawl` for automatic website data extraction
119
- - [ ] **Powerful Coding Agent**: Build a comprehensive coding assistant for data processing and analysis directly in your browser
120
- - [ ] **Third-Party Integrations**: Connect with n8n workflows and other tools to combine browsing with automation
121
- - [ ] **Custom Workflow Templates**: Create reusable templates for auto-login, data collection, and complex browser automation
122
- - [ ] **Smart Interaction Features**: Text selection for translation/Q&A, screenshot analysis, and voice reading capabilities
123
- - [ ] **Real-Time Conversation & Memory**: Add persistent chat functionality with global memory to make VibeSurf truly understand you
142
+ - [x] **Smart Skills System** - *Completed*
143
+ Add `/search` for quick information search and `/crawl` for automatic website data extraction. Integrated native APIs for Xiaohongshu, Douyin, Weibo, and YouTube.
144
+
145
+ - [ ] **Powerful Coding Agent** - *In Progress*
146
+ Build a comprehensive coding assistant for data processing and analysis directly in your browser
147
+
148
+ - [ ] **Agentic Browser Workflow** - *Planned*
149
+ Create custom drag-and-drop workflows for auto-login, data collection, and complex browser automation tasks
150
+
151
+ - [ ] **Third-Party Integrations** - *Planned*
152
+ Connect with n8n workflows and other tools to combine browsing with automation
153
+
154
+ - [ ] **Intelligent Memory & Personalization** - *Planned*
155
+ Transform VibeSurf into a truly human-like companion with persistent memory that learns your preferences, habits, and browsing patterns over time
124
156
 
125
157
 
126
158
  ## 🎬 Demo
@@ -22,56 +22,88 @@ If you're as excited about open-source AI browsing as I am, give it a star! ⭐
22
22
 
23
23
  ## 🛠️ Installation
24
24
 
25
- ### Step 1: Install uv
26
- Install uv from [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/):
25
+ Get VibeSurf up and running in just three simple steps. No complex configuration required.
27
26
 
27
+ ### 1. Install uv
28
+ Install uv package manager from the official website
29
+
30
+ **MacOS/Linux**
28
31
  ```bash
29
- # On macOS and Linux
30
32
  curl -LsSf https://astral.sh/uv/install.sh | sh
33
+ ```
31
34
 
32
- # On Windows
35
+ **Windows**
36
+ ```bash
33
37
  powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
34
38
  ```
35
39
 
36
- ### Step 2: Setup and Install
40
+ ### 2. Setup Environment
41
+ Install VibeSurf
42
+
37
43
  ```bash
38
- uv venv --python 3.12
39
44
  uv pip install vibesurf -U
40
45
  ```
41
46
 
42
- ### Step 3: Launch
47
+ ### 3. Launch VibeSurf
48
+ Start the VibeSurf browser assistant
49
+
43
50
  ```bash
44
51
  uv run vibesurf
45
52
  ```
46
53
 
47
54
  ## 👩‍💻 For Contributors
48
55
 
49
- Want to contribute to VibeSurf? Here are two ways to set up your development environment:
56
+ Want to contribute to VibeSurf? Follow these steps to set up your development environment:
50
57
 
51
- ### Method 1: Direct Server Run
52
- Run the backend server directly using uvicorn:
58
+ ### 1. Clone Repository
53
59
  ```bash
54
- uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
60
+ git clone https://github.com/vibesurf-ai/VibeSurf.git
61
+ cd VibeSurf
55
62
  ```
56
63
 
57
- ### Method 2: Editable Installation
58
- Install the package in editable mode and run using the CLI:
64
+ ### 2. Setup Environment
65
+ **MacOS/Linux**
59
66
  ```bash
67
+ uv venv --python 3.12
68
+ source .venv/bin/activate
60
69
  uv pip install -e .
61
- uv run vibesurf
62
70
  ```
63
71
 
64
- Choose the method that works best for your development workflow!
65
- ## �️ Roadmap
72
+ **Windows**
73
+ ```bash
74
+ uv venv --python 3.12
75
+ .venv\Scripts\activate
76
+ uv pip install -e .
77
+ ```
78
+
79
+ ### 3. Start Debugging
80
+ **Option 1: Direct Server**
81
+ ```bash
82
+ uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
83
+ ```
84
+
85
+ **Option 2: CLI Entry**
86
+ ```bash
87
+ uv run vibesurf
88
+ ```
89
+ ## 🗺️ Roadmap
66
90
 
67
91
  We're building VibeSurf to be your ultimate AI browser companion. Here's what's coming next:
68
92
 
69
- - [x] **Smart Skills System**: Add `/search` for quick information search and `/crawl` for automatic website data extraction
70
- - [ ] **Powerful Coding Agent**: Build a comprehensive coding assistant for data processing and analysis directly in your browser
71
- - [ ] **Third-Party Integrations**: Connect with n8n workflows and other tools to combine browsing with automation
72
- - [ ] **Custom Workflow Templates**: Create reusable templates for auto-login, data collection, and complex browser automation
73
- - [ ] **Smart Interaction Features**: Text selection for translation/Q&A, screenshot analysis, and voice reading capabilities
74
- - [ ] **Real-Time Conversation & Memory**: Add persistent chat functionality with global memory to make VibeSurf truly understand you
93
+ - [x] **Smart Skills System** - *Completed*
94
+ Add `/search` for quick information search and `/crawl` for automatic website data extraction. Integrated native APIs for Xiaohongshu, Douyin, Weibo, and YouTube.
95
+
96
+ - [ ] **Powerful Coding Agent** - *In Progress*
97
+ Build a comprehensive coding assistant for data processing and analysis directly in your browser
98
+
99
+ - [ ] **Agentic Browser Workflow** - *Planned*
100
+ Create custom drag-and-drop workflows for auto-login, data collection, and complex browser automation tasks
101
+
102
+ - [ ] **Third-Party Integrations** - *Planned*
103
+ Connect with n8n workflows and other tools to combine browsing with automation
104
+
105
+ - [ ] **Intelligent Memory & Personalization** - *Planned*
106
+ Transform VibeSurf into a truly human-like companion with persistent memory that learns your preferences, habits, and browsing patterns over time
75
107
 
76
108
 
77
109
  ## 🎬 Demo
@@ -23,57 +23,89 @@ VibeSurf 是一个开源的 AI 代理浏览器,它革新了浏览器自动化
23
23
 
24
24
  ## 🛠️ 安装
25
25
 
26
- ### 第一步:安装 uv
27
- 从 [https://docs.astral.sh/uv/getting-started/installation/](https://docs.astral.sh/uv/getting-started/installation/) 安装 uv:
26
+ 仅需三个简单步骤即可启动并运行 VibeSurf。无需复杂配置。
28
27
 
28
+ ### 1. 安装 uv
29
+ 从官方网站安装 uv 包管理器
30
+
31
+ **MacOS/Linux**
29
32
  ```bash
30
- # 在 macOS 和 Linux 上
31
33
  curl -LsSf https://astral.sh/uv/install.sh | sh
34
+ ```
32
35
 
33
- # 在 Windows
36
+ **Windows**
37
+ ```bash
34
38
  powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
35
39
  ```
36
40
 
37
- ### 第二步:设置和安装
41
+ ### 2. 设置环境
42
+ 安装 VibeSurf
43
+
38
44
  ```bash
39
- uv venv --python 3.12
40
45
  uv pip install vibesurf -U
41
46
  ```
42
47
 
43
- ### 第三步:启动
48
+ ### 3. 启动 VibeSurf
49
+ 启动 VibeSurf 浏览器助手
50
+
44
51
  ```bash
45
52
  uv run vibesurf
46
53
  ```
47
54
 
48
- ## 👩‍💻 对贡献者
55
+ ## 👩‍💻 贡献者指南
49
56
 
50
- 想为 VibeSurf 做贡献?以下是设置开发环境的两种方法:
57
+ 想为 VibeSurf 做贡献?请按照以下步骤设置您的开发环境:
51
58
 
52
- ### 方法 1:直接运行服务器
53
- 使用 uvicorn 直接运行后端服务器:
59
+ ### 1. 克隆仓库
54
60
  ```bash
55
- uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
61
+ git clone https://github.com/vibesurf-ai/VibeSurf.git
62
+ cd VibeSurf
56
63
  ```
57
64
 
58
- ### 方法 2:可编辑安装
59
- 以可编辑模式安装包并使用 CLI 运行:
65
+ ### 2. 设置环境
66
+ **MacOS/Linux**
60
67
  ```bash
68
+ uv venv --python 3.12
69
+ source .venv/bin/activate
61
70
  uv pip install -e .
62
- uv run vibesurf
63
71
  ```
64
72
 
65
- 选择最适合您开发工作流程的方法!
73
+ **Windows**
74
+ ```bash
75
+ uv venv --python 3.12
76
+ .venv\Scripts\activate
77
+ uv pip install -e .
78
+ ```
79
+
80
+ ### 3. 开始调试
81
+ **选项 1:直接服务器**
82
+ ```bash
83
+ uvicorn vibe_surf.backend.main:app --host 127.0.0.1 --port 9335
84
+ ```
85
+
86
+ **选项 2:CLI 入口**
87
+ ```bash
88
+ uv run vibesurf
89
+ ```
66
90
 
67
91
  ## 🗺️ 路线图
68
92
 
69
93
  我们正在构建 VibeSurf,使其成为您终极的 AI 浏览器伴侣。以下是接下来的计划:
70
94
 
71
- - [x] **智能技能系统**:添加 `/search` 用于快速信息搜索,`/crawl` 用于自动网站数据提取
72
- - [ ] **强大的编码代理**:构建一个全面的编码助手,用于在浏览器中直接进行数据处理和分析
73
- - [ ] **第三方集成**:与 n8n 工作流和其他工具连接,将浏览与自动化结合
74
- - [ ] **自定义工作流模板**:创建可重用的模板,用于自动登录、数据收集和复杂的浏览器自动化
75
- - [ ] **智能交互功能**:文本选择用于翻译/问答、截图分析和语音阅读功能
76
- - [ ] **实时对话和记忆**:添加持久聊天功能和全局记忆,使 VibeSurf 真正理解您
95
+ - [x] **智能技能系统** - *已完成*
96
+ 添加 `/search` 用于快速信息搜索,`/crawl` 用于自动网站数据提取。集成了小红书、抖音、微博和 YouTube 的原生 API。
97
+
98
+ - [ ] **强大的编码代理** - *进行中*
99
+ 构建一个全面的编码助手,用于在浏览器中直接进行数据处理和分析
100
+
101
+ - [ ] **智能浏览器工作流** - *计划中*
102
+ 创建自定义拖拽式工作流,用于自动登录、数据收集和复杂的浏览器自动化任务
103
+
104
+ - [ ] **第三方集成** - *计划中*
105
+ 与 n8n 工作流和其他工具连接,将浏览与自动化结合
106
+
107
+ - [ ] **智能记忆与个性化** - *计划中*
108
+ 将 VibeSurf 转变为真正的人性化伴侣,具备持久记忆功能,能够学习您的偏好、习惯和浏览模式
77
109
 
78
110
  ## 🎬 演示
79
111
 
@@ -38,7 +38,7 @@ dependencies = [
38
38
  "rich>=13.0.0",
39
39
  "greenlet>=3.2.4",
40
40
  "getmac>=0.9.5",
41
- "browser-use==0.7.9",
41
+ "browser-use==0.7.10",
42
42
  "markdown-pdf>=1.9",
43
43
  "nanoid>=2.0.0",
44
44
  "markdownify>=1.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.28'
32
- __version_tuple__ = version_tuple = (0, 1, 28)
31
+ __version__ = version = '0.1.30'
32
+ __version_tuple__ = version_tuple = (0, 1, 30)
33
33
 
34
- __commit_id__ = commit_id = 'gf16277cb8'
34
+ __commit_id__ = commit_id = 'gc10cb51b5'
@@ -501,6 +501,8 @@ async def _vibesurf_agent_node_impl(state: VibeSurfState) -> VibeSurfState:
501
501
  return state
502
502
 
503
503
  except Exception as e:
504
+ import traceback
505
+ traceback.print_exc()
504
506
  logger.error(f"❌ VibeSurf agent failed: {e}")
505
507
  state.final_response = f"Task execution failed: {str(e)}"
506
508
  state.is_complete = True
@@ -353,13 +353,13 @@ async def initialize_vibesurf_components():
353
353
  browser_execution_path = os.getenv("BROWSER_EXECUTION_PATH", "")
354
354
  assert os.path.exists(browser_execution_path), "Please set the BROWSER_EXECUTION_PATH environment variable"
355
355
  browser_user_data = os.getenv("BROWSER_USER_DATA", "")
356
- if not browser_user_data:
356
+ if not browser_user_data or not os.path.exists(browser_user_data):
357
357
  browser_user_data = os.path.join(workspace_dir, "browser_user_data",
358
358
  f"{os.path.basename(browser_execution_path)}-profile")
359
359
 
360
360
  # Get VibeSurf extension path
361
361
  vibesurf_extension = os.getenv("VIBESURF_EXTENSION", "")
362
- if not vibesurf_extension.strip():
362
+ if not vibesurf_extension.strip() or not os.path.exists(vibesurf_extension):
363
363
  current_file = Path(__file__)
364
364
  project_root = current_file.parent.parent.absolute()
365
365
  vibesurf_extension = str(project_root / "chrome_extension")
@@ -27,6 +27,14 @@ const VIBESURF_CONFIG = {
27
27
  autoScroll: true,
28
28
  compactMode: false
29
29
  },
30
+
31
+ // Social media links
32
+ SOCIAL_LINKS: {
33
+ github: "https://github.com/vibesurf-ai/VibeSurf",
34
+ discord: "https://discord.gg/EZ2YnUXP",
35
+ x: "https://x.com/warmshao",
36
+ website: "https://vibe-surf.com/"
37
+ },
30
38
 
31
39
  // Debug mode
32
40
  DEBUG: false
@@ -31,6 +31,7 @@ class VibeSurfUIManager {
31
31
  this.initializeManagers();
32
32
  this.bindEvents();
33
33
  this.setupSessionListeners();
34
+ this.initializeSocialLinks();
34
35
  }
35
36
 
36
37
  bindElements() {
@@ -3468,6 +3469,151 @@ class VibeSurfUIManager {
3468
3469
  return skills.length > 0 ? skills : null;
3469
3470
  }
3470
3471
 
3472
+ // Initialize social links from config
3473
+ initializeSocialLinks() {
3474
+ const socialLinksContainer = document.getElementById('social-links-container');
3475
+ if (!socialLinksContainer) {
3476
+ console.warn('[UIManager] Social links container not found');
3477
+ return;
3478
+ }
3479
+
3480
+ // Get social links from config
3481
+ const socialLinks = window.VIBESURF_CONFIG?.SOCIAL_LINKS;
3482
+ if (!socialLinks) {
3483
+ console.warn('[UIManager] Social links not found in config');
3484
+ return;
3485
+ }
3486
+
3487
+ // Clear existing content
3488
+ socialLinksContainer.innerHTML = '';
3489
+
3490
+ // Handle website link separately by making VibeSurf logo/text clickable
3491
+ const websiteUrl = socialLinks.website;
3492
+ if (websiteUrl) {
3493
+ this.initializeVibeSurfWebsiteLink(websiteUrl);
3494
+ }
3495
+
3496
+ // Create social link elements (excluding website)
3497
+ Object.entries(socialLinks).forEach(([platform, url]) => {
3498
+ if (platform !== 'website') {
3499
+ const link = this.createSocialLink(platform, url);
3500
+ if (link) {
3501
+ socialLinksContainer.appendChild(link);
3502
+ }
3503
+ }
3504
+ });
3505
+ }
3506
+
3507
+ // Make VibeSurf text clickable to link to website
3508
+ initializeVibeSurfWebsiteLink(websiteUrl) {
3509
+ // Only find elements that contain "VibeSurf" text specifically
3510
+ const allElements = document.querySelectorAll('*');
3511
+ const vibeSurfTextElements = [];
3512
+
3513
+ allElements.forEach(element => {
3514
+ // Only target elements that contain "VibeSurf" text and are likely text elements
3515
+ if (element.textContent &&
3516
+ element.textContent.trim() === 'VibeSurf' &&
3517
+ element.children.length === 0) { // Only leaf text nodes, not containers
3518
+ vibeSurfTextElements.push(element);
3519
+ }
3520
+ });
3521
+
3522
+ // Make only VibeSurf text elements clickable
3523
+ vibeSurfTextElements.forEach(element => {
3524
+ if (element && !element.querySelector('a')) { // Don't double-wrap already linked elements
3525
+ element.style.cursor = 'pointer';
3526
+ element.style.transition = 'opacity 0.2s ease';
3527
+ element.setAttribute('title', 'Login to early access alpha features');
3528
+
3529
+ // Add hover effect
3530
+ element.addEventListener('mouseenter', () => {
3531
+ element.style.opacity = '0.8';
3532
+ });
3533
+
3534
+ element.addEventListener('mouseleave', () => {
3535
+ element.style.opacity = '1';
3536
+ });
3537
+
3538
+ // Add click handler
3539
+ element.addEventListener('click', (e) => {
3540
+ e.preventDefault();
3541
+ e.stopPropagation();
3542
+ this.openWebsiteLink(websiteUrl);
3543
+ });
3544
+ }
3545
+ });
3546
+ }
3547
+
3548
+ // Open website link in new tab
3549
+ async openWebsiteLink(url) {
3550
+ try {
3551
+ console.log('[UIManager] Opening VibeSurf website:', url);
3552
+
3553
+ const result = await chrome.runtime.sendMessage({
3554
+ type: 'OPEN_FILE_URL',
3555
+ data: { fileUrl: url }
3556
+ });
3557
+
3558
+ if (!result || !result.success) {
3559
+ throw new Error(result?.error || 'Failed to open website');
3560
+ }
3561
+
3562
+ console.log('[UIManager] Successfully opened website tab:', result.tabId);
3563
+ } catch (error) {
3564
+ console.error('[UIManager] Error opening website:', error);
3565
+ this.showNotification(`Failed to open website: ${error.message}`, 'error');
3566
+ }
3567
+ }
3568
+
3569
+ // Create individual social link element
3570
+ createSocialLink(platform, url) {
3571
+ const link = document.createElement('a');
3572
+ link.href = url;
3573
+ link.className = 'social-link';
3574
+ link.setAttribute('data-platform', platform);
3575
+ link.setAttribute('target', '_blank');
3576
+ link.setAttribute('rel', 'noopener noreferrer');
3577
+
3578
+ // Set title and tooltip based on platform
3579
+ let title = '';
3580
+ let svg = '';
3581
+
3582
+ switch (platform.toLowerCase()) {
3583
+ case 'github':
3584
+ title = 'GitHub';
3585
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3586
+ <path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z" fill="currentColor"/>
3587
+ </svg>`;
3588
+ break;
3589
+
3590
+ case 'discord':
3591
+ title = 'Discord';
3592
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3593
+ <path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" fill="currentColor"/>
3594
+ </svg>`;
3595
+ break;
3596
+
3597
+ case 'x':
3598
+ case 'twitter':
3599
+ title = 'X (Twitter)';
3600
+ svg = `<svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3601
+ <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill="currentColor"/>
3602
+ </svg>`;
3603
+ break;
3604
+
3605
+
3606
+ default:
3607
+ console.warn(`[UIManager] Unknown social platform: ${platform}`);
3608
+ return null;
3609
+ }
3610
+
3611
+ link.setAttribute('title', title);
3612
+ link.innerHTML = svg;
3613
+
3614
+ return link;
3615
+ }
3616
+
3471
3617
  // Export for use in other modules
3472
3618
  static exportToWindow() {
3473
3619
  if (typeof window !== 'undefined') {
@@ -36,22 +36,8 @@
36
36
  <div class="logo-brand">
37
37
  <img src="icons/logo.png" alt="VibeSurf" class="logo-image">
38
38
  <span class="logo-text">VibeSurf</span>
39
- <div class="social-links">
40
- <a href="https://github.com/vvincent1234/VibeSurf" class="social-link" title="GitHub" data-platform="github" target="_blank" rel="noopener noreferrer">
41
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
42
- <path d="M12 0C5.374 0 0 5.373 0 12c0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23A11.509 11.509 0 0112 5.803c1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576C20.566 21.797 24 17.3 24 12c0-6.627-5.373-12-12-12z" fill="currentColor"/>
43
- </svg>
44
- </a>
45
- <a href="https://discord.gg/WSeRwW2M" class="social-link" title="Discord" data-platform="discord" target="_blank" rel="noopener noreferrer">
46
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
47
- <path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" fill="currentColor"/>
48
- </svg>
49
- </a>
50
- <a href="https://x.com/warmshao" class="social-link" title="X (Twitter)" data-platform="x" target="_blank" rel="noopener noreferrer">
51
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
52
- <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" fill="currentColor"/>
53
- </svg>
54
- </a>
39
+ <div class="social-links" id="social-links-container">
40
+ <!-- Social links will be populated dynamically from config -->
55
41
  </div>
56
42
  </div>
57
43
  <div class="session-info">
@@ -29,7 +29,7 @@ from browser_use.tools.views import (
29
29
  InputTextAction,
30
30
  NoParamsAction,
31
31
  ScrollAction,
32
- SearchGoogleAction,
32
+ SearchAction,
33
33
  SelectDropdownOptionAction,
34
34
  SendKeysAction,
35
35
  StructuredOutputAction,
@@ -370,11 +370,27 @@ class BrowserUseTools(Tools, VibeSurfTools):
370
370
  # =======================
371
371
 
372
372
  @self.registry.action(
373
- 'Search the query in Google, the query should be a search query like humans search in Google, concrete and not vague or super long.',
374
- param_model=SearchGoogleAction,
373
+ 'Search the query using the specified search engine. Defaults to DuckDuckGo (recommended) to avoid reCAPTCHA. Options: duckduckgo, google, bing. Query should be concrete and not vague or super long.',
374
+ param_model=SearchAction,
375
375
  )
376
- async def search_google(params: SearchGoogleAction, browser_session: AgentBrowserSession):
377
- search_url = f'https://www.google.com/search?q={params.query}&udm=14'
376
+ async def search(params: SearchAction, browser_session: AgentBrowserSession):
377
+ import urllib.parse
378
+
379
+ # Encode query for URL safety
380
+ encoded_query = urllib.parse.quote_plus(params.query)
381
+
382
+ # Build search URL based on search engine
383
+ search_engines = {
384
+ 'duckduckgo': f'https://duckduckgo.com/?q={encoded_query}',
385
+ 'google': f'https://www.google.com/search?q={encoded_query}&udm=14',
386
+ 'bing': f'https://www.bing.com/search?q={encoded_query}',
387
+ }
388
+
389
+ if params.search_engine.lower() not in search_engines:
390
+ return ActionResult(
391
+ error=f'Unsupported search engine: {params.search_engine}. Options: duckduckgo, google, bing')
392
+
393
+ search_url = search_engines[params.search_engine.lower()]
378
394
 
379
395
  try:
380
396
  # Use AgentBrowserSession's direct navigation method