Download agent/tools/sb_shell_tool.py from mfoud444/wow: direct link, hf CLI and curl.
- Browser
- Download file 9.18 kB
-
https://huggingface.co/spaces/mfoud444/wow/resolve/main/agent/tools/sb_shell_tool.py
- Command line
-
hf download hf://spaces/mfoud444/wow/agent/tools/sb_shell_tool.py
-
curl -L -o sb_shell_tool.py https://huggingface.co/spaces/mfoud444/wow/resolve/main/agent/tools/sb_shell_tool.py
9.18 kB
| from typing import Optional, Dict, List | |
| from uuid import uuid4 | |
| from agentpress.tool import ToolResult, openapi_schema, xml_schema | |
| from sandbox.sandbox import SandboxToolsBase, Sandbox | |
| from agentpress.thread_manager import ThreadManager | |
| class SandboxShellTool(SandboxToolsBase): | |
| """Tool for executing tasks in a Daytona sandbox with browser-use capabilities. | |
| Uses sessions for maintaining state between commands and provides comprehensive process management.""" | |
| def __init__(self, project_id: str, thread_manager: ThreadManager): | |
| super().__init__(project_id, thread_manager) | |
| self._sessions: Dict[str, str] = {} # Maps session names to session IDs | |
| self.workspace_path = "/workspace" # Ensure we're always operating in /workspace | |
| async def _ensure_session(self, session_name: str = "default") -> str: | |
| """Ensure a session exists and return its ID.""" | |
| if session_name not in self._sessions: | |
| session_id = str(uuid4()) | |
| try: | |
| await self._ensure_sandbox() # Ensure sandbox is initialized | |
| self.sandbox.process.create_session(session_id) | |
| self._sessions[session_name] = session_id | |
| except Exception as e: | |
| raise RuntimeError(f"Failed to create session: {str(e)}") | |
| return self._sessions[session_name] | |
| async def _cleanup_session(self, session_name: str): | |
| """Clean up a session if it exists.""" | |
| if session_name in self._sessions: | |
| try: | |
| await self._ensure_sandbox() # Ensure sandbox is initialized | |
| self.sandbox.process.delete_session(self._sessions[session_name]) | |
| del self._sessions[session_name] | |
| except Exception as e: | |
| print(f"Warning: Failed to cleanup session {session_name}: {str(e)}") | |
| async def execute_command( | |
| self, | |
| command: str, | |
| folder: Optional[str] = None, | |
| session_name: str = "default", | |
| timeout: int = 60 | |
| ) -> ToolResult: | |
| try: | |
| # Ensure sandbox is initialized | |
| await self._ensure_sandbox() | |
| # Ensure session exists | |
| session_id = await self._ensure_session(session_name) | |
| # Set up working directory | |
| cwd = self.workspace_path | |
| if folder: | |
| folder = folder.strip('/') | |
| cwd = f"{self.workspace_path}/{folder}" | |
| # Ensure we're in the correct directory before executing the command | |
| command = f"cd {cwd} && {command}" | |
| # Execute command in session | |
| from sandbox.sandbox import SessionExecuteRequest | |
| req = SessionExecuteRequest( | |
| command=command, | |
| var_async=False, # This makes the command blocking by default | |
| cwd=cwd # Still set the working directory for reference | |
| ) | |
| response = self.sandbox.process.execute_session_command( | |
| session_id=session_id, | |
| req=req, | |
| timeout=timeout | |
| ) | |
| # Get detailed logs | |
| logs = self.sandbox.process.get_session_command_logs( | |
| session_id=session_id, | |
| command_id=response.cmd_id | |
| ) | |
| if response.exit_code == 0: | |
| return self.success_response({ | |
| "output": logs, | |
| "exit_code": response.exit_code, | |
| "cwd": cwd | |
| }) | |
| else: | |
| error_msg = f"Command failed with exit code {response.exit_code}" | |
| if logs: | |
| error_msg += f": {logs}" | |
| return self.fail_response(error_msg) | |
| except Exception as e: | |
| return self.fail_response(f"Error executing command: {str(e)}") | |
| async def cleanup(self): | |
| """Clean up all sessions.""" | |
| for session_name in list(self._sessions.keys()): | |
| await self._cleanup_session(session_name) |