vibesurf 0.1.29__py3-none-any.whl → 0.1.31__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.

vibe_surf/_version.py CHANGED
@@ -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.29'
32
- __version_tuple__ = version_tuple = (0, 1, 29)
31
+ __version__ = version = '0.1.31'
32
+ __version_tuple__ = version_tuple = (0, 1, 31)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -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
@@ -24,6 +24,7 @@ from browser_use.browser import BrowserProfile
24
24
  from vibe_surf.llm.openai_compatible import ChatOpenAICompatible
25
25
  from vibe_surf.browser.agent_browser_session import AgentBrowserSession
26
26
  from vibe_surf.browser.agen_browser_profile import AgentBrowserProfile
27
+ from vibe_surf.backend.utils.utils import configure_system_proxies
27
28
 
28
29
  logger = logging.getLogger(__name__)
29
30
 
@@ -330,7 +331,7 @@ async def initialize_vibesurf_components():
330
331
  # Load environment variables
331
332
  workspace_dir = common.get_workspace_dir()
332
333
  logger.info("WorkSpace directory: {}".format(workspace_dir))
333
-
334
+ configure_system_proxies()
334
335
  # Load environment configuration from envs.json
335
336
  envs_file_path = os.path.join(workspace_dir, "envs.json")
336
337
  try:
@@ -0,0 +1,42 @@
1
+ import pdb
2
+ import urllib.request
3
+ import os
4
+ from vibe_surf.logger import get_logger
5
+
6
+ logger = get_logger(__name__)
7
+
8
+ def configure_system_proxies():
9
+ """
10
+ Get system proxy settings using urllib.request.getproxies()
11
+ and set them as HTTP_PROXY and HTTPS_PROXY environment variables.
12
+ """
13
+
14
+ # 1. Get system proxy setting
15
+ try:
16
+ proxies = urllib.request.getproxies()
17
+ logger.info(proxies)
18
+ except Exception as e:
19
+ # Simple error handling
20
+ logger.error(e)
21
+ return
22
+
23
+ if not proxies:
24
+ logger.info("No system proxies detected.")
25
+ return
26
+
27
+ logger.debug(f"Detected system proxies: {proxies}")
28
+
29
+ # 2. Configure HTTP_PROXY
30
+ http_proxy = proxies.get('http')
31
+ if http_proxy:
32
+ os.environ['HTTP_PROXY'] = http_proxy
33
+ logger.info(f"Set HTTP_PROXY to: {http_proxy}")
34
+
35
+ # 3. Configure HTTPS_PROXY
36
+ https_proxy = proxies.get('https')
37
+ if https_proxy:
38
+ os.environ['HTTPS_PROXY'] = https_proxy
39
+ logger.info(f"Set HTTPS_PROXY to: {https_proxy}")
40
+
41
+ if http_proxy or https_proxy:
42
+ os.environ['no_proxy'] = 'localhost,127.0.0.1,::1'
vibe_surf/cli.py CHANGED
@@ -15,9 +15,6 @@ from pathlib import Path
15
15
  from typing import Optional
16
16
  import os
17
17
 
18
- # In case user has a proxy in localhost
19
- os.environ['no_proxy'] = 'localhost,127.0.0.1,::1'
20
-
21
18
  try:
22
19
  from rich.console import Console
23
20
  from rich.panel import Panel
@@ -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
@@ -1263,7 +1263,18 @@ Please generate alternative JavaScript code that avoids this system error:"""
1263
1263
 
1264
1264
 
1265
1265
  @self.registry.action(
1266
- 'Skill: YouTube API - Access YouTube platform data including search, video details, comments, channel info, and trending videos. Methods: search_videos, get_video_details, get_video_comments, get_channel_info, get_channel_videos, get_trending_videos.',
1266
+ """Skill: YouTube API - Access YouTube platform data including search, video details, comments, channel info, trending videos, and video transcripts.
1267
+ Methods:
1268
+ search_videos,
1269
+ get_video_details,
1270
+ get_video_comments,
1271
+ get_channel_info,
1272
+ get_channel_videos,
1273
+ get_trending_videos,
1274
+ get_video_transcript.
1275
+
1276
+ If users want to know the specific content of this video, please use get_video_transcript to get detailed video content first.
1277
+ """,
1267
1278
  param_model=SkillYoutubeAction,
1268
1279
  )
1269
1280
  async def skill_youtube(
@@ -1281,6 +1292,7 @@ Please generate alternative JavaScript code that avoids this system error:"""
1281
1292
  - get_channel_info: Get channel information
1282
1293
  - get_channel_videos: Get videos from specific channel
1283
1294
  - get_trending_videos: Get trending videos
1295
+ - get_video_transcript: Get video transcript in multiple languages
1284
1296
  """
1285
1297
  try:
1286
1298
  from vibe_surf.tools.website_api.youtube.client import YouTubeApiClient
@@ -1311,6 +1323,8 @@ Please generate alternative JavaScript code that avoids this system error:"""
1311
1323
  result = await yt_client.get_channel_videos(**method_params)
1312
1324
  elif params.method == "get_trending_videos":
1313
1325
  result = await yt_client.get_trending_videos()
1326
+ elif params.method == "get_video_transcript":
1327
+ result = await yt_client.get_video_transcript(**method_params)
1314
1328
  else:
1315
1329
  return ActionResult(error=f"Unknown method: {params.method}")
1316
1330
 
vibe_surf/tools/views.py CHANGED
@@ -281,7 +281,8 @@ class SkillYoutubeAction(BaseModel):
281
281
  - get_video_comments: Get video comments, params required: {"video_id": "video ID", "max_comments": 200}
282
282
  - get_channel_info: Get channel information, params required: {"channel_id": "channel ID"}
283
283
  - get_channel_videos: Get channel videos, params required: {"channel_id": "channel ID", "max_videos": 20}
284
- - get_trending_videos: Get trending videos, params: {}'''
284
+ - get_trending_videos: Get trending videos, params: {}
285
+ - get_video_transcript: Get video transcript, params required: {"video_id": "video ID", "languages": ["en", "zh-CN"] (optional, defaults to ["en"])}'''
285
286
  )
286
287
  params: str = Field(
287
288
  description='JSON string of method parameters, provide corresponding parameters according to the method parameter. Example: {"query": "tech tutorial", "max_results": 30}'
@@ -10,6 +10,7 @@ from typing import Dict, List, Optional, Callable, Union, Any
10
10
  import httpx
11
11
  from tenacity import retry, stop_after_attempt, wait_fixed
12
12
  from urllib.parse import parse_qs, unquote, urlencode
13
+ from youtube_transcript_api import YouTubeTranscriptApi
13
14
 
14
15
  from vibe_surf.browser.agent_browser_session import AgentBrowserSession
15
16
  from vibe_surf.logger import get_logger
@@ -1170,6 +1171,62 @@ class YouTubeApiClient:
1170
1171
  logger.error(f"Failed to get trending videos: {e}")
1171
1172
  return []
1172
1173
 
1174
+ async def get_video_transcript(self, video_id: str, languages: Optional[List[str]] = None) -> Optional[Dict[str, List[Dict]]]:
1175
+ """
1176
+ Get transcript for a YouTube video
1177
+
1178
+ Args:
1179
+ video_id: YouTube video ID (not the full URL)
1180
+ languages: List of language codes to try (default: ['en'])
1181
+
1182
+ Returns:
1183
+ Dictionary with language codes as keys and transcript raw data as values
1184
+ Returns None if no transcripts are available
1185
+ """
1186
+ try:
1187
+ if languages is None:
1188
+ languages = ['en']
1189
+
1190
+ # Create YouTubeTranscriptApi instance
1191
+ ytt_api = YouTubeTranscriptApi()
1192
+
1193
+ # List available transcripts to check what's available
1194
+ transcript_list = ytt_api.list(video_id)
1195
+ available_languages = [transcript.language_code for transcript in transcript_list]
1196
+
1197
+ logger.info(f"Available transcript languages for video {video_id}: {available_languages}")
1198
+
1199
+ # Filter requested languages to only include available ones
1200
+ valid_languages = [lang for lang in languages if lang in available_languages]
1201
+
1202
+ if not valid_languages:
1203
+ logger.warning(f"None of the requested languages {languages} are available for video {video_id}")
1204
+ return None
1205
+
1206
+ # Fetch transcripts for each valid language
1207
+ result = {}
1208
+ for language in valid_languages:
1209
+ try:
1210
+ # Find transcript for this specific language
1211
+ transcript = transcript_list.find_transcript([language])
1212
+ fetched_transcript = transcript.fetch()
1213
+
1214
+ # Convert to raw data format
1215
+ raw_data = fetched_transcript.to_raw_data()
1216
+ result[language] = raw_data
1217
+
1218
+ logger.info(f"Successfully fetched transcript for video {video_id} in language {language}")
1219
+
1220
+ except Exception as lang_error:
1221
+ logger.warning(f"Failed to fetch transcript for language {language}: {lang_error}")
1222
+ continue
1223
+
1224
+ return result if result else None
1225
+
1226
+ except Exception as e:
1227
+ logger.error(f"Failed to get transcript for video {video_id}: {e}")
1228
+ return None
1229
+
1173
1230
  async def close(self):
1174
1231
  if self.browser_session and self.target_id:
1175
1232
  try:
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.29
3
+ Version: 0.1.31
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
- Author: Shao Warm
5
+ Author: WarmShao
6
6
  License: Apache-2.0
7
- Project-URL: Repository, https://github.com/vvincent1234/VibeSurf
7
+ Project-URL: Repository, https://github.com/vibesurf-ai/VibeSurf
8
8
  Keywords: browser use,browser automation,browser assistant,agentic browser,vibe surf,AI browser
9
9
  Classifier: Development Status :: 3 - Alpha
10
10
  Classifier: Intended Audience :: Developers
@@ -21,7 +21,7 @@ Requires-Dist: aiofiles>=24.1.0
21
21
  Requires-Dist: anyio>=4.9.0
22
22
  Requires-Dist: psutil>=7.0.0
23
23
  Requires-Dist: pydantic>=2.11.5
24
- Requires-Dist: cdp-use>=1.4.0
24
+ Requires-Dist: cdp-use>=1.4.1
25
25
  Requires-Dist: json-repair>=0.48.0
26
26
  Requires-Dist: aiohttp>=3.12.15
27
27
  Requires-Dist: scikit-image>=0.25.2
@@ -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
@@ -45,6 +45,7 @@ Requires-Dist: pathvalidate>=3.3.1
45
45
  Requires-Dist: dashscope>=1.24.5
46
46
  Requires-Dist: yfinance>=0.2.66
47
47
  Requires-Dist: pyexecjs>=1.5.1
48
+ Requires-Dist: youtube-transcript-api>=1.2.2
48
49
  Dynamic: license-file
49
50
 
50
51
  # VibeSurf: A powerful browser assistant for vibe surfing
@@ -1,12 +1,12 @@
1
1
  vibe_surf/__init__.py,sha256=WtduuMFGauMD_9dpk4fnRnLTAP6ka9Lfu0feAFNzLfo,339
2
- vibe_surf/_version.py,sha256=psmJDfuN2z6DlzPIrP1wLVvD7WuzzlJGAfailO2UuI0,706
3
- vibe_surf/cli.py,sha256=KAmUBsXfS-NkMp3ITxzNXwtFeKVmXJUDZiWqLcIC0BI,16690
2
+ vibe_surf/_version.py,sha256=L87EssWopAuMph5lZqUKxrS1nQEgv6aCJfmdUfQfh9k,706
3
+ vibe_surf/cli.py,sha256=tTPkQqkW_jW154C9U2C2qgQtqblaskmsWFBlqPd-LMc,16598
4
4
  vibe_surf/common.py,sha256=_WWMxen5wFwzUjEShn3yDVC1OBFUiJ6Vccadi6tuG6w,1215
5
5
  vibe_surf/logger.py,sha256=k53MFA96QX6t9OfcOf1Zws8PP0OOqjVJfhUD3Do9lKw,3043
6
6
  vibe_surf/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  vibe_surf/agents/browser_use_agent.py,sha256=jeUYV7yk6vyycw6liju_597GdjB3CW_B2wEhn2F0ekk,45957
8
8
  vibe_surf/agents/report_writer_agent.py,sha256=pCF2k6VLyO-sSviGBqqIyVD3SLqaZtSqiW3kvNfPY1I,20967
9
- vibe_surf/agents/vibe_surf_agent.py,sha256=cOQvZJrE4WBnirgN_PW-GfVSnPKI5G5FwW2AA5bTqew,74162
9
+ vibe_surf/agents/vibe_surf_agent.py,sha256=VoybehPeO4lymN6524eOkHIezFIp6ZabWSE_e5CbyZM,74217
10
10
  vibe_surf/agents/views.py,sha256=yHjNJloa-aofVTGyuRy08tBYP_Y3XLqt1DUWOUmHRng,4825
11
11
  vibe_surf/agents/prompts/__init__.py,sha256=l4ieA0D8kLJthyNN85FKLNe4ExBa3stY3l-aImLDRD0,36
12
12
  vibe_surf/agents/prompts/report_writer_prompt.py,sha256=sZE8MUT1CDLmRzbnbEQzAvTwJjpITgh2Q8g1_eXmkzE,4454
@@ -14,7 +14,7 @@ vibe_surf/agents/prompts/vibe_surf_prompt.py,sha256=hubN49_aD5LpkDGa0Z2AxGmUL04M
14
14
  vibe_surf/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  vibe_surf/backend/llm_config.py,sha256=9V8Gg065TQALbOKQnOqFWd8RzOJjegOD8w6YOf90Q7Y,5036
16
16
  vibe_surf/backend/main.py,sha256=K57Bk7JtG1xTu2zmMZwPd5oUuReHDHzrRzsarcggCwg,7402
17
- vibe_surf/backend/shared_state.py,sha256=eMh3W0zCJ12G9kYeqQMrCk5r-H3IR0Nce-_vUz4qaPA,23561
17
+ vibe_surf/backend/shared_state.py,sha256=o-6QJjIC-x34A6nRS2c2uO16yZ7osPXZSxVb86OeA4A,23662
18
18
  vibe_surf/backend/voice_model_config.py,sha256=oee4fvOexXKzKRDv2-FEKQj7Z2OznACrj6mfWRGy7h0,567
19
19
  vibe_surf/backend/api/__init__.py,sha256=XxF1jUOORpLYCfFuPrrnUGRnOrr6ClH0_MNPU-4RnSs,68
20
20
  vibe_surf/backend/api/activity.py,sha256=_cnHusqolt5Hf3KdAf6FK-3sBc-TSaadmb5dJxGI57A,9398
@@ -37,6 +37,7 @@ vibe_surf/backend/database/migrations/v004_add_voice_profiles.sql,sha256=-9arjQB
37
37
  vibe_surf/backend/utils/__init__.py,sha256=V8leMFp7apAglUAoCHPZrNNcRHthSLYIudIJE5qwjb0,184
38
38
  vibe_surf/backend/utils/encryption.py,sha256=CjLNh_n0Luhfa-6BB-icfzkiiDqj5b4Gu6MADU3p2eM,3754
39
39
  vibe_surf/backend/utils/llm_factory.py,sha256=XIJYc9Lh_L2vbwlAe96PrjptlzJtLOjCGNdHEx6fThk,9047
40
+ vibe_surf/backend/utils/utils.py,sha256=nY5-DGY4MfPumpQxXLQiodO0Db7lChryWIHbY9h971o,1137
40
41
  vibe_surf/browser/__init__.py,sha256=_UToO2fZfSCrfjOcxhn4Qq7ZLbYeyPuUUEmqIva-Yv8,325
41
42
  vibe_surf/browser/agen_browser_profile.py,sha256=J06hCBJSJ-zAFVM9yDFz8UpmiLuFyWke1EMekpU45eo,5871
42
43
  vibe_surf/browser/agent_browser_session.py,sha256=9bCQkPNEy88-04gB9njBrbuoFBhIYF_SxueZfFe5RCM,35662
@@ -87,14 +88,14 @@ vibe_surf/chrome_extension/styles/variables.css,sha256=enjyhsa0PeU3b-3uiXa-VkV-1
87
88
  vibe_surf/llm/__init__.py,sha256=_vDVPo6STf343p1SgMQrF5023hicAx0g83pK2Gbk4Ek,601
88
89
  vibe_surf/llm/openai_compatible.py,sha256=i0a5OLaL6QIlacVyctOG09vKr3KOi8T8Izp1v7xkD5I,16112
89
90
  vibe_surf/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- vibe_surf/tools/browser_use_tools.py,sha256=ALJOoPiwG3HSR_UZZpi_1f8cQngcAEKiap8ojIgdQlo,31586
91
+ vibe_surf/tools/browser_use_tools.py,sha256=2bfttOq_pxNNVIc_NHinQzXMvMW6oTZNYFr4pvGNQYg,32313
91
92
  vibe_surf/tools/file_system.py,sha256=Tw_6J5QjCahQ3fd26CXziF1zPvRxhYM0889oK4bDhlU,19304
92
93
  vibe_surf/tools/finance_tools.py,sha256=E8rmblp57e_cp0tFbdZ7BY3_upNlk4Whk0bYc_SFCJE,27284
93
94
  vibe_surf/tools/mcp_client.py,sha256=OeCoTgyx4MoY7JxXndK6pGHIoyFOhf5r7XCbx25y1Ec,2446
94
95
  vibe_surf/tools/report_writer_tools.py,sha256=2CyTTXOahTKZo7XwyWDDhJ--1mRA0uTtUWxu_DACAY0,776
95
96
  vibe_surf/tools/vibesurf_registry.py,sha256=Z-8d9BrJl3RFMEK0Tw1Q5xNHX2kZGsnIGCTBZ3RM-pw,2159
96
- vibe_surf/tools/vibesurf_tools.py,sha256=UY93Yft_Ni6D8k94t0afZ4x_EAbh1PGsWZ4RPr12So8,113828
97
- vibe_surf/tools/views.py,sha256=1b0y9Zl1GWmDFXUiZXntsWU-8U3xrOqXdpRld5efxgI,12257
97
+ vibe_surf/tools/vibesurf_tools.py,sha256=HSKhaiI8DWtrnsCwtLONImV4VdltO2aZ-I8SiqvayoM,114366
98
+ vibe_surf/tools/views.py,sha256=PZWW2QSfk4xQ6EVTBW0dJUnv8nIRC7alAq4GIjBiWxU,12414
98
99
  vibe_surf/tools/voice_asr.py,sha256=AJG0yq_Jq-j8ulDlbPhVFfK1jch9_ASesis73iki9II,4702
99
100
  vibe_surf/tools/website_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
101
  vibe_surf/tools/website_api/douyin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -107,11 +108,11 @@ vibe_surf/tools/website_api/xhs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
107
108
  vibe_surf/tools/website_api/xhs/client.py,sha256=pKtq_d78C-XqvcpmxCEGsd3zftGkfCkF66o-XTmxk00,30858
108
109
  vibe_surf/tools/website_api/xhs/helpers.py,sha256=Dq2RyYKClBQ2ha2yEfpS1mtZswx0z9gdB2Wyljc83SI,10448
109
110
  vibe_surf/tools/website_api/youtube/__init__.py,sha256=QWmZWSqo1O6XtaWP-SuL3HrBLYINjEWEyOy-KCytGDw,1145
110
- vibe_surf/tools/website_api/youtube/client.py,sha256=GgrAvv_DWbnLHW59PnOXEHeO05s9_Abaakk-JzJ_UTc,48887
111
+ vibe_surf/tools/website_api/youtube/client.py,sha256=hq25WU9Ot19hMaVjlSLmQH660A15OSmai5u60HcjLc8,51452
111
112
  vibe_surf/tools/website_api/youtube/helpers.py,sha256=GPgqfNirLYjIpk1OObvoXd2Ktq-ahKOOKHO2WwQVXCw,12931
112
- vibesurf-0.1.29.dist-info/licenses/LICENSE,sha256=vRmTjOYvD8RLiSGYYmFHnveYNswtO1uvSk1sd-Eu7sg,2037
113
- vibesurf-0.1.29.dist-info/METADATA,sha256=6rV5k10cSipLQ7k5kWg4SLbU_Apua1gy6PLe7QAWIuQ,6109
114
- vibesurf-0.1.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
- vibesurf-0.1.29.dist-info/entry_points.txt,sha256=UxqpvMocL-PR33S6vLF2OmXn-kVzM-DneMeZeHcPMM8,48
116
- vibesurf-0.1.29.dist-info/top_level.txt,sha256=VPZGHqSb6EEqcJ4ZX6bHIuWfon5f6HXl3c7BYpbRqnY,10
117
- vibesurf-0.1.29.dist-info/RECORD,,
113
+ vibesurf-0.1.31.dist-info/licenses/LICENSE,sha256=vRmTjOYvD8RLiSGYYmFHnveYNswtO1uvSk1sd-Eu7sg,2037
114
+ vibesurf-0.1.31.dist-info/METADATA,sha256=qnmIusJp5lt4QSx58e8ZtDa-aChrh525K0nHZmGLoAg,6153
115
+ vibesurf-0.1.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
116
+ vibesurf-0.1.31.dist-info/entry_points.txt,sha256=UxqpvMocL-PR33S6vLF2OmXn-kVzM-DneMeZeHcPMM8,48
117
+ vibesurf-0.1.31.dist-info/top_level.txt,sha256=VPZGHqSb6EEqcJ4ZX6bHIuWfon5f6HXl3c7BYpbRqnY,10
118
+ vibesurf-0.1.31.dist-info/RECORD,,