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.
- {vibesurf-0.1.11 → vibesurf-0.1.12}/PKG-INFO +1 -1
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/_version.py +3 -3
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/vibe_surf_agent.py +1 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/task.py +1 -1
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/cli.py +2 -1
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/llm/openai_compatible.py +72 -9
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/file_system.py +25 -3
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/PKG-INFO +1 -1
- {vibesurf-0.1.11 → vibesurf-0.1.12}/.env.example +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/.github/workflows/publish.yml +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/.gitignore +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/.python-version +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/LICENSE +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/MANIFEST.in +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/README.md +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/docs/EXECUTABLE_BUILD.md +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/docs/PYPI_SETUP.md +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/pyproject.toml +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/scripts/build-local.bat +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/scripts/build-local.sh +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/setup.cfg +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_agents.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_backend_api.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_browser.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/tests/test_tools.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/browser_use_agent.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/report_writer_prompt.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/prompts/vibe_surf_prompt.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/report_writer_agent.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/agents/views.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/activity.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/browser.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/config.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/files.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/api/models.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/manager.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/models.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/queries.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/database/schemas.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/llm_config.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/main.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/init_db.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/migrations/seed_data.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/shared_state.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/encryption.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/backend/utils/llm_factory.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/agen_browser_profile.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/agent_browser_session.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/browser_manager.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/utils.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/action_watchdog.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/browser/watchdogs/dom_watchdog.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/background.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/config.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/content.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/dev-reload.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/convert-svg.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo-preview.html +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo.icns +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/icons/logo.png +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/manifest.json +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/popup.html +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/api-client.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/file-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/history-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/main.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/markdown-it.min.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/modal-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/session-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/settings-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/scripts/ui-manager.js +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/sidepanel.html +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/activity.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/animations.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/base.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/components.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/history-modal.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/input.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/layout.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/responsive.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-environment.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-forms.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-modal.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-profiles.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-responsive.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-utilities.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/variables.css +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/common.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/llm/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/logger.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/__init__.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/browser_use_tools.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/mcp_client.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/report_writer_tools.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/vibesurf_tools.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/tools/views.py +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/SOURCES.txt +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/dependency_links.txt +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/entry_points.txt +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/requires.txt +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.egg-info/top_level.txt +0 -0
- {vibesurf-0.1.11 → vibesurf-0.1.12}/vibesurf.spec +0 -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.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 1,
|
|
31
|
+
__version__ = version = '0.1.12'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 1, 12)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
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:
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
253
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-environment.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-responsive.css
RENAMED
|
File without changes
|
{vibesurf-0.1.11 → vibesurf-0.1.12}/vibe_surf/chrome_extension/styles/settings-utilities.css
RENAMED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|