vibesurf 0.1.10__tar.gz → 0.1.11__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 (117) hide show
  1. {vibesurf-0.1.10 → vibesurf-0.1.11}/.env.example +1 -0
  2. {vibesurf-0.1.10 → vibesurf-0.1.11}/PKG-INFO +6 -2
  3. {vibesurf-0.1.10 → vibesurf-0.1.11}/pyproject.toml +6 -2
  4. {vibesurf-0.1.10 → vibesurf-0.1.11}/tests/test_agents.py +53 -60
  5. {vibesurf-0.1.10 → vibesurf-0.1.11}/tests/test_backend_api.py +10 -10
  6. vibesurf-0.1.10/tests/test_controller.py → vibesurf-0.1.11/tests/test_tools.py +30 -11
  7. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/_version.py +3 -3
  8. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/agents/browser_use_agent.py +68 -45
  9. vibesurf-0.1.11/vibe_surf/agents/prompts/report_writer_prompt.py +73 -0
  10. vibesurf-0.1.11/vibe_surf/agents/prompts/vibe_surf_prompt.py +89 -0
  11. vibesurf-0.1.11/vibe_surf/agents/report_writer_agent.py +530 -0
  12. vibesurf-0.1.11/vibe_surf/agents/vibe_surf_agent.py +1711 -0
  13. vibesurf-0.1.11/vibe_surf/agents/views.py +130 -0
  14. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/activity.py +3 -1
  15. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/browser.py +9 -5
  16. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/config.py +8 -5
  17. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/files.py +59 -50
  18. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/models.py +2 -2
  19. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/task.py +45 -12
  20. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/database/manager.py +24 -18
  21. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/database/queries.py +199 -192
  22. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/database/schemas.py +1 -1
  23. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/main.py +4 -2
  24. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/shared_state.py +28 -35
  25. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/utils/encryption.py +3 -1
  26. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/utils/llm_factory.py +41 -36
  27. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/agent_browser_session.py +0 -4
  28. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/browser_manager.py +14 -8
  29. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/utils.py +5 -3
  30. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/watchdogs/dom_watchdog.py +0 -45
  31. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/background.js +4 -0
  32. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/api-client.js +13 -0
  33. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/file-manager.js +27 -71
  34. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/session-manager.js +21 -3
  35. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/ui-manager.js +831 -48
  36. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/sidepanel.html +21 -4
  37. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/activity.css +365 -5
  38. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/input.css +139 -0
  39. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/cli.py +4 -22
  40. vibesurf-0.1.11/vibe_surf/common.py +35 -0
  41. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/llm/openai_compatible.py +148 -93
  42. vibesurf-0.1.11/vibe_surf/logger.py +99 -0
  43. vibesurf-0.1.10/vibe_surf/controller/vibesurf_tools.py → vibesurf-0.1.11/vibe_surf/tools/browser_use_tools.py +233 -219
  44. vibesurf-0.1.11/vibe_surf/tools/file_system.py +415 -0
  45. {vibesurf-0.1.10/vibe_surf/controller → vibesurf-0.1.11/vibe_surf/tools}/mcp_client.py +4 -3
  46. vibesurf-0.1.11/vibe_surf/tools/report_writer_tools.py +21 -0
  47. vibesurf-0.1.11/vibe_surf/tools/vibesurf_tools.py +657 -0
  48. vibesurf-0.1.11/vibe_surf/tools/views.py +120 -0
  49. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/PKG-INFO +6 -2
  50. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/SOURCES.txt +23 -11
  51. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/requires.txt +5 -1
  52. vibesurf-0.1.10/vibe_surf/agents/prompts/vibe_surf_prompt.py +0 -176
  53. vibesurf-0.1.10/vibe_surf/agents/report_writer_agent.py +0 -376
  54. vibesurf-0.1.10/vibe_surf/agents/vibe_surf_agent.py +0 -1657
  55. vibesurf-0.1.10/vibe_surf/controller/file_system.py +0 -53
  56. vibesurf-0.1.10/vibe_surf/controller/views.py +0 -37
  57. {vibesurf-0.1.10 → vibesurf-0.1.11}/.github/workflows/publish.yml +0 -0
  58. {vibesurf-0.1.10 → vibesurf-0.1.11}/.gitignore +0 -0
  59. {vibesurf-0.1.10 → vibesurf-0.1.11}/.python-version +0 -0
  60. {vibesurf-0.1.10 → vibesurf-0.1.11}/LICENSE +0 -0
  61. {vibesurf-0.1.10 → vibesurf-0.1.11}/MANIFEST.in +0 -0
  62. {vibesurf-0.1.10 → vibesurf-0.1.11}/README.md +0 -0
  63. {vibesurf-0.1.10 → vibesurf-0.1.11}/docs/EXECUTABLE_BUILD.md +0 -0
  64. {vibesurf-0.1.10 → vibesurf-0.1.11}/docs/PYPI_SETUP.md +0 -0
  65. {vibesurf-0.1.10 → vibesurf-0.1.11}/scripts/build-local.bat +0 -0
  66. {vibesurf-0.1.10 → vibesurf-0.1.11}/scripts/build-local.sh +0 -0
  67. {vibesurf-0.1.10 → vibesurf-0.1.11}/setup.cfg +0 -0
  68. {vibesurf-0.1.10 → vibesurf-0.1.11}/tests/test_browser.py +0 -0
  69. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/__init__.py +0 -0
  70. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/agents/__init__.py +0 -0
  71. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/agents/prompts/__init__.py +0 -0
  72. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/__init__.py +0 -0
  73. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/api/__init__.py +0 -0
  74. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/database/__init__.py +0 -0
  75. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/database/models.py +0 -0
  76. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/llm_config.py +0 -0
  77. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/migrations/__init__.py +0 -0
  78. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/migrations/init_db.py +0 -0
  79. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/migrations/seed_data.py +0 -0
  80. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/backend/utils/__init__.py +0 -0
  81. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/__init__.py +0 -0
  82. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/agen_browser_profile.py +0 -0
  83. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/watchdogs/__init__.py +0 -0
  84. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/browser/watchdogs/action_watchdog.py +0 -0
  85. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/config.js +0 -0
  86. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/content.js +0 -0
  87. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/dev-reload.js +0 -0
  88. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/icons/convert-svg.js +0 -0
  89. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/icons/logo-preview.html +0 -0
  90. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/icons/logo.icns +0 -0
  91. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/icons/logo.png +0 -0
  92. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/manifest.json +0 -0
  93. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/popup.html +0 -0
  94. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/history-manager.js +0 -0
  95. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/main.js +0 -0
  96. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/markdown-it.min.js +0 -0
  97. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/modal-manager.js +0 -0
  98. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/scripts/settings-manager.js +0 -0
  99. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/animations.css +0 -0
  100. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/base.css +0 -0
  101. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/components.css +0 -0
  102. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/history-modal.css +0 -0
  103. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/layout.css +0 -0
  104. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/responsive.css +0 -0
  105. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-environment.css +0 -0
  106. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-forms.css +0 -0
  107. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-modal.css +0 -0
  108. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-profiles.css +0 -0
  109. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-responsive.css +0 -0
  110. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/settings-utilities.css +0 -0
  111. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/chrome_extension/styles/variables.css +0 -0
  112. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibe_surf/llm/__init__.py +0 -0
  113. {vibesurf-0.1.10/vibe_surf/controller → vibesurf-0.1.11/vibe_surf/tools}/__init__.py +0 -0
  114. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/dependency_links.txt +0 -0
  115. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/entry_points.txt +0 -0
  116. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.egg-info/top_level.txt +0 -0
  117. {vibesurf-0.1.10 → vibesurf-0.1.11}/vibesurf.spec +0 -0
@@ -46,6 +46,7 @@ VIBESURF_BACKEND_PORT=
46
46
  VIBESURF_EXTENSION=
47
47
  VIBESURF_WORKSPACE=
48
48
  VIBESURF_DATABASE_URL=
49
+ VIBESURF_DEBUG=
49
50
 
50
51
  BROWSER_EXECUTION_PATH=
51
52
  BROWSER_USER_DATA=
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.10
3
+ Version: 0.1.11
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,11 @@ 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.1
40
+ Requires-Dist: browser-use==0.7.7
41
+ Requires-Dist: markdown-pdf>=1.9
42
+ Requires-Dist: nanoid>=2.0.0
43
+ Requires-Dist: markdownify>=1.2.0
44
+ Requires-Dist: pathvalidate>=3.3.1
41
45
  Dynamic: license-file
42
46
 
43
47
  # VibeSurf: A powerful browser assistant for vibe surfing
@@ -38,7 +38,11 @@ dependencies = [
38
38
  "rich>=13.0.0",
39
39
  "greenlet>=3.2.4",
40
40
  "getmac>=0.9.5",
41
- "browser-use==0.7.1",
41
+ "browser-use==0.7.7",
42
+ "markdown-pdf>=1.9",
43
+ "nanoid>=2.0.0",
44
+ "markdownify>=1.2.0",
45
+ "pathvalidate>=3.3.1",
42
46
  ]
43
47
 
44
48
  [project.urls]
@@ -58,7 +62,7 @@ packages = [
58
62
  "vibe_surf.agents.prompts",
59
63
  "vibe_surf.browser",
60
64
  "vibe_surf.browser.watchdogs",
61
- "vibe_surf.controller",
65
+ "vibe_surf.tools",
62
66
  "vibe_surf.llm",
63
67
  "vibe_surf.backend"
64
68
  ]
@@ -14,7 +14,9 @@ from vibe_surf.browser.browser_manager import BrowserManager
14
14
  from vibe_surf.browser.agent_browser_session import AgentBrowserSession
15
15
 
16
16
  from vibe_surf.browser.agent_browser_session import AgentBrowserSession
17
- from vibe_surf.controller.vibesurf_tools import VibeSurfController
17
+ from vibe_surf.browser.agen_browser_profile import AgentBrowserProfile
18
+ from vibe_surf.tools.browser_use_tools import BrowserUseTools
19
+ from vibe_surf.tools.vibesurf_tools import VibeSurfTools
18
20
  from vibe_surf.llm.openai_compatible import ChatOpenAICompatible
19
21
  from vibe_surf.agents.browser_use_agent import BrowserUseAgent
20
22
  from vibe_surf.agents.vibe_surf_agent import VibeSurfAgent
@@ -25,7 +27,7 @@ async def run_single_bu_agent():
25
27
  browser_exec_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
26
28
  else:
27
29
  browser_exec_path = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
28
- browser_profile = BrowserProfile(
30
+ browser_profile = AgentBrowserProfile(
29
31
  executable_path=browser_exec_path,
30
32
  user_data_dir=os.path.abspath('./tmp/chrome/profiles/default'),
31
33
  headless=False,
@@ -34,24 +36,24 @@ async def run_single_bu_agent():
34
36
  # Use SwarmBrowserSession instead of BrowserSession to disable DVD animation
35
37
  main_browser_session = AgentBrowserSession(browser_profile=browser_profile)
36
38
  await main_browser_session.start()
37
- controller = VibeSurfController()
39
+ bu_tools = BrowserUseTools()
38
40
 
39
- llm = ChatOpenAICompatible(model='gemini-2.5-pro',
41
+ llm = ChatOpenAICompatible(model='gemini-2.5-flash',
40
42
  base_url=os.getenv("OPENAI_ENDPOINT"),
41
43
  api_key=os.getenv("OPENAI_API_KEY"))
42
- # task = "Search Google for 'what is browser automation' and tell me the top 3 results"
43
- task = r"""
44
- 1. 在新的tab 导航到 https://github.com/
45
- 2. 在新的tab 导航到 https://vibemotion.co/
46
- 3. 在新的tab 导航到 https://browser-use.com/
47
- 4. 分别总结所有tab的内容(在一步中使用parallel的extract操作, 不要分开三步),然后保存到 tabs_summary.txt
48
- """
44
+ task = "Search Google for 'Elon Mask' and tell me the top 3 results"
45
+ # task = r"""
46
+ # 1. 在新的tab 导航到 https://github.com/
47
+ # 2. 在新的tab 导航到 https://vibemotion.co/
48
+ # 3. 在新的tab 导航到 https://browser-use.com/
49
+ # 4. 分别总结所有tab的内容(在一步中使用parallel的extract操作, 不要分开三步),然后保存到 tabs_summary.txt
50
+ # """
49
51
  agent = BrowserUseAgent(task=task,
50
52
  llm=llm,
51
53
  browser_session=main_browser_session,
52
- controller=controller,
54
+ tools=bu_tools,
53
55
  task_id=main_browser_session.id,
54
- file_system_path="./tmp/agent_workspace")
56
+ file_system_path="./tmp/single_bu_tests")
55
57
  history = await agent.run()
56
58
  print(history.final_result())
57
59
  await main_browser_session.kill()
@@ -63,7 +65,7 @@ async def run_multi_bu_agents():
63
65
  browser_exec_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
64
66
  else:
65
67
  browser_exec_path = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
66
- browser_profile = BrowserProfile(
68
+ browser_profile = AgentBrowserProfile(
67
69
  executable_path=browser_exec_path,
68
70
  user_data_dir=os.path.abspath('./tmp/chrome/profiles/default'),
69
71
  headless=False,
@@ -82,12 +84,15 @@ async def run_multi_bu_agents():
82
84
  }
83
85
  }
84
86
  # Use SwarmBrowserSession instead of BrowserSession to disable DVD animation
87
+ # Use SwarmBrowserSession instead of BrowserSession to disable DVD animation
85
88
  main_browser_session = AgentBrowserSession(browser_profile=browser_profile)
86
89
  await main_browser_session.start()
90
+ bu_tools = BrowserUseTools()
87
91
  browser_manager = BrowserManager(main_browser_session=main_browser_session)
88
- controller = VibeSurfController()
89
- # await controller.register_mcp_clients(mcp_server_config)
90
- llm = ChatOpenAICompatible(model='gemini-2.5-flash', base_url=os.getenv("OPENAI_ENDPOINT"),
92
+ # await tools.register_mcp_clients(mcp_server_config)
93
+
94
+ llm = ChatOpenAICompatible(model='gemini-2.5-flash',
95
+ base_url=os.getenv("OPENAI_ENDPOINT"),
91
96
  api_key=os.getenv("OPENAI_API_KEY"))
92
97
  agent_browser_sessions = await asyncio.gather(
93
98
  browser_manager.register_agent("agent-1"),
@@ -98,8 +103,8 @@ async def run_multi_bu_agents():
98
103
  BrowserUseAgent(task=task,
99
104
  llm=llm,
100
105
  browser_session=agent_browser_sessions[i],
101
- controller=controller,
102
- file_system_path="./tmp/agent_workspace")
106
+ tools=bu_tools,
107
+ file_system_path="./tmp/multi_bu_tests")
103
108
  for i, task in enumerate([
104
109
  # 'Search Google for weather in Tokyo',
105
110
  # 'Check Reddit front page title',
@@ -122,8 +127,8 @@ async def run_multi_bu_agents():
122
127
  print(await agent_browser_sessions[i].get_tabs())
123
128
  print(ret.final_result())
124
129
  await browser_manager.close()
125
- await controller.unregister_mcp_clients()
126
130
  await main_browser_session.kill()
131
+ await bu_tools.unregister_mcp_clients()
127
132
 
128
133
 
129
134
  async def test_vibe_surf_agent():
@@ -133,37 +138,29 @@ async def test_vibe_surf_agent():
133
138
  browser_exec_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
134
139
  else:
135
140
  browser_exec_path = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
136
- from screeninfo import get_monitors
137
- primary_monitor = get_monitors()[0]
138
- browser_profile = BrowserProfile(
141
+ browser_profile = AgentBrowserProfile(
139
142
  executable_path=browser_exec_path,
140
143
  user_data_dir=os.path.abspath('./tmp/chrome/profiles/default'),
141
144
  headless=False,
142
- keep_alive=True,
143
- highlight_elements=True,
144
- window_size={"width": 1100, "height": 1280}
145
- # window_size={"width": primary_monitor.width, "height": primary_monitor.height}
145
+ keep_alive=True
146
146
  )
147
-
148
- # Initialize components
147
+ # Use SwarmBrowserSession instead of BrowserSession to disable DVD animation
149
148
  main_browser_session = AgentBrowserSession(browser_profile=browser_profile)
150
149
  await main_browser_session.start()
151
-
150
+ vs_tools = VibeSurfTools()
152
151
  browser_manager = BrowserManager(main_browser_session=main_browser_session)
153
- controller = VibeSurfController()
154
-
155
- llm = ChatOpenAICompatible(
156
- model='gemini-2.5-flash',
157
- base_url=os.getenv("OPENAI_ENDPOINT"),
158
- api_key=os.getenv("OPENAI_API_KEY")
159
- )
152
+ llm = ChatOpenAICompatible(model='gemini-2.5-flash',
153
+ base_url=os.getenv("OPENAI_ENDPOINT"),
154
+ api_key=os.getenv("OPENAI_API_KEY"))
155
+
160
156
 
161
157
  # Create VibeSurfAgent
162
158
  agent = VibeSurfAgent(
163
159
  llm=llm,
164
160
  browser_manager=browser_manager,
165
- controller=controller,
166
- workspace_dir=os.path.abspath("./tmp/swarm_surf_workspace_test")
161
+ tools=vs_tools,
162
+ workspace_dir=os.path.abspath("./tmp/vibesurf_tests"),
163
+ calculate_token_cost=True
167
164
  )
168
165
 
169
166
  try:
@@ -194,11 +191,11 @@ async def test_vibe_surf_agent():
194
191
 
195
192
  # Test 4: Browser parallel task
196
193
  print("🧪 Testing browser parallel tasks...")
197
- browser_task = "Search for Dify, n8n, browser-use and get latest news"
194
+ browser_task = "Search for Dify, n8n, browser-use and click into their own homepage, take screenshot and save"
198
195
  result4 = await agent.run(browser_task)
199
196
  print(f"✅ Browser task result:")
200
197
  pprint.pprint(result4)
201
- with open("./tmp/swarm_surf_workspace_test/parallel_test.md", "w", encoding='utf-8') as fw:
198
+ with open("./tmp/vibesurf_tests/parallel_test.md", "w", encoding='utf-8') as fw:
202
199
  fw.write(result4)
203
200
  assert result4 is not None and len(result4) > 0
204
201
  print("🎉 All VibeSurfAgent tests passed!")
@@ -219,35 +216,31 @@ async def test_vibe_surf_agent_control():
219
216
  browser_exec_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
220
217
  else:
221
218
  browser_exec_path = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
222
-
223
- browser_profile = BrowserProfile(
219
+ browser_profile = AgentBrowserProfile(
224
220
  executable_path=browser_exec_path,
225
- user_data_dir=os.path.abspath('./tmp/chrome/profiles/control_test'),
226
- headless=False, # Keep visible for control testing
221
+ user_data_dir=os.path.abspath('./tmp/chrome/profiles/default'),
222
+ headless=False,
227
223
  keep_alive=True
228
224
  )
229
-
230
- # Initialize components
225
+ # Use SwarmBrowserSession instead of BrowserSession to disable DVD animation
231
226
  main_browser_session = AgentBrowserSession(browser_profile=browser_profile)
232
227
  await main_browser_session.start()
233
-
228
+ vs_tools = VibeSurfTools()
234
229
  browser_manager = BrowserManager(main_browser_session=main_browser_session)
235
- controller = VibeSurfController()
236
-
237
- llm = ChatOpenAICompatible(
238
- model='gemini-2.5-flash',
239
- base_url=os.getenv("OPENAI_ENDPOINT"),
240
- api_key=os.getenv("OPENAI_API_KEY")
241
- )
230
+ llm = ChatOpenAICompatible(model='gemini-2.5-pro',
231
+ base_url=os.getenv("OPENAI_ENDPOINT"),
232
+ api_key=os.getenv("OPENAI_API_KEY"))
242
233
 
234
+
243
235
  # Create VibeSurfAgent
244
236
  agent = VibeSurfAgent(
245
237
  llm=llm,
246
238
  browser_manager=browser_manager,
247
- controller=controller,
248
- workspace_dir="./tmp/swarm_surf_control_test"
239
+ tools=vs_tools,
240
+ workspace_dir=os.path.abspath("./tmp/vibesurf_tests"),
241
+ calculate_token_cost=True
249
242
  )
250
-
243
+
251
244
  try:
252
245
  print("🧪 Testing VibeSurfAgent control functionality...")
253
246
 
@@ -375,6 +368,6 @@ async def test_vibe_surf_agent_control():
375
368
 
376
369
  if __name__ == "__main__":
377
370
  # asyncio.run(run_single_bu_agent())
378
- asyncio.run(run_multi_bu_agents())
379
- # asyncio.run(test_vibe_surf_agent())
371
+ # asyncio.run(run_multi_bu_agents())
372
+ asyncio.run(test_vibe_surf_agent())
380
373
  # asyncio.run(test_vibe_surf_agent_control())
@@ -206,33 +206,33 @@ async def test_llm_profile_management():
206
206
 
207
207
 
208
208
  async def test_controller_configuration():
209
- """Test controller/MCP server configuration"""
209
+ """Test tools/MCP server configuration"""
210
210
  print("\n🧪 Testing Controller Configuration...")
211
211
  async with BackendAPITester() as tester:
212
212
  await tester.wait_for_backend()
213
213
 
214
- # 1. Get current controller config
215
- print("\n📋 Testing get controller config...")
216
- config_resp = await tester.get("/config/controller")
214
+ # 1. Get current tools config
215
+ print("\n📋 Testing get tools config...")
216
+ config_resp = await tester.get("/config/tools")
217
217
  print(f"Controller config response: {config_resp}")
218
218
 
219
- # 2. Update controller config (using new Pydantic model)
220
- print("\n✏️ Testing update controller config...")
219
+ # 2. Update tools config (using new Pydantic model)
220
+ print("\n✏️ Testing update tools config...")
221
221
  controller_config = {
222
222
  "exclude_actions": ["scroll_up", "scroll_down"],
223
223
  "max_actions_per_task": 150,
224
224
  "display_files_in_done_text": False
225
225
  }
226
226
 
227
- update_resp = await tester.post("/config/controller", controller_config)
227
+ update_resp = await tester.post("/config/tools", controller_config)
228
228
  if update_resp["status"] == 200:
229
229
  print("✅ Controller configuration updated successfully")
230
230
  else:
231
231
  print(f"❌ Controller config update failed: {update_resp}")
232
232
 
233
233
  # 3. Verify the update
234
- print("\n🔍 Testing verify controller config update...")
235
- verify_resp = await tester.get("/config/controller")
234
+ print("\n🔍 Testing verify tools config update...")
235
+ verify_resp = await tester.get("/config/tools")
236
236
  if verify_resp["status"] == 200:
237
237
  print("✅ Controller configuration verified")
238
238
 
@@ -440,7 +440,7 @@ async def test_configuration_status():
440
440
  status_data = status_resp["data"]
441
441
  print(f"Overall status: {status_data.get('overall_status')}")
442
442
  print(f"LLM profiles: {status_data.get('llm_profiles')}")
443
- print(f"Controller initialized: {status_data.get('controller', {}).get('initialized')}")
443
+ print(f"Controller initialized: {status_data.get('tools', {}).get('initialized')}")
444
444
  print(f"Browser manager initialized: {status_data.get('browser_manager', {}).get('initialized')}")
445
445
  print(f"Swarm agent initialized: {status_data.get('swarm_agent', {}).get('initialized')}")
446
446
 
@@ -10,9 +10,9 @@ from dotenv import load_dotenv
10
10
  load_dotenv()
11
11
 
12
12
 
13
- async def test_controller_with_mcp():
13
+ async def test_tools_with_mcp():
14
14
  import os
15
- from vibe_surf.controller.vibesurf_tools import VibeSurfController
15
+ from vibe_surf.tools.vibesurf_tools import VibeSurfTools
16
16
 
17
17
  mcp_server_config = {
18
18
  "mcpServers": {
@@ -43,7 +43,7 @@ async def test_controller_with_mcp():
43
43
  }
44
44
  }
45
45
 
46
- controller = VibeSurfController(mcp_server_config=mcp_server_config)
46
+ controller = VibeSurfTools(mcp_server_config=mcp_server_config)
47
47
  await controller.register_mcp_clients()
48
48
  pdb.set_trace()
49
49
  # action_name = "mcp.desktop-commander.start_process"
@@ -71,7 +71,7 @@ async def test_controller_with_mcp():
71
71
  # pid = int(result.split("\n")[0].split("PID")[-1].strip())
72
72
  # pdb.set_trace()
73
73
  # action_name = "mcp.desktop-commander.read_process_output"
74
- # action_info = controller.registry.registry.actions[action_name]
74
+ # action_info = tools.registry.registry.actions[action_name]
75
75
  # param_model = action_info.param_model
76
76
  # print(param_model.model_json_schema())
77
77
  # params = {"pid": pid}
@@ -80,7 +80,7 @@ async def test_controller_with_mcp():
80
80
  # output_result = ""
81
81
  # while True:
82
82
  # time.sleep(1)
83
- # result = await controller.act(action_model)
83
+ # result = await tools.act(action_model)
84
84
  # result = result.extracted_content
85
85
  # if result:
86
86
  # output_result = result
@@ -90,15 +90,34 @@ async def test_controller_with_mcp():
90
90
 
91
91
 
92
92
  async def test_filesystem():
93
- from browser_use.filesystem.file_system import FileSystem
93
+ from vibe_surf.tools.file_system import CustomFileSystem
94
94
 
95
95
  file_system_path = r"E:\AIBrowser\VibeSurf\tmp\vibesurf_workspace"
96
- filesystem = FileSystem(file_system_path)
97
- result = await filesystem.read_file(
98
- "E:/AIBrowser/VibeSurf/tmp/vibesurf_workspace/068b3165-ddb7-7a49-8000-d4df8a16ae2d/upload_files/Ayers Application Form.md")
96
+ filesystem = CustomFileSystem(file_system_path)
97
+ result = await filesystem.create_file("reports/final_report.html")
99
98
  print(result)
99
+ result = filesystem.get_absolute_path("reports/final_report.html")
100
+ print(result)
101
+
102
+
103
+ async def test_bu_tools():
104
+ import os
105
+ from vibe_surf.tools.browser_use_tools import BrowserUseTools
106
+
107
+ tools = BrowserUseTools()
108
+ print(tools.registry.registry.actions.keys())
109
+
110
+
111
+ async def test_vibesurf_tools():
112
+ import os
113
+ from vibe_surf.tools.vibesurf_tools import VibeSurfTools
114
+
115
+ tools = VibeSurfTools()
116
+ print(tools.registry.registry.actions.keys())
100
117
 
101
118
 
102
119
  if __name__ == '__main__':
103
- # asyncio.run(test_controller_with_mcp())
104
- asyncio.run(test_filesystem())
120
+ # asyncio.run(test_tools_with_mcp())
121
+ # asyncio.run(test_filesystem())
122
+ # asyncio.run(test_bu_tools())
123
+ asyncio.run(test_vibesurf_tools())
@@ -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.10'
32
- __version_tuple__ = version_tuple = (0, 1, 10)
31
+ __version__ = version = '0.1.11'
32
+ __version_tuple__ = version_tuple = (0, 1, 11)
33
33
 
34
- __commit_id__ = commit_id = 'g3e1f64f34'
34
+ __commit_id__ = commit_id = 'g542374226'