{"id":"a99ec49f-1cd9-4c52-b844-0e7538fc5b76","shortId":"4GWY9n","kind":"skill","title":"computer-use-agents","tagline":"Build AI agents that interact with computers like humans do -","description":"# Computer Use Agents\n\nBuild AI agents that interact with computers like humans do - viewing screens,\nmoving cursors, clicking buttons, and typing text. Covers Anthropic's Computer\nUse, OpenAI's Operator/CUA, and open-source alternatives. Critical focus on\nsandboxing, security, and handling the unique challenges of vision-based control.\n\n## Patterns\n\n### Perception-Reasoning-Action Loop\n\nThe fundamental architecture of computer use agents: observe screen,\nreason about next action, execute action, repeat. This loop integrates\nvision models with action execution through an iterative pipeline.\n\nKey components:\n1. PERCEPTION: Screenshot captures current screen state\n2. REASONING: Vision-language model analyzes and plans\n3. ACTION: Execute mouse/keyboard operations\n4. FEEDBACK: Observe result, continue or correct\n\nCritical insight: Vision agents are completely still during \"thinking\"\nphase (1-5 seconds), creating a detectable pause pattern.\n\n**When to use**: Building any computer use agent from scratch,Integrating vision models with desktop control,Understanding agent behavior patterns\n\nfrom anthropic import Anthropic\nfrom PIL import Image\nimport base64\nimport pyautogui\nimport time\n\nclass ComputerUseAgent:\n    \"\"\"\n    Perception-Reasoning-Action loop implementation.\n    Based on Anthropic Computer Use patterns.\n    \"\"\"\n\n    def __init__(self, client: Anthropic, model: str = \"claude-sonnet-4-20250514\"):\n        self.client = client\n        self.model = model\n        self.max_steps = 50  # Prevent runaway loops\n        self.action_delay = 0.5  # Seconds between actions\n\n    def capture_screenshot(self) -> str:\n        \"\"\"Capture screen and return base64 encoded image.\"\"\"\n        screenshot = pyautogui.screenshot()\n        # Resize for token efficiency (1280x800 is good balance)\n        screenshot = screenshot.resize((1280, 800), Image.LANCZOS)\n\n        import io\n        buffer = io.BytesIO()\n        screenshot.save(buffer, format=\"PNG\")\n        return base64.b64encode(buffer.getvalue()).decode()\n\n    def execute_action(self, action: dict) -> dict:\n        \"\"\"Execute mouse/keyboard action on the computer.\"\"\"\n        action_type = action.get(\"type\")\n\n        if action_type == \"click\":\n            x, y = action[\"x\"], action[\"y\"]\n            button = action.get(\"button\", \"left\")\n            pyautogui.click(x, y, button=button)\n            return {\"success\": True, \"action\": f\"clicked at ({x}, {y})\"}\n\n        elif action_type == \"type\":\n            text = action[\"text\"]\n            pyautogui.typewrite(text, interval=0.02)\n            return {\"success\": True, \"action\": f\"typed {len(text)} chars\"}\n\n        elif action_type == \"key\":\n            key = action[\"key\"]\n            pyautogui.press(key)\n            return {\"success\": True, \"action\": f\"pressed {key}\"}\n\n        elif action_type == \"scroll\":\n            direction = action.get(\"direction\", \"down\")\n            amount = action.get(\"amount\", 3)\n            scroll = -amount if direction == \"down\" else amount\n            pyautogui.scroll(scroll)\n            return {\"success\": True, \"action\": f\"scrolled {direction}\"}\n\n        elif action_type == \"move\":\n            x, y = action[\"x\"], action[\"y\"]\n            pyautogui.moveTo(x, y)\n            return {\"success\": True, \"action\": f\"moved to ({x}, {y})\"}\n\n        else:\n            return {\"success\": False, \"error\": f\"Unknown action: {action_type}\"}\n\n    def run(self, task: str) -> dict:\n        \"\"\"\n        Run perception-reasoning-action loop until task complete.\n\n        The loop:\n        1. Screenshot current state\n        2. Send to vision model with task context\n        3. Parse action from response\n        4. Execute action\n        5. Repeat until done or max steps\n        \"\"\"\n        messages = []\n        step_count = 0\n\n        system_prompt = \"\"\"You are a computer use agent. You can see the screen\n        and control mouse/keyboard.\n\n        Available actions (respond with JSON):\n        - {\"type\": \"click\", \"x\": 100, \"y\": 200, \"button\": \"left\"}\n        - {\"type\": \"type\", \"text\": \"hello world\"}\n        - {\"type\": \"key\", \"key\": \"enter\"}\n        - {\"type\": \"scroll\", \"direction\": \"down\", \"amount\": 3}\n        - {\"type\": \"done\", \"result\": \"task completed successfully\"}\n\n        Always respond with ONLY a JSON action object.\n        Be precise with coordinates - click exactly where needed.\n        If you see an error, try to recover.\n        \"\"\"\n\n        while step_count < self.max_steps:\n            step_count += 1\n\n            # 1. PERCEPTION: Capture current screen\n            screenshot_b64 = self.capture_screenshot()\n\n            # 2. REASONING: Send to vision model\n            user_content = [\n                {\"type\": \"text\", \"text\": f\"Task: {task}\\n\\nStep {step_count}. What action should I take?\"},\n                {\"type\": \"image\", \"source\": {\n                    \"type\": \"base64\",\n                    \"media_type\": \"image/png\",\n                    \"data\": screenshot_b64\n                }}\n            ]\n\n            messages.append({\"role\": \"user\", \"content\": user_content})\n\n            response = self.client.messages.create(\n                model=self.model,\n                max_tokens=1024,\n                system=system_prompt,\n                messages=messages\n            )\n\n            assistant_message = response.content[0].text\n            messages.append({\"role\": \"assistant\", \"content\": assistant_message})\n\n            # 3. Parse action from response\n            import json\n            try:\n                action = json.loads(assistant_message)\n            except json.JSONDecodeError:\n                # Try to extract JSON from response\n                import re\n                match = re.search(r'\\{[^}]+\\}', assistant_message)\n                if match:\n                    action = json.loads(match.group())\n                else:\n                    continue\n\n            # Check if done\n            if action.get(\"type\") == \"done\":\n                return {\n                    \"success\": True,\n                    \"result\": action.get(\"result\"),\n                    \"steps\": step_count\n                }\n\n            # 4. ACTION: Execute\n            result = self.execute_action(action)\n\n            # Small delay for UI to update\n            time.sleep(self.action_delay)\n\n        return {\n            \"success\": False,\n            \"error\": \"Max steps reached\",\n            \"steps\": step_count\n        }\n\n# Usage\nagent = ComputerUseAgent(Anthropic())\nresult = agent.run(\"Open Chrome and search for 'weather today'\")\n\n### Anti_patterns\n\n- Running without step limits (infinite loops)\n- No delay between actions (UI can't keep up)\n- Screenshots at full resolution (token explosion)\n- Ignoring action failures (no recovery)\n\n### Sandboxed Environment Pattern\n\nComputer use agents MUST run in isolated, sandboxed environments.\nNever give agents direct access to your main system - the security\nrisks are too high. Use Docker containers with virtual desktops.\n\nKey isolation requirements:\n1. NETWORK: Restrict to necessary endpoints only\n2. FILESYSTEM: Read-only or scoped to temp directories\n3. CREDENTIALS: No access to host credentials\n4. SYSCALLS: Filter dangerous system calls\n5. RESOURCES: Limit CPU, memory, time\n\nThe goal is \"blast radius minimization\" - if the agent goes wrong,\ndamage is contained to the sandbox.\n\n**When to use**: Deploying any computer use agent,Testing agent behavior safely,Running untrusted automation tasks\n\n# Dockerfile for sandboxed computer use environment\n# Based on Anthropic's reference implementation pattern\n\nFROM ubuntu:22.04\n\n# Install desktop environment\nRUN apt-get update && apt-get install -y \\\n    xvfb \\\n    x11vnc \\\n    fluxbox \\\n    xterm \\\n    firefox \\\n    python3 \\\n    python3-pip \\\n    supervisor\n\n# Security: Create non-root user\nRUN useradd -m -s /bin/bash agent && \\\n    mkdir -p /home/agent/.vnc\n\n# Install Python dependencies\nCOPY requirements.txt /tmp/\nRUN pip3 install -r /tmp/requirements.txt\n\n# Security: Drop capabilities\nRUN apt-get install -y --no-install-recommends libcap2-bin && \\\n    setcap -r /usr/bin/python3 || true\n\n# Copy agent code\nCOPY --chown=agent:agent . /app\nWORKDIR /app\n\n# Supervisor config for virtual display + VNC\nCOPY supervisord.conf /etc/supervisor/conf.d/\n\n# Expose VNC port only (not desktop directly)\nEXPOSE 5900\n\n# Run as non-root\nUSER agent\n\nCMD [\"/usr/bin/supervisord\", \"-c\", \"/etc/supervisor/conf.d/supervisord.conf\"]\n\n---\n\n# docker-compose.yml with security constraints\nversion: '3.8'\n\nservices:\n  computer-use-agent:\n    build: .\n    ports:\n      - \"5900:5900\"  # VNC for observation\n      - \"8080:8080\"  # API for control\n\n    # Security constraints\n    security_opt:\n      - no-new-privileges:true\n      - seccomp:seccomp-profile.json\n\n    # Resource limits\n    deploy:\n      resources:\n        limits:\n          cpus: '2'\n          memory: 4G\n        reservations:\n          cpus: '0.5'\n          memory: 1G\n\n    # Network isolation\n    networks:\n      - agent-network\n\n    # No access to host filesystem\n    volumes:\n      - agent-tmp:/tmp\n\n    # Read-only root filesystem\n    read_only: true\n    tmpfs:\n      - /run\n      - /var/run\n\n    # Environment\n    environment:\n      - DISPLAY=:99\n      - NO_PROXY=localhost\n\nnetworks:\n  agent-network:\n    driver: bridge\n    internal: true  # No internet by default\n\nvolumes:\n  agent-tmp:\n\n---\n\n# Python wrapper with additional runtime sandboxing\nimport subprocess\nimport os\nfrom dataclasses import dataclass\nfrom typing import Optional\n\n@dataclass\nclass SandboxConfig:\n    \"\"\"Configuration for agent sandbox.\"\"\"\n    network_allowed: list[str] = None  # Allowed domains\n    max_runtime_seconds: int = 300\n    max_memory_mb: int = 2048\n    allow_downloads: bool = False\n    allow_clipboard: bool = False\n\nclass SandboxedAgent:\n    \"\"\"\n    Run computer use agent in Docker sandbox.\n    \"\"\"\n\n    def __init__(self, config: SandboxConfig):\n        self.config = config\n        self.container_id: Optional[str] = None\n\n    def start(self):\n        \"\"\"Start sandboxed environment.\"\"\"\n        # Build network rules\n        network_rules = \"\"\n        if self.config.network_allowed:\n            for domain in self.config.network_allowed:\n                network_rules += f\"--add-host={domain}:$(dig +short {domain}) \"\n        else:\n            network_rules = \"--network=none\"\n\n        cmd = f\"\"\"\n        docker run -d \\\n            --name computer-use-sandbox-$$ \\\n            --security-opt no-new-privileges \\\n            --cap-drop ALL \\\n            --memory {self.config.max_memory_mb}m \\\n            --cpus 2 \\\n            --read-only \\\n            --tmpfs /tmp \\\n            {network_rules} \\\n            computer-use-agent:latest\n        \"\"\"\n\n        result = subprocess.run(cmd, shell=True, capture_output=True)\n        self.container_id = result.stdout.decode().strip()\n\n        # Set up kill timer\n        subprocess.Popen([\n            \"sh\", \"-c\",\n            f\"sleep {self.config.max_runtime_seconds} && docker kill {self.container_id}\"\n        ])\n\n        return self.container_id\n\n    def execute_task(self, task: str) -> dict:\n        \"\"\"Execute task in sandbox.\"\"\"\n        if not self.container_id:\n            self.start()\n\n        # Send task to agent via API\n        import requests\n        response = requests.post(\n            f\"http://localhost:8080/task\",\n            json={\"task\": task},\n            timeout=self.config.max_runtime_seconds\n        )\n\n        return response.json()\n\n    def stop(self):\n        \"\"\"Stop and remove sandbox.\"\"\"\n        if self.container_id:\n            subprocess.run(f\"docker rm -f {self.container_id}\", shell=True)\n            self.container_id = None\n\n### Anti_patterns\n\n- Running agents on host system directly\n- Giving sandbox full network access\n- Running as root in container\n- No resource limits (denial of service)\n- Persistent storage (data can leak between runs)\n\n### Anthropic Computer Use Implementation\n\nOfficial implementation pattern using Claude's computer use capability.\nClaude 3.5 Sonnet was the first frontier model to offer computer use.\nClaude Opus 4.5 is now the \"best model in the world for computer use.\"\n\nKey capabilities:\n- screenshot: Capture current screen state\n- mouse: Click, move, drag operations\n- keyboard: Type text, press keys\n- bash: Run shell commands\n- text_editor: View and edit files\n\nTool versions:\n- computer_20251124 (Opus 4.5): Adds zoom action for detailed inspection\n- computer_20250124 (All other models): Standard capabilities\n\nCritical limitation: \"Some UI elements (like dropdowns and scrollbars)\nmight be tricky for Claude to manipulate\" - Anthropic docs\n\n**When to use**: Building production computer use agents,Need highest quality vision understanding,Full desktop control (not just browser)\n\nfrom anthropic import Anthropic\nfrom anthropic.types.beta import (\n    BetaToolComputerUse20241022,\n    BetaToolBash20241022,\n    BetaToolTextEditor20241022,\n)\nimport subprocess\nimport base64\nfrom PIL import Image\nimport io\n\nclass AnthropicComputerUse:\n    \"\"\"\n    Official Anthropic Computer Use implementation.\n\n    Requires:\n    - Docker container with virtual display\n    - VNC for viewing agent actions\n    - Proper tool implementations\n    \"\"\"\n\n    def __init__(self):\n        self.client = Anthropic()\n        self.model = \"claude-sonnet-4-20250514\"  # Best for computer use\n        self.screen_size = (1280, 800)\n\n    def get_tools(self) -> list:\n        \"\"\"Define computer use tools.\"\"\"\n        return [\n            BetaToolComputerUse20241022(\n                type=\"computer_20241022\",\n                name=\"computer\",\n                display_width_px=self.screen_size[0],\n                display_height_px=self.screen_size[1],\n            ),\n            BetaToolBash20241022(\n                type=\"bash_20241022\",\n                name=\"bash\",\n            ),\n            BetaToolTextEditor20241022(\n                type=\"text_editor_20241022\",\n                name=\"str_replace_editor\",\n            ),\n        ]\n\n    def execute_tool(self, name: str, input: dict) -> dict:\n        \"\"\"Execute a tool and return result.\"\"\"\n\n        if name == \"computer\":\n            return self._handle_computer_action(input)\n        elif name == \"bash\":\n            return self._handle_bash(input)\n        elif name == \"str_replace_editor\":\n            return self._handle_editor(input)\n        else:\n            return {\"error\": f\"Unknown tool: {name}\"}\n\n    def _handle_computer_action(self, input: dict) -> dict:\n        \"\"\"Handle computer control actions.\"\"\"\n        action = input.get(\"action\")\n\n        if action == \"screenshot\":\n            # Capture via xdotool/scrot\n            subprocess.run([\"scrot\", \"/tmp/screenshot.png\"])\n\n            with open(\"/tmp/screenshot.png\", \"rb\") as f:\n                img_data = f.read()\n\n            # Resize for efficiency\n            img = Image.open(io.BytesIO(img_data))\n            img = img.resize(self.screen_size, Image.LANCZOS)\n\n            buffer = io.BytesIO()\n            img.save(buffer, format=\"PNG\")\n\n            return {\n                \"type\": \"image\",\n                \"source\": {\n                    \"type\": \"base64\",\n                    \"media_type\": \"image/png\",\n                    \"data\": base64.b64encode(buffer.getvalue()).decode()\n                }\n            }\n\n        elif action == \"mouse_move\":\n            x, y = input.get(\"coordinate\", [0, 0])\n            subprocess.run([\"xdotool\", \"mousemove\", str(x), str(y)])\n            return {\"success\": True}\n\n        elif action == \"left_click\":\n            subprocess.run([\"xdotool\", \"click\", \"1\"])\n            return {\"success\": True}\n\n        elif action == \"right_click\":\n            subprocess.run([\"xdotool\", \"click\", \"3\"])\n            return {\"success\": True}\n\n        elif action == \"double_click\":\n            subprocess.run([\"xdotool\", \"click\", \"--repeat\", \"2\", \"1\"])\n            return {\"success\": True}\n\n        elif action == \"type\":\n            text = input.get(\"text\", \"\")\n            # Use xdotool type with delay for reliability\n            subprocess.run([\"xdotool\", \"type\", \"--delay\", \"50\", text])\n            return {\"success\": True}\n\n        elif action == \"key\":\n            key = input.get(\"key\", \"\")\n            # Map common key names\n            key_map = {\n                \"return\": \"Return\",\n                \"enter\": \"Return\",\n                \"tab\": \"Tab\",\n                \"escape\": \"Escape\",\n                \"backspace\": \"BackSpace\",\n            }\n            xdotool_key = key_map.get(key.lower(), key)\n            subprocess.run([\"xdotool\", \"key\", xdotool_key])\n            return {\"success\": True}\n\n        elif action == \"scroll\":\n            direction = input.get(\"direction\", \"down\")\n            amount = input.get(\"amount\", 3)\n            button = \"5\" if direction == \"down\" else \"4\"\n            for _ in range(amount):\n                subprocess.run([\"xdotool\", \"click\", button])\n            return {\"success\": True}\n\n        return {\"error\": f\"Unknown action: {action}\"}\n\n    def _handle_bash(self, input: dict) -> dict:\n        \"\"\"Execute bash command.\"\"\"\n        command = input.get(\"command\", \"\")\n\n        # Security: Sanitize and limit commands\n        dangerous_patterns = [\"rm -rf\", \"mkfs\", \"dd if=\", \"> /dev/\"]\n        for pattern in dangerous_patterns:\n            if pattern in command:\n                return {\"error\": \"Dangerous command blocked\"}\n\n        try:\n            result = subprocess.run(\n                command,\n                shell=True,\n                capture_output=True,\n                text=True,\n                timeout=30\n            )\n            return {\n                \"stdout\": result.stdout[:10000],  # Limit output\n                \"stderr\": result.stderr[:1000],\n                \"returncode\": result.returncode\n            }\n        except subprocess.TimeoutExpired:\n            return {\"error\": \"Command timed out\"}\n\n    def _handle_editor(self, input: dict) -> dict:\n        \"\"\"Handle text editor operations.\"\"\"\n        command = input.get(\"command\")\n        path = input.get(\"path\")\n\n        if command == \"view\":\n            try:\n                with open(path, \"r\") as f:\n                    content = f.read()\n                return {\"content\": content[:50000]}  # Limit size\n            except Exception as e:\n                return {\"error\": str(e)}\n\n        elif command == \"str_replace\":\n            old_str = input.get(\"old_str\")\n            new_str = input.get(\"new_str\")\n            try:\n                with open(path, \"r\") as f:\n                    content = f.read()\n                if old_str not in content:\n                    return {\"error\": \"old_str not found in file\"}\n                content = content.replace(old_str, new_str, 1)\n                with open(path, \"w\") as f:\n                    f.write(content)\n                return {\"success\": True}\n            except Exception as e:\n                return {\"error\": str(e)}\n\n        return {\"error\": f\"Unknown editor command: {command}\"}\n\n    def run_task(self, task: str, max_steps: int = 50) -> dict:\n        \"\"\"Run computer use task with agentic loop.\"\"\"\n        messages = [{\"role\": \"user\", \"content\": task}]\n        tools = self.get_tools()\n\n        for step in range(max_steps):\n            response = self.client.beta.messages.create(\n                model=self.model,\n                max_tokens=4096,\n                tools=tools,\n                messages=messages,\n                betas=[\"computer-use-2024-10-22\"]\n            )\n\n            # Check for completion\n            if response.stop_reason == \"end_turn\":\n                return {\n                    \"success\": True,\n                    \"result\": response.content[0].text if response.content else \"\",\n                    \"steps\": step + 1\n                }\n\n            # Handle tool use\n            if response.stop_reason == \"tool_use\":\n                messages.append({\"role\": \"assistant\", \"content\": response.content})\n\n                tool_results = []\n                for block in response.content:\n                    if block.type == \"tool_use\":\n                        result = self.execute_tool(block.name, block.input)\n                        tool_results.append({\n                            \"type\": \"tool_result\",\n                            \"tool_use_id\": block.id,\n                            \"content\": result\n                        })\n\n                messages.append({\"role\": \"user\", \"content\": tool_results})\n\n        return {\"success\": False, \"error\": \"Max steps reached\"}\n\n### Anti_patterns\n\n- Not using betas=['computer-use-2024-10-22'] flag\n- Full resolution screenshots (wasteful)\n- No command sanitization for bash tool\n- Unbounded execution time\n\n### Browser-Use Pattern (Playwright-based)\n\nFor browser-only automation, using structured DOM access is more efficient\nthan pixel-based computer use. Playwright MCP allows LLMs to control\nbrowsers using accessibility snapshots rather than screenshots.\n\nAdvantages over vision-based:\n- Faster: No image processing required\n- Cheaper: Text tokens vs image tokens\n- More precise: Direct element targeting\n- More reliable: No coordinate drift\n\nWhen to use vision vs structured:\n- Vision: Desktop apps, complex UIs, visual verification\n- Structured: Web automation, form filling, data extraction\n\n**When to use**: Browser-only automation tasks,Form filling and web interactions,When speed and cost matter more than visual understanding\n\nfrom playwright.async_api import async_playwright\nfrom dataclasses import dataclass\nfrom typing import Optional\nimport asyncio\n\n@dataclass\nclass BrowserAction:\n    \"\"\"Structured browser action.\"\"\"\n    action: str  # click, type, navigate, scroll, extract\n    selector: Optional[str] = None\n    text: Optional[str] = None\n    url: Optional[str] = None\n\nclass BrowserUseAgent:\n    \"\"\"\n    Browser automation using Playwright with structured commands.\n    More efficient than pixel-based for web tasks.\n    \"\"\"\n\n    def __init__(self):\n        self.browser = None\n        self.page = None\n\n    async def start(self, headless: bool = True):\n        \"\"\"Start browser session.\"\"\"\n        self.playwright = await async_playwright().start()\n        self.browser = await self.playwright.chromium.launch(headless=headless)\n        self.page = await self.browser.new_page()\n\n    async def get_page_snapshot(self) -> dict:\n        \"\"\"\n        Get structured snapshot of page for LLM.\n        Uses accessibility tree for efficiency.\n        \"\"\"\n        # Get accessibility tree\n        snapshot = await self.page.accessibility.snapshot()\n\n        # Get simplified DOM info\n        elements = await self.page.evaluate('''() => {\n            const interactable = [];\n            const selector = 'a, button, input, select, textarea, [role=\"button\"]';\n            document.querySelectorAll(selector).forEach((el, i) => {\n                const rect = el.getBoundingClientRect();\n                if (rect.width > 0 && rect.height > 0) {\n                    interactable.push({\n                        index: i,\n                        tag: el.tagName.toLowerCase(),\n                        text: el.textContent?.trim().slice(0, 100),\n                        type: el.type,\n                        placeholder: el.placeholder,\n                        name: el.name,\n                        id: el.id,\n                        class: el.className\n                    });\n                }\n            });\n            return interactable;\n        }''')\n\n        return {\n            \"url\": self.page.url,\n            \"title\": await self.page.title(),\n            \"accessibility_tree\": snapshot,\n            \"interactable_elements\": elements[:50]  # Limit for token efficiency\n        }\n\n    async def execute_action(self, action: BrowserAction) -> dict:\n        \"\"\"Execute structured browser action.\"\"\"\n\n        try:\n            if action.action == \"navigate\":\n                await self.page.goto(action.url, wait_until=\"domcontentloaded\")\n                return {\"success\": True, \"url\": self.page.url}\n\n            elif action.action == \"click\":\n                await self.page.click(action.selector, timeout=5000)\n                await self.page.wait_for_load_state(\"networkidle\", timeout=5000)\n                return {\"success\": True}\n\n            elif action.action == \"type\":\n                await self.page.fill(action.selector, action.text)\n                return {\"success\": True}\n\n            elif action.action == \"scroll\":\n                direction = action.text or \"down\"\n                distance = 500 if direction == \"down\" else -500\n                await self.page.evaluate(f\"window.scrollBy(0, {distance})\")\n                return {\"success\": True}\n\n            elif action.action == \"extract\":\n                # Extract text content\n                if action.selector:\n                    text = await self.page.text_content(action.selector)\n                else:\n                    text = await self.page.text_content(\"body\")\n                return {\"success\": True, \"text\": text[:5000]}\n\n            elif action.action == \"screenshot\":\n                # Fall back to vision when needed\n                screenshot = await self.page.screenshot(type=\"png\")\n                import base64\n                return {\n                    \"success\": True,\n                    \"image\": base64.b64encode(screenshot).decode()\n                }\n\n        except Exception as e:\n            return {\"success\": False, \"error\": str(e)}\n\n        return {\"success\": False, \"error\": f\"Unknown action: {action.action}\"}\n\n    async def run_with_llm(self, task: str, llm_client, max_steps: int = 20):\n        \"\"\"\n        Run browser task with LLM decision making.\n        Uses structured DOM instead of screenshots.\n        \"\"\"\n\n        system_prompt = \"\"\"You are a browser automation agent. You receive\n        page snapshots with interactable elements and decide actions.\n\n        Respond with JSON action:\n        - {\"action\": \"navigate\", \"url\": \"https://...\"}\n        - {\"action\": \"click\", \"selector\": \"button.submit\"}\n        - {\"action\": \"type\", \"selector\": \"input[name='email']\", \"text\": \"...\"}\n        - {\"action\": \"scroll\", \"text\": \"down\"}\n        - {\"action\": \"extract\", \"selector\": \".results\"}\n        - {\"action\": \"done\", \"result\": \"task completed\"}\n\n        Use CSS selectors based on the element info provided.\n        Prefer id > name > class > text content for selectors.\n        \"\"\"\n\n        messages = []\n\n        for step in range(max_steps):\n            # Get current page state\n            snapshot = await self.get_page_snapshot()\n\n            user_message = f\"\"\"Task: {task}\n\n            Current page:\n            URL: {snapshot['url']}\n            Title: {snapshot['title']}\n\n            Interactable elements:\n            {snapshot['interactable_elements']}\n\n            What action should I take?\"\"\"\n\n            messages.append({\"role\": \"user\", \"content\": user_message})\n\n            # Get LLM decision\n            response = llm_client.messages.create(\n                model=\"claude-sonnet-4-20250514\",\n                max_tokens=1024,\n                system=system_prompt,\n                messages=messages\n            )\n\n            assistant_text = response.content[0].text\n            messages.append({\"role\": \"assistant\", \"content\": assistant_text})\n\n            # Parse and execute\n            import json\n            action_dict = json.loads(assistant_text)\n\n            if action_dict.get(\"action\") == \"done\":\n                return {\"success\": True, \"result\": action_dict.get(\"result\")}\n\n            action = BrowserAction(**action_dict)\n            result = await self.execute_action(action)\n\n            if not result.get(\"success\"):\n                messages.append({\n                    \"role\": \"user\",\n                    \"content\": f\"Action failed: {result.get('error')}\"\n                })\n\n            await asyncio.sleep(0.5)  # Rate limit\n\n        return {\"success\": False, \"error\": \"Max steps reached\"}\n\n    async def close(self):\n        \"\"\"Clean up browser.\"\"\"\n        if self.browser:\n            await self.browser.close()\n        if hasattr(self, 'playwright'):\n            await self.playwright.stop()\n\n# Usage\nasync def main():\n    agent = BrowserUseAgent()\n    await agent.start(headless=False)\n\n    from anthropic import Anthropic\n    result = await agent.run_with_llm(\n        \"Go to weather.com and find the weather for New York\",\n        Anthropic()\n    )\n\n    print(result)\n    await agent.close()\n\nasyncio.run(main())\n\n### Anti_patterns\n\n- Using screenshots when DOM access works\n- Not waiting for page loads\n- Hardcoded selectors that break\n- No error recovery for stale elements\n\n### User Confirmation Pattern\n\nFor sensitive actions, agents should pause and ask for human confirmation.\n\"ChatGPT agent also pauses and asks for confirmation prior to taking\nsensitive steps such as completing a purchase.\"\n\nSensitivity levels:\n1. LOW: Navigation, reading (auto-approve)\n2. MEDIUM: Form filling, clicking (log, maybe confirm)\n3. HIGH: Purchases, authentication, file operations (always confirm)\n4. CRITICAL: Credential entry, financial transactions (confirm + review)\n\n**When to use**: Actions with real-world consequences,Financial transactions,Authentication flows,File modifications\n\nfrom enum import Enum\nfrom dataclasses import dataclass\nfrom typing import Callable, Optional\nimport asyncio\n\nclass ActionSeverity(Enum):\n    LOW = \"low\"           # Auto-approve\n    MEDIUM = \"medium\"     # Log, optional confirm\n    HIGH = \"high\"         # Always confirm\n    CRITICAL = \"critical\" # Confirm + review details\n\n@dataclass\nclass SensitiveAction:\n    \"\"\"Action that may need user confirmation.\"\"\"\n    action_type: str\n    description: str\n    severity: ActionSeverity\n    details: dict\n\nclass ConfirmationGate:\n    \"\"\"\n    Gate sensitive actions through user confirmation.\n    \"\"\"\n\n    # Action type -> severity mapping\n    ACTION_SEVERITY = {\n        # LOW - auto-approve\n        \"navigate\": ActionSeverity.LOW,\n        \"scroll\": ActionSeverity.LOW,\n        \"read\": ActionSeverity.LOW,\n        \"screenshot\": ActionSeverity.LOW,\n\n        # MEDIUM - log and maybe confirm\n        \"click\": ActionSeverity.MEDIUM,\n        \"type\": ActionSeverity.MEDIUM,\n        \"search\": ActionSeverity.MEDIUM,\n\n        # HIGH - always confirm\n        \"download\": ActionSeverity.HIGH,\n        \"submit_form\": ActionSeverity.HIGH,\n        \"login\": ActionSeverity.HIGH,\n        \"file_write\": ActionSeverity.HIGH,\n\n        # CRITICAL - confirm with full review\n        \"purchase\": ActionSeverity.CRITICAL,\n        \"enter_password\": ActionSeverity.CRITICAL,\n        \"enter_credit_card\": ActionSeverity.CRITICAL,\n        \"send_money\": ActionSeverity.CRITICAL,\n        \"delete\": ActionSeverity.CRITICAL,\n    }\n\n    def __init__(\n        self,\n        confirm_callback: Callable[[SensitiveAction], bool] = None,\n        auto_confirm_low: bool = True,\n        auto_confirm_medium: bool = False\n    ):\n        self.confirm_callback = confirm_callback or self._default_confirm\n        self.auto_confirm_low = auto_confirm_low\n        self.auto_confirm_medium = auto_confirm_medium\n        self.action_log = []\n\n    def _default_confirm(self, action: SensitiveAction) -> bool:\n        \"\"\"Default confirmation via CLI prompt.\"\"\"\n        print(f\"\\n{'='*60}\")\n        print(f\"ACTION CONFIRMATION REQUIRED\")\n        print(f\"{'='*60}\")\n        print(f\"Type: {action.action_type}\")\n        print(f\"Severity: {action.severity.value.upper()}\")\n        print(f\"Description: {action.description}\")\n        print(f\"Details: {action.details}\")\n        print(f\"{'='*60}\")\n\n        while True:\n            response = input(\"Allow this action? [y/n]: \").lower().strip()\n            if response in ['y', 'yes']:\n                return True\n            elif response in ['n', 'no']:\n                return False\n\n    def classify_action(self, action_type: str, context: dict) -> ActionSeverity:\n        \"\"\"Classify action severity, considering context.\"\"\"\n        base_severity = self.ACTION_SEVERITY.get(action_type, ActionSeverity.MEDIUM)\n\n        # Escalate based on context\n        if context.get(\"involves_credentials\"):\n            return ActionSeverity.CRITICAL\n        if context.get(\"involves_money\"):\n            return ActionSeverity.CRITICAL\n        if context.get(\"irreversible\"):\n            return max(base_severity, ActionSeverity.HIGH, key=lambda x: x.value)\n\n        return base_severity\n\n    def check_action(\n        self,\n        action_type: str,\n        description: str,\n        details: dict = None\n    ) -> tuple[bool, str]:\n        \"\"\"\n        Check if action should proceed.\n        Returns (approved, reason).\n        \"\"\"\n        details = details or {}\n        severity = self.classify_action(action_type, details)\n\n        action = SensitiveAction(\n            action_type=action_type,\n            description=description,\n            severity=severity,\n            details=details\n        )\n\n        # Log all actions\n        self.action_log.append({\n            \"action\": action,\n            \"timestamp\": __import__('datetime').datetime.now().isoformat()\n        })\n\n        # Auto-approve low severity\n        if severity == ActionSeverity.LOW and self.auto_confirm_low:\n            return True, \"auto-approved (low severity)\"\n\n        # Maybe auto-approve medium\n        if severity == ActionSeverity.MEDIUM and self.auto_confirm_medium:\n            return True, \"auto-approved (medium severity)\"\n\n        # Request confirmation\n        approved = self.confirm_callback(action)\n\n        if approved:\n            return True, \"user approved\"\n        else:\n            return False, \"user rejected\"\n\nclass ConfirmedComputerUseAgent:\n    \"\"\"\n    Computer use agent with confirmation gates.\n    \"\"\"\n\n    def __init__(self, base_agent, confirmation_gate: ConfirmationGate):\n        self.agent = base_agent\n        self.gate = confirmation_gate\n\n    def execute_action(self, action: dict) -> dict:\n        \"\"\"Execute action with confirmation check.\"\"\"\n        action_type = action.get(\"type\", \"unknown\")\n\n        # Build description\n        if action_type == \"click\":\n            desc = f\"Click at ({action.get('x')}, {action.get('y')})\"\n        elif action_type == \"type\":\n            text = action.get('text', '')\n            # Mask if looks like password\n            if self._looks_sensitive(text):\n                desc = f\"Type sensitive text ({len(text)} chars)\"\n            else:\n                desc = f\"Type: {text[:50]}...\"\n        else:\n            desc = f\"Execute: {action_type}\"\n\n        # Context for severity classification\n        context = {\n            \"involves_credentials\": self._looks_sensitive(action.get(\"text\", \"\")),\n            \"involves_money\": self._mentions_money(action),\n        }\n\n        # Check with gate\n        approved, reason = self.gate.check_action(\n            action_type, desc, context\n        )\n\n        if not approved:\n            return {\n                \"success\": False,\n                \"error\": f\"Action blocked: {reason}\",\n                \"action\": action_type\n            }\n\n        # Execute if approved\n        return self.agent.execute_action(action)\n\n    def _looks_sensitive(self, text: str) -> bool:\n        \"\"\"Check if text looks like sensitive data.\"\"\"\n        if not text:\n            return False\n        # Common patterns\n        patterns = [\n            r'\\b\\d{16}\\b',  # Credit card\n            r'\\b\\d{3,4}\\b.*\\b\\d{3,4}\\b',  # CVV-like\n            r'password',\n            r'secret',\n            r'api.?key',\n            r'token'\n        ]\n        import re\n        return any(re.search(p, text.lower()) for p in patterns)\n\n    def _mentions_money(self, action: dict) -> bool:\n        \"\"\"Check if action involves money.\"\"\"\n        text = str(action)\n        money_patterns = [\n            r'\\$\\d+', r'pay', r'purchase', r'buy', r'checkout',\n            r'credit', r'debit', r'invoice', r'payment'\n        ]\n        import re\n        return any(re.search(p, text.lower()) for p in money_patterns)\n\n# Usage\ngate = ConfirmationGate(\n    auto_confirm_low=True,\n    auto_confirm_medium=False  # Confirm clicks, typing\n)\n\nagent = ConfirmedComputerUseAgent(base_agent, gate)\nresult = agent.execute_action({\"type\": \"click\", \"x\": 500, \"y\": 300})\n\n### Anti_patterns\n\n- Auto-approving all actions\n- Not logging rejected actions\n- Showing full passwords in confirmation\n- No timeout on confirmation (hangs forever)\n\n### Action Logging Pattern\n\nAll computer use agent actions should be logged for:\n1. Debugging failed automations\n2. Security auditing\n3. Reproducibility\n4. Compliance requirements\n\nLog format should capture:\n- Timestamp\n- Action type and parameters\n- Screenshot before/after\n- Success/failure status\n- Model reasoning (if available)\n\n**When to use**: Production computer use deployments,Debugging automation failures,Security-sensitive environments\n\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom typing import Optional, Any\nimport json\nimport os\n\n@dataclass\nclass ActionLogEntry:\n    \"\"\"Single action log entry.\"\"\"\n    timestamp: datetime\n    action_type: str\n    parameters: dict\n    success: bool\n    error: Optional[str] = None\n    screenshot_before: Optional[str] = None  # Path to screenshot\n    screenshot_after: Optional[str] = None\n    model_reasoning: Optional[str] = None\n    duration_ms: Optional[int] = None\n\n    def to_dict(self) -> dict:\n        return {\n            \"timestamp\": self.timestamp.isoformat(),\n            \"action_type\": self.action_type,\n            \"parameters\": self._sanitize_params(self.parameters),\n            \"success\": self.success,\n            \"error\": self.error,\n            \"screenshot_before\": self.screenshot_before,\n            \"screenshot_after\": self.screenshot_after,\n            \"model_reasoning\": self.model_reasoning,\n            \"duration_ms\": self.duration_ms\n        }\n\n    def _sanitize_params(self, params: dict) -> dict:\n        \"\"\"Remove sensitive data from params.\"\"\"\n        sanitized = {}\n        sensitive_keys = ['password', 'secret', 'token', 'key', 'credit_card']\n\n        for k, v in params.items():\n            if any(s in k.lower() for s in sensitive_keys):\n                sanitized[k] = \"[REDACTED]\"\n            elif isinstance(v, str) and len(v) > 100:\n                sanitized[k] = v[:100] + \"...[truncated]\"\n            else:\n                sanitized[k] = v\n\n        return sanitized\n\n@dataclass\nclass TaskSession:\n    \"\"\"A complete task execution session.\"\"\"\n    session_id: str\n    task: str\n    start_time: datetime\n    end_time: Optional[datetime] = None\n    actions: list[ActionLogEntry] = field(default_factory=list)\n    success: bool = False\n    final_result: Optional[str] = None\n\nclass ActionLogger:\n    \"\"\"\n    Comprehensive action logging for computer use agents.\n    \"\"\"\n\n    def __init__(self, log_dir: str = \"./agent_logs\"):\n        self.log_dir = log_dir\n        self.screenshot_dir = os.path.join(log_dir, \"screenshots\")\n        os.makedirs(self.screenshot_dir, exist_ok=True)\n\n        self.current_session: Optional[TaskSession] = None\n\n    def start_session(self, task: str) -> str:\n        \"\"\"Start a new task session.\"\"\"\n        import uuid\n        session_id = str(uuid.uuid4())[:8]\n\n        self.current_session = TaskSession(\n            session_id=session_id,\n            task=task,\n            start_time=datetime.now()\n        )\n\n        return session_id\n\n    def log_action(\n        self,\n        action_type: str,\n        parameters: dict,\n        success: bool,\n        error: Optional[str] = None,\n        screenshot_before: bytes = None,\n        screenshot_after: bytes = None,\n        model_reasoning: str = None,\n        duration_ms: int = None\n    ):\n        \"\"\"Log a single action.\"\"\"\n        if not self.current_session:\n            raise RuntimeError(\"No active session\")\n\n        # Save screenshots if provided\n        screenshot_paths = {}\n        timestamp_str = datetime.now().strftime(\"%Y%m%d_%H%M%S_%f\")\n\n        if screenshot_before:\n            path = os.path.join(\n                self.screenshot_dir,\n                f\"{self.current_session.session_id}_{timestamp_str}_before.png\"\n            )\n            with open(path, \"wb\") as f:\n                f.write(screenshot_before)\n            screenshot_paths[\"before\"] = path\n\n        if screenshot_after:\n            path = os.path.join(\n                self.screenshot_dir,\n                f\"{self.current_session.session_id}_{timestamp_str}_after.png\"\n            )\n            with open(path, \"wb\") as f:\n                f.write(screenshot_after)\n            screenshot_paths[\"after\"] = path\n\n        # Create log entry\n        entry = ActionLogEntry(\n            timestamp=datetime.now(),\n            action_type=action_type,\n            parameters=parameters,\n            success=success,\n            error=error,\n            screenshot_before=screenshot_paths.get(\"before\"),\n            screenshot_after=screenshot_paths.get(\"after\"),\n            model_reasoning=model_reasoning,\n            duration_ms=duration_ms\n        )\n\n        self.current_session.actions.append(entry)\n\n        # Also append to running log file\n        self._append_to_log(entry)\n\n    def _append_to_log(self, entry: ActionLogEntry):\n        \"\"\"Append entry to JSONL log file.\"\"\"\n        log_file = os.path.join(\n            self.log_dir,\n            f\"session_{self.current_session.session_id}.jsonl\"\n        )\n\n        with open(log_file, \"a\") as f:\n            f.write(json.dumps(entry.to_dict()) + \"\\n\")\n\n    def end_session(self, success: bool, result: str = None):\n        \"\"\"End current session.\"\"\"\n        if not self.current_session:\n            return\n\n        self.current_session.end_time = datetime.now()\n        self.current_session.success = success\n        self.current_session.final_result = result\n\n        # Write session summary\n        summary_file = os.path.join(\n            self.log_dir,\n            f\"session_{self.current_session.session_id}_summary.json\"\n        )\n\n        summary = {\n            \"session_id\": self.current_session.session_id,\n            \"task\": self.current_session.task,\n            \"start_time\": self.current_session.start_time.isoformat(),\n            \"end_time\": self.current_session.end_time.isoformat(),\n            \"duration_seconds\": (\n                self.current_session.end_time -\n                self.current_session.start_time\n            ).total_seconds(),\n            \"total_actions\": len(self.current_session.actions),\n            \"successful_actions\": sum(\n                1 for a in self.current_session.actions if a.success\n            ),\n            \"failed_actions\": sum(\n                1 for a in self.current_session.actions if not a.success\n            ),\n            \"success\": success,\n            \"final_result\": result\n        }\n\n        with open(summary_file, \"w\") as f:\n            json.dump(summary, f, indent=2)\n\n        self.current_session = None\n\n    def get_session_replay(self, session_id: str) -> list[dict]:\n        \"\"\"Get all actions from a session for replay/debugging.\"\"\"\n        log_file = os.path.join(self.log_dir, f\"session_{session_id}.jsonl\")\n\n        actions = []\n        with open(log_file, \"r\") as f:\n            for line in f:\n                actions.append(json.loads(line))\n\n        return actions\n\n# Integration with agent\nclass LoggedComputerUseAgent:\n    \"\"\"Computer use agent with comprehensive logging.\"\"\"\n\n    def __init__(self, base_agent, logger: ActionLogger):\n        self.agent = base_agent\n        self.logger = logger\n\n    def run_task(self, task: str) -> dict:\n        \"\"\"Run task with full logging.\"\"\"\n        session_id = self.logger.start_session(task)\n\n        try:\n            result = self._run_with_logging(task)\n            self.logger.end_session(\n                success=result.get(\"success\", False),\n                result=result.get(\"result\")\n            )\n            return result\n        except Exception as e:\n            self.logger.end_session(success=False, result=str(e))\n            raise\n\n    def _run_with_logging(self, task: str) -> dict:\n        \"\"\"Internal run with action logging.\"\"\"\n        # This would wrap the base agent's run method\n        # and log each action\n        pass\n\n### Anti_patterns\n\n- Not sanitizing sensitive data in logs\n- Storing screenshots indefinitely (storage costs)\n- Not rotating log files\n- Logging synchronously (blocks agent)\n\n## Sharp Edges\n\n### Web Content Can Hijack Your Agent\n\nSeverity: CRITICAL\n\nSituation: Computer use agent browsing the web\n\nSymptoms:\nAgent suddenly performs unexpected actions. Clicks malicious links.\nEnters credentials on phishing sites. Downloads files it shouldn't.\nIgnores your instructions and follows embedded commands instead.\n\nWhy this breaks:\n\"While all agents that process untrusted content are subject to prompt\ninjection risks, browser use amplifies this risk in two ways. First,\nthe attack surface is vast: every webpage, embedded document, advertisement,\nand dynamically loaded script represents a potential vector for malicious\ninstructions. Second, browser agents can take many different actions—\nnavigating to URLs, filling forms, clicking buttons, downloading files—\nthat attackers can exploit.\"\n\nReal attacks have already happened:\n- \"Microsoft Copilot agents were hijacked with emails containing malicious\n  instructions, which allowed attackers to extract entire CRM databases.\"\n- \"Google's Workspace services were manipulated—hidden prompts inside\n  calendar invites and emails tricked Gemini agents into deleting events\n  and exposing sensitive messages.\"\n\nEven a 1% attack success rate represents meaningful risk at scale.\n\nRecommended fix:\n\n## Defense in depth - no single solution works\n\n1. Sandboxing (most effective):\n   ```python\n   # Docker with strict isolation\n   docker run \\\n       --security-opt no-new-privileges \\\n       --cap-drop ALL \\\n       --network none \\  # No internet!\n       --read-only \\\n       computer-use-agent\n   ```\n\n2. Classifier-based detection:\n   ```python\n   def scan_for_injection(content: str) -> bool:\n       \"\"\"Detect prompt injection attempts.\"\"\"\n       patterns = [\n           r\"ignore.*instructions\",\n           r\"disregard.*previous\",\n           r\"new.*instructions\",\n           r\"you are now\",\n           r\"act as if\",\n           r\"pretend to be\",\n       ]\n       return any(re.search(p, content.lower()) for p in patterns)\n\n   # Check page content before processing\n   page_text = await page.text_content(\"body\")\n   if scan_for_injection(page_text):\n       return {\"error\": \"Potential injection detected\"}\n   ```\n\n3. User confirmation for sensitive actions:\n   ```python\n   SENSITIVE_ACTIONS = {\"download\", \"submit\", \"login\", \"purchase\"}\n\n   if action_type in SENSITIVE_ACTIONS:\n       if not await get_user_confirmation(action):\n           return {\"error\": \"User rejected action\"}\n   ```\n\n4. Scoped credentials:\n   - Never give agent access to all credentials\n   - Use temporary, limited tokens\n   - Revoke after task completion\n\n### Vision Agents Click Exact Centers\n\nSeverity: MEDIUM\n\nSituation: Agent clicking on UI elements\n\nSymptoms:\nAgent's clicks are detectable as non-human. Websites may block or\nCAPTCHA the agent. Anti-bot systems flag the interaction.\n\nWhy this breaks:\n\"When a vision model identifies a button, it calculates the center.\nClick coordinates land at mathematically precise positions—often exact\nelement centers or grid-aligned pixel values. Humans don't click centers;\ntheir click distributions follow a Gaussian pattern around targets.\"\n\nThe screenshot loop also creates detectable patterns:\n\"Predictable pauses. Vision agents are completely still during their\n'thinking' phase. The pattern looks like: Action → Complete stillness\n(1-5 seconds) → Action → Complete stillness → Action.\"\n\nSophisticated anti-bot systems detect:\n- Perfect center clicks\n- No mouse movement during \"thinking\"\n- Consistent timing between actions\n- Lack of micro-movements and hesitation\n\nRecommended fix:\n\n## Add human-like variance to actions\n\n```python\nimport random\nimport time\n\ndef humanized_click(x: int, y: int) -> tuple[int, int]:\n    \"\"\"Add human-like variance to click coordinates.\"\"\"\n    # Gaussian distribution around target\n    # Humans typically land within ~10px of target\n    x_offset = int(random.gauss(0, 5))\n    y_offset = int(random.gauss(0, 5))\n\n    return (x + x_offset, y + y_offset)\n\ndef humanized_delay():\n    \"\"\"Add human-like delay between actions.\"\"\"\n    # Humans have variable reaction times\n    base_delay = random.uniform(0.3, 0.8)\n    # Occasionally longer pauses (reading, thinking)\n    if random.random() < 0.2:\n        base_delay += random.uniform(0.5, 2.0)\n    time.sleep(base_delay)\n\ndef humanized_movement(from_pos: tuple, to_pos: tuple):\n    \"\"\"Move mouse in curved path like human.\"\"\"\n    # Bezier curve or similar\n    # Humans don't move in straight lines\n    steps = random.randint(10, 20)\n    for i in range(steps):\n        t = i / steps\n        # Simple curve approximation\n        x = from_pos[0] + (to_pos[0] - from_pos[0]) * t\n        y = from_pos[1] + (to_pos[1] - from_pos[1]) * t\n        # Add wobble\n        x += random.gauss(0, 2)\n        y += random.gauss(0, 2)\n        pyautogui.moveTo(int(x), int(y))\n        time.sleep(0.01)\n```\n\n## Rotate user agents and fingerprints\n\n```python\nUSER_AGENTS = [\n    \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120...\",\n    \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/...\",\n    # ... more realistic agents\n]\n\nawait page.set_extra_http_headers({\n    \"User-Agent\": random.choice(USER_AGENTS)\n})\n```\n\n### Dropdowns, Scrollbars, and Drags Are Unreliable\n\nSeverity: HIGH\n\nSituation: Agent interacting with complex UI elements\n\nSymptoms:\nAgent fails to select dropdown options. Scroll doesn't work as expected.\nDrag and drop completely fails. Hover menus disappear before clicking.\n\nWhy this breaks:\n\"Computer Use currently struggles with certain interface interactions,\nparticularly scrolling, dragging, and zooming operations. Some UI elements\n(like dropdowns and scrollbars) might be tricky for Claude to manipulate.\"\n- Anthropic documentation\n\nWhy these are hard:\n1. Dropdowns: Options appear after click, need second click to select\n2. Scrollbars: Small targets, need precise positioning\n3. Drag: Requires coordinated mouse down, move, mouse up\n4. Hover menus: Disappear when mouse moves away\n5. Canvas elements: No semantic information visible\n\nVision models see pixels, not DOM structure. They don't \"know\" that\na dropdown is a dropdown - they have to infer from visual cues.\n\nRecommended fix:\n\n## Use keyboard alternatives when possible\n\n```python\n# Instead of clicking dropdown, use keyboard\nasync def select_dropdown_option(page, dropdown_selector, option_text):\n    # Focus the dropdown\n    await page.click(dropdown_selector)\n    await asyncio.sleep(0.3)\n\n    # Use keyboard to find option\n    await page.keyboard.type(option_text[:3])  # Type first letters\n    await asyncio.sleep(0.2)\n    await page.keyboard.press(\"Enter\")\n```\n\n## Break complex actions into steps\n\n```python\n# Instead of drag-and-drop\nasync def reliable_drag(page, source, target):\n    # Step 1: Click and hold\n    await page.mouse.move(source[\"x\"], source[\"y\"])\n    await page.mouse.down()\n    await asyncio.sleep(0.2)\n\n    # Step 2: Move in steps\n    steps = 10\n    for i in range(steps):\n        x = source[\"x\"] + (target[\"x\"] - source[\"x\"]) * i / steps\n        y = source[\"y\"] + (target[\"y\"] - source[\"y\"]) * i / steps\n        await page.mouse.move(x, y)\n        await asyncio.sleep(0.05)\n\n    # Step 3: Release\n    await page.mouse.move(target[\"x\"], target[\"y\"])\n    await asyncio.sleep(0.1)\n    await page.mouse.up()\n```\n\n## Fall back to DOM access for web\n\n```python\n# If vision fails, try direct DOM manipulation\nasync def robust_select(page, select_selector, value):\n    try:\n        # Try vision approach first\n        await vision_agent.select(select_selector, value)\n    except Exception:\n        # Fall back to direct DOM\n        await page.select_option(select_selector, value=value)\n```\n\n## Add verification after action\n\n```python\nasync def verified_scroll(page, direction):\n    # Get current scroll position\n    before = await page.evaluate(\"window.scrollY\")\n\n    # Attempt scroll\n    await page.mouse.wheel(0, 500 if direction == \"down\" else -500)\n    await asyncio.sleep(0.3)\n\n    # Verify it worked\n    after = await page.evaluate(\"window.scrollY\")\n    if before == after:\n        # Try alternative method\n        await page.keyboard.press(\"PageDown\" if direction == \"down\" else \"PageUp\")\n```\n\n### Agents Are 2-5x Slower Than Humans\n\nSeverity: MEDIUM\n\nSituation: Automating any computer task\n\nSymptoms:\nTask that takes human 1 minute takes agent 3-5 minutes.\nUsers complain about speed. Timeouts occur.\n\nWhy this breaks:\n\"The technology can be slow compared to human operators, often requiring\nmultiple screenshots and analysis cycles.\"\n\nWhy so slow:\n1. Screenshot capture: 100-500ms\n2. Vision model inference: 1-5 seconds per screenshot\n3. Action execution: 200-500ms\n4. Wait for UI update: 500-1000ms\n5. Total per action: 2-7 seconds\n\nA task requiring 20 actions takes 40-140 seconds minimum.\nHumans do the same actions in 20-30 seconds.\n\nRecommended fix:\n\n## Accept the tradeoff\n\nComputer use is for:\n- Tasks humans don't want to do (repetitive)\n- Tasks that can run in background\n- Tasks where accuracy > speed\n\n## Optimize where possible\n\n```python\n# 1. Reduce screenshot resolution\nSCREEN_SIZE = (1280, 800)  # Not 4K\n\n# 2. Batch similar actions\n# Instead of: type \"hello\", wait, type \" world\"\nawait page.type(\"hello world\")\n\n# 3. Parallelize independent tasks\n# Run multiple sandboxed agents concurrently\n\n# 4. Cache repeated computations\n# If same screenshot, reuse analysis\n\n# 5. Use smaller models for simple decisions\nsimple_model = \"claude-haiku-...\"  # For \"is task done?\"\ncomplex_model = \"claude-sonnet-...\"  # For complex reasoning\n```\n\n## Set realistic expectations\n\n```python\n# Estimate task duration\ndef estimate_duration(task_complexity: str) -> int:\n    \"\"\"Estimate task duration in seconds.\"\"\"\n    estimates = {\n        \"simple\": 30,    # Single page, few actions\n        \"medium\": 120,   # Multi-page, moderate actions\n        \"complex\": 300,  # Many pages, complex interactions\n    }\n    return estimates.get(task_complexity, 120)\n\n# Inform users\nestimated = estimate_duration(\"medium\")\nprint(f\"Estimated completion: {estimated // 60}m {estimated % 60}s\")\n```\n\n### Screenshots Fill Up Context Window Fast\n\nSeverity: HIGH\n\nSituation: Long-running computer use tasks\n\nSymptoms:\nAgent forgets earlier steps. Starts repeating actions.\nErrors increase as task progresses. Costs explode.\n\nWhy this breaks:\nEach screenshot is ~1500-3000 tokens. A task with 30 screenshots\nuses 45,000-90,000 tokens just for images - before any text.\n\nClaude's context window is finite. When full:\n- Older context gets dropped\n- Agent loses memory of earlier steps\n- Task coherence decreases\n\n\"Getting agents to make consistent progress across multiple context\nwindows remains an open problem. The core challenge is that they must\nwork in discrete sessions, and each new session begins with no memory\nof what came before.\" - Anthropic engineering blog\n\nRecommended fix:\n\n## Implement context management\n\n```python\nclass ContextManager:\n    \"\"\"Manage context window usage for computer use.\"\"\"\n\n    MAX_SCREENSHOTS = 10  # Keep only recent screenshots\n    MAX_TOKENS = 100000\n\n    def __init__(self):\n        self.messages = []\n        self.screenshot_count = 0\n\n    def add_screenshot(self, screenshot_b64: str, description: str):\n        \"\"\"Add screenshot with automatic pruning.\"\"\"\n        self.screenshot_count += 1\n\n        # Keep only recent screenshots\n        if self.screenshot_count > self.MAX_SCREENSHOTS:\n            self._prune_old_screenshots()\n\n        # Store with description for context\n        self.messages.append({\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": description},\n                {\"type\": \"image\", \"source\": {...}}\n            ]\n        })\n\n    def _prune_old_screenshots(self):\n        \"\"\"Remove old screenshots, keep text summaries.\"\"\"\n        new_messages = []\n        screenshots_kept = 0\n\n        for msg in reversed(self.messages):\n            if self._has_image(msg):\n                if screenshots_kept < self.MAX_SCREENSHOTS:\n                    new_messages.insert(0, msg)\n                    screenshots_kept += 1\n                else:\n                    # Convert to text summary\n                    summary = self._summarize_screenshot(msg)\n                    new_messages.insert(0, {\n                        \"role\": msg[\"role\"],\n                        \"content\": summary\n                    })\n            else:\n                new_messages.insert(0, msg)\n\n        self.messages = new_messages\n\n    def _summarize_screenshot(self, msg) -> str:\n        \"\"\"Summarize screenshot to text.\"\"\"\n        # Extract any text description\n        for content in msg.get(\"content\", []):\n            if content.get(\"type\") == \"text\":\n                return f\"[Previous screenshot: {content['text']}]\"\n        return \"[Previous screenshot - details pruned]\"\n\n    def add_checkpoint(self):\n        \"\"\"Create a checkpoint summary.\"\"\"\n        summary = self._create_progress_summary()\n        self.messages.append({\n            \"role\": \"user\",\n            \"content\": f\"CHECKPOINT: {summary}\"\n        })\n```\n\n## Use checkpointing for long tasks\n\n```python\nasync def run_with_checkpoints(task: str, checkpoint_every: int = 10):\n    \"\"\"Run task with periodic checkpoints.\"\"\"\n    context = ContextManager()\n    step = 0\n\n    while not task_complete:\n        step += 1\n\n        # Take action...\n\n        if step % checkpoint_every == 0:\n            # Create checkpoint\n            context.add_checkpoint()\n\n            # Optional: persist to disk\n            save_checkpoint(context, step)\n```\n\n## Break into subtasks\n\n```python\n# Instead of one 50-step task:\nsubtasks = [\n    \"Navigate to the website and login\",\n    \"Find the settings page\",\n    \"Update the email address to ...\",\n    \"Save and verify the change\"\n]\n\nfor subtask in subtasks:\n    result = await agent.run(subtask)\n    if not result[\"success\"]:\n        handle_error(subtask, result)\n        break\n```\n\n### Costs Can Explode Quickly\n\nSeverity: HIGH\n\nSituation: Running computer use at scale\n\nSymptoms:\nAPI bill is 10x higher than expected. Single task costs $5+ instead of $0.50.\nMonthly costs reach thousands of dollars quickly.\n\nWhy this breaks:\nVision tokens are expensive. Each screenshot:\n- ~2000-3000 tokens per image\n- At $10/million tokens, that's $0.02-0.03 per screenshot\n- Task with 30 screenshots = $0.60-0.90 just for images\n\nBut it compounds:\n- Screenshots accumulate in context\n- Model sees ALL previous screenshots each turn\n- Turn 10 processes 10 screenshots = $0.20-0.30\n- Turn 20 processes 20 screenshots = $0.40-0.60\n- Quadratic growth!\n\nComplex task: 50 turns × average 25 images in context = 1250 image tokens\nPlus text = could easily hit $5-10 per task.\n\nRecommended fix:\n\n## Monitor and limit costs\n\n```python\nclass CostTracker:\n    \"\"\"Track and limit computer use costs.\"\"\"\n\n    # Anthropic pricing (approximate)\n    INPUT_COST_PER_1K = 0.003   # Text\n    OUTPUT_COST_PER_1K = 0.015\n    IMAGE_COST_PER_1K = 0.01    # Roughly\n\n    def __init__(self, max_cost_per_task: float = 1.0):\n        self.max_cost = max_cost_per_task\n        self.current_cost = 0.0\n        self.total_tokens = 0\n\n    def add_turn(\n        self,\n        input_tokens: int,\n        output_tokens: int,\n        image_tokens: int\n    ):\n        \"\"\"Track cost of a single turn.\"\"\"\n        cost = (\n            input_tokens / 1000 * self.INPUT_COST_PER_1K +\n            output_tokens / 1000 * self.OUTPUT_COST_PER_1K +\n            image_tokens / 1000 * self.IMAGE_COST_PER_1K\n        )\n        self.current_cost += cost\n        self.total_tokens += input_tokens + output_tokens + image_tokens\n\n        if self.current_cost > self.max_cost:\n            raise CostLimitExceeded(\n                f\"Cost limit exceeded: ${self.current_cost:.2f} > ${self.max_cost:.2f}\"\n            )\n\n        return cost\n\nclass CostLimitExceeded(Exception):\n    pass\n\n# Usage\ntracker = CostTracker(max_cost_per_task=2.0)\n\ntry:\n    for turn in turns:\n        tracker.add_turn(turn.input, turn.output, turn.images)\nexcept CostLimitExceeded:\n    print(\"Task aborted due to cost limit\")\n```\n\n## Reduce image costs\n\n```python\n# 1. Lower resolution\nSCREEN_SIZE = (1024, 768)  # Smaller = fewer tokens\n\n# 2. JPEG instead of PNG (when quality ok)\nscreenshot.save(buffer, format=\"JPEG\", quality=70)\n\n# 3. Crop to relevant region\ndef crop_relevant(screenshot: Image, focus_area: tuple):\n    \"\"\"Crop to area of interest.\"\"\"\n    return screenshot.crop(focus_area)\n\n# 4. Don't include screenshot every turn\nif not needs_visual_update:\n    # Text-only turn\n    messages.append({\"role\": \"user\", \"content\": \"Continue...\"})\n```\n\n## Use cheaper models strategically\n\n```python\nasync def tiered_model_selection(task_complexity: str):\n    \"\"\"Use appropriate model for task.\"\"\"\n    if task_complexity == \"simple\":\n        return \"claude-haiku-...\"  # Cheapest\n    elif task_complexity == \"medium\":\n        return \"claude-sonnet-4-20250514\"  # Balanced\n    else:\n        return \"claude-opus-4-5-...\"  # Best but expensive\n```\n\n### Running Agent on Your Actual Computer\n\nSeverity: CRITICAL\n\nSituation: Testing or deploying computer use\n\nSymptoms:\nAgent deletes important files. Sends emails from your account.\nPosts on social media. Accesses sensitive documents.\n\nWhy this breaks:\nComputer use agents make mistakes. They can:\n- Misinterpret instructions\n- Click wrong buttons\n- Type in wrong fields\n- Follow prompt injection attacks\n\nWithout sandboxing, these mistakes happen on your real system.\nThere's no undo for \"agent sent email to all contacts\" or\n\"agent deleted project folder.\"\n\n\"Autonomous agents that can access external systems and APIs\nintroduce new security risks. They may be vulnerable to prompt\ninjection attacks, unauthorized access to sensitive data, or\nmanipulation by malicious actors.\"\n\nRecommended fix:\n\n## ALWAYS use sandboxing\n\n```python\n# Minimum viable sandbox: Docker with restrictions\n\ndocker run -it --rm \\\n    --security-opt no-new-privileges \\\n    --cap-drop ALL \\\n    --network none \\\n    --read-only \\\n    --tmpfs /tmp \\\n    --memory 2g \\\n    --cpus 1 \\\n    computer-use-sandbox\n```\n\n## Layer your defenses\n\n```python\n# Defense 1: Docker isolation\n# Defense 2: Non-root user\n# Defense 3: Network restrictions\n# Defense 4: Filesystem restrictions\n# Defense 5: Resource limits\n# Defense 6: Action confirmation\n# Defense 7: Action logging\n\n@dataclass\nclass SandboxConfig:\n    docker_image: str = \"computer-use-sandbox:latest\"\n    network: str = \"none\"  # or specific allowlist\n    readonly_root: bool = True\n    max_memory_mb: int = 2048\n    max_cpu: float = 1.0\n    max_runtime_seconds: int = 300\n    require_confirmation: list = field(default_factory=lambda: [\n        \"download\", \"submit\", \"login\", \"delete\"\n    ])\n    log_all_actions: bool = True\n```\n\n## Test in isolated environment first\n\n```python\nclass SandboxedTestRunner:\n    \"\"\"Run tests in throwaway containers.\"\"\"\n\n    async def run_test(self, test_task: str) -> dict:\n        # Spin up fresh container\n        container_id = await self.create_container()\n\n        try:\n            # Run task\n            result = await self.execute_in_container(container_id, test_task)\n\n            # Capture state for verification\n            state = await self.capture_container_state(container_id)\n\n            return {\n                \"result\": result,\n                \"final_state\": state,\n                \"logs\": await self.get_logs(container_id)\n            }\n        finally:\n            # Always destroy container\n            await self.destroy_container(container_id)\n```\n\n## Validation Checks\n\n### Computer Use Without Sandbox\n\nSeverity: ERROR\n\nComputer use agents MUST run in sandboxed environments\n\nMessage: Computer use without sandboxing detected. Use Docker containers with restrictions.\n\n### Sandbox With Full Network Access\n\nSeverity: ERROR\n\nSandboxed agents should have restricted network access\n\nMessage: Sandbox has full network access. Use --network=none or specific allowlist.\n\n### Running as Root in Container\n\nSeverity: ERROR\n\nContainer agents should run as non-root user\n\nMessage: Container running as root. Add --user flag or USER directive in Dockerfile.\n\n### Container Without Capability Drops\n\nSeverity: WARNING\n\nContainers should drop unnecessary capabilities\n\nMessage: Container has full capabilities. Add --cap-drop ALL.\n\n### Container Without Seccomp Profile\n\nSeverity: WARNING\n\nContainers should use seccomp profiles for syscall filtering\n\nMessage: No security options set. Consider --security-opt seccomp:profile.json\n\n### No Maximum Step Limit\n\nSeverity: WARNING\n\nComputer use loops should have maximum step limits\n\nMessage: Infinite loop risk. Add max_steps limit (recommended: 50).\n\n### No Execution Timeout\n\nSeverity: WARNING\n\nComputer use should have timeout limits\n\nMessage: No timeout on execution. Add timeout (recommended: 5-10 minutes).\n\n### Container Without Memory Limit\n\nSeverity: WARNING\n\nContainers should have memory limits to prevent DoS\n\nMessage: No memory limit on container. Add --memory 2g or similar.\n\n### No Cost Tracking\n\nSeverity: WARNING\n\nComputer use should track API costs\n\nMessage: No cost tracking. Monitor token usage to prevent bill surprises.\n\n### No Maximum Cost Limit\n\nSeverity: INFO\n\nConsider adding cost limits per task\n\nMessage: Consider adding max_cost_per_task to prevent expensive runaway tasks.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs web-only automation -> browser-automation (Playwright/Selenium more efficient for web)\n- user needs security review -> security-specialist (Review sandboxing, prompt injection defenses)\n- user needs container orchestration -> devops (Kubernetes, Docker Swarm for scaling)\n- user needs vision model optimization -> llm-architect (Model selection, prompt engineering)\n- user needs multi-agent coordination -> multi-agent-orchestration (Multiple computer use agents working together)\n\n## When to Use\n- User mentions or implies: computer use\n- User mentions or implies: desktop automation agent\n- User mentions or implies: screen control AI\n- User mentions or implies: vision-based agent\n- User mentions or implies: GUI automation\n- User mentions or implies: Claude computer\n- User mentions or implies: OpenAI Operator\n- User mentions or implies: browser agent\n- User mentions or implies: visual agent\n- User mentions or implies: RPA with AI\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["computer","use","agents","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-computer-use-agents","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/computer-use-agents","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34997 github stars · SKILL.md body (66,975 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T06:50:52.564Z","embedding":null,"createdAt":"2026-04-18T20:39:23.863Z","updatedAt":"2026-04-25T06:50:52.564Z","lastSeenAt":"2026-04-25T06:50:52.564Z","tsv":"'-0.03':6187 '-0.30':6219 '-0.60':6226 '-0.90':6195 '-10':2027,2110,6247,7011 '-1000':5548 '-140':5564 '-20250514':206,1489,2711,6515 '-22':2028,2111 '-30':5574 '-3000':5771,6177 '-5':140,4836,5469,5491,5532,6523 '-500':2487,5441,5525,5540 '-7':5555 '-90':5781 '/agent_logs':3888 '/app':919,921 '/bin/bash':876 '/dev':1820 '/etc/supervisor/conf.d':930 '/etc/supervisor/conf.d/supervisord.conf':950 '/home/agent/.vnc':880 '/run':1024 '/tmp':886,1014,1186,6670 '/tmp/requirements.txt':891 '/tmp/screenshot.png':1606,1609 '/usr/bin/python3':910 '/usr/bin/supervisord':948 '/var/run':1025 '0':450,597,1519,1656,1657,2042,2375,2377,2387,2492,2723,4914,4920,5010,5013,5016,5033,5037,5435,5882,5941,5956,5970,5978,6059,6072,6305 '0.0':6302 '0.003':6272 '0.01':5045,6283 '0.015':6278 '0.02':317,6186 '0.05':5350 '0.1':5362 '0.2':4956,5275,5313 '0.20':6218 '0.3':4947,5259,5444 '0.40':6225 '0.5':219,996,2775,4960 '0.50':6159 '0.60':6194 '0.8':4948 '000':5780,5782 '1':101,139,420,532,533,758,1525,1675,1699,1952,2049,2895,3640,4201,4211,4558,4576,4835,5021,5024,5027,5160,5299,5486,5521,5531,5607,5899,5960,6065,6412,6674,6684 '1.0':6293,6742 '10':4994,5067,5320,5868,6050,6214,6216 '10.0':5057 '10/million':6182 '100':475,2388,3825,3829,5524 '1000':1856,6328,6335,6342 '10000':1851 '100000':5875 '1024':588,2714,6417 '10px':4907 '10x':6149 '120':5701,5717 '1250':6238 '1280':247,1496,5613 '1280x800':241 '15':5068 '1500':5770 '16':3493 '1g':998 '1k':6271,6277,6282,6332,6339,6346 '2':108,424,542,765,991,1181,1698,2902,3644,4235,4609,5034,5038,5171,5315,5468,5527,5554,5617,6422,6688 '2.0':4961,6388 '20':2576,4995,5560,5573,6221,6223 '200':477,5539 '2000':6176 '2024':2026,2109 '20241022':1511,1529,1536 '20250124':1395 '20251124':1385 '2048':1090,6738 '22.04':842 '25':6234 '2f':6371,6374 '2g':6672,7035 '3':117,354,432,494,605,775,1686,1770,2910,3500,3505,3647,4679,5178,5269,5352,5490,5536,5632,6436,6694 '3.5':1330 '3.8':956 '30':1847,5695,5776,6192 '300':1085,3605,5708,6747 '4':122,205,437,655,782,1488,1777,2710,2918,3501,3506,3649,4710,5187,5542,5641,6458,6514,6522,6698 '4.5':1343,1387 '40':5563 '4096':2017 '45':5779 '4g':993 '4k':5616 '5':440,788,1772,4915,4921,5195,5550,5650,6156,6246,6702,7010 '50':213,1720,1988,2413,3415,6092,6231,6990 '500':2482,3603,5436,5547 '5000':2452,2460,2521 '50000':1898 '5900':939,964,965 '6':6706 '60':3119,3127,3147,5729,5732 '7':5069,6710 '70':6435 '768':6418 '8':3928 '800':248,1497,5614 '8080':969,970 '8080/task':1253 '99':1029 'a.success':4207,4218 'abort':6403 'accept':5578 'access':738,778,1006,1297,2141,2159,2337,2342,2407,2844,4716,5369,6555,6610,6628,6870,6879,6885 'account':6550 'accumul':6203 'accuraci':5601 'across':5817 'act':4641 'action':69,83,85,93,118,186,222,264,266,271,275,280,285,287,301,308,312,321,328,332,339,344,367,372,377,379,387,400,401,413,434,439,468,507,561,607,613,634,656,660,661,705,718,1390,1475,1586,1594,1595,1597,1599,1649,1669,1680,1691,1704,1726,1761,1793,1794,2253,2254,2421,2423,2429,2561,2607,2611,2612,2615,2619,2626,2630,2634,2691,2736,2743,2751,2753,2758,2759,2769,2866,2929,2981,2987,3000,3004,3008,3108,3122,3154,3174,3176,3183,3190,3226,3228,3241,3252,3253,3256,3258,3260,3270,3272,3273,3322,3358,3360,3364,3368,3376,3388,3420,3435,3442,3443,3455,3458,3459,3466,3467,3535,3540,3545,3599,3612,3616,3628,3635,3657,3705,3710,3752,3858,3876,3946,3948,3978,4064,4066,4195,4199,4209,4251,4267,4283,4362,4376,4421,4496,4684,4687,4693,4697,4704,4709,4832,4838,4841,4859,4875,4938,5281,5415,5537,5553,5561,5571,5620,5699,5706,5756,6067,6707,6711,6761 'action.action':2432,2446,2465,2475,2498,2523,2562,3131 'action.description':3140 'action.details':3144 'action.get':277,290,348,352,643,650,3370,3383,3385,3392,3430 'action.selector':2450,2469,2504,2509 'action.severity.value.upper':3136 'action.text':2470,2478 'action.url':2436 'action_dict.get':2742,2749 'actionlogentri':3703,3860,4061,4106 'actionlogg':3874,4301 'actions.append':4279 'actionsever':2957,2993,3181 'actionseverity.critical':3052,3055,3059,3062,3064,3202,3208 'actionseverity.high':3037,3040,3042,3045,3216 'actionseverity.low':3015,3017,3019,3021,3286 'actionseverity.medium':3028,3030,3032,3192,3305 'activ':3986 'actor':6636 'actual':6531 'ad':7067,7074 'add':1143,1388,4869,4891,4932,5029,5412,5884,5892,6018,6307,6913,6937,6985,7007,7033 'add-host':1142 'addit':1052 'address':6109 'advantag':2164 'advertis':4477 'after.png':4043 'agent':4,7,17,20,77,132,154,164,458,682,727,736,802,818,820,877,913,917,918,946,961,1003,1012,1035,1047,1072,1104,1192,1244,1288,1426,1474,1995,2597,2806,2867,2876,3338,3346,3352,3592,3595,3634,3881,4286,4291,4299,4304,4369,4398,4406,4412,4417,4448,4491,4517,4548,4608,4715,4729,4736,4742,4757,4820,5048,5053,5073,5081,5084,5094,5101,5466,5489,5639,5750,5802,5812,6528,6542,6563,6595,6602,6607,6849,6874,6900,7139,7143,7148,7166,7181,7205,7211 'agent-network':1002,1034 'agent-tmp':1011,1046 'agent.close':2835 'agent.execute':3598 'agent.run':686,2818,6122 'agent.start':2809 'ai':6,19,7173,7218 'align':4793 'allow':1075,1079,1091,1095,1133,1138,2153,3152,4526 'allowlist':6729,6891 'alreadi':4513 'also':2877,4092,4813 'altern':49,5230,5456 'alway':501,2916,2971,3034,6639,6831 'amount':351,353,356,361,493,1767,1769,1781 'amplifi':4461 'analysi':5516,5649 'analyz':114 'anthrop':38,168,170,191,199,684,835,1316,1417,1439,1441,1461,1483,2813,2815,2831,5154,5848,6265 'anthropic.types.beta':1443 'anthropiccomputerus':1459 'anti':694,1285,2101,2838,3606,4378,4759,4844 'anti-bot':4758,4843 'api':971,1246,2234,3516,6146,6614,7047 'app':2198 'appear':5163 'append':4093,4101,4107 'approach':5391 'appropri':6493 'approv':2901,2963,3013,3245,3281,3295,3301,3314,3319,3324,3328,3439,3449,3463,3610 'approxim':5006,6267 'apt':848,852,897 'apt-get':847,851,896 'architect':7130 'architectur':73 'area':6447,6451,6457 'around':4808,4901 'ask':2871,2880,7252 'assist':594,601,603,615,630,2060,2720,2727,2729,2739 'async':2236,2298,2310,2322,2418,2563,2785,2803,5240,5291,5380,5417,6040,6484,6777 'asyncio':2247,2955 'asyncio.run':2836 'asyncio.sleep':2774,5258,5274,5312,5349,5361,5443 'attack':4469,4507,4511,4527,4559,6580,6626 'attempt':4625,5431 'audit':3646 'authent':2913,2937 'auto':2900,2962,3012,3074,3079,3093,3099,3280,3294,3300,3313,3581,3585,3609 'auto-approv':2899,2961,3011,3279,3293,3299,3312,3608 'autom':825,2137,2205,2216,2276,2596,3643,3677,5477,7092,7095,7165,7187 'automat':5895 'autonom':6606 'avail':467,3668 'averag':6233 'await':2309,2314,2319,2345,2352,2405,2434,2448,2453,2467,2488,2506,2512,2532,2668,2756,2773,2794,2800,2808,2817,2834,4664,4700,5074,5253,5257,5265,5273,5276,5303,5309,5311,5344,5348,5354,5360,5363,5393,5405,5428,5433,5442,5449,5458,5628,6121,6792,6799,6812,6825,6834 'away':5194 'b':3491,3494,3498,3502,3503,3507 'b64':539,575,5888 'back':2526,5366,5401 'background':5598 'backspac':1745,1746 'balanc':244,6516 'base':63,189,833,2132,2148,2168,2287,2642,3187,3194,3214,3222,3345,3351,3594,4298,4303,4368,4612,4944,4957,4963,7180 'base64':176,232,569,1451,1640,2537 'base64.b64encode':259,1645,2542 'bash':1372,1528,1531,1564,1797,1803,2121 'batch':5618 'before.png':4017 'before/after':3662 'begin':5840 'behavior':165,821 'best':1347,1490,6524 'beta':2022,2105 'betatoolbash20241022':1446,1526 'betatoolcomputeruse20241022':1445,1508 'betatooltexteditor20241022':1447,1532 'bezier':4981 'bill':6147,7058 'bin':907 'blast':797 'block':1834,2066,3456,4397,4753 'block.id':2085 'block.input':2077 'block.name':2076 'block.type':2070 'blog':5850 'bodi':2515,4667 'bool':1093,1097,2303,3072,3077,3082,3110,3237,3474,3537,3716,3866,3954,4140,4621,6732,6762 'bot':4760,4845 'boundari':7260 'break':2854,4445,4767,5125,5279,5501,5766,6085,6132,6169,6560 'bridg':1038 'brows':4413 'browser':1437,2127,2135,2157,2214,2252,2275,2306,2428,2578,2595,2791,4459,4490,7094,7204 'browser-autom':7093 'browser-on':2134,2213 'browser-us':2126 'browseract':2250,2424,2752 'browseruseag':2274,2807 'buffer':252,255,1629,1632,6431 'buffer.getvalue':260,1646 'build':5,18,150,962,1126,1422,3373 'button':33,289,291,296,297,478,1771,1785,2359,2364,4503,4774,6572 'button.submit':2618 'buy':3555 'byte':3961,3965 'c':949,1212 'cach':5642 'calcul':4776 'calendar':4542 'call':787 'callabl':2952,3070 'callback':3069,3085,3087,3321 'came':5846 'canva':5196 'cap':1172,4595,6661,6939 'cap-drop':1171,4594,6660,6938 'capabl':894,1328,1356,1400,6923,6931,6936 'captcha':4755 'captur':104,224,228,535,1199,1358,1601,1841,3655,5523,6807 'card':3058,3496,3799 'center':4732,4778,4789,4800,4849 'certain':5131 'challeng':59,5827 'chang':6115 'char':326,3409 'chatgpt':2875 'cheaper':2174,6480 'cheapest':6505 'check':639,2029,3225,3239,3367,3436,3475,3538,4657,6840 'checkout':3557 'checkpoint':6019,6023,6032,6035,6044,6047,6055,6070,6074,6076,6082 'chown':916 'chrome':688 'chrome/120':5060 'clarif':7254 'class':181,1068,1099,1458,2249,2273,2397,2651,2956,2979,2996,3334,3702,3838,3873,4287,5857,6257,6377,6714,6770 'classif':3425 'classifi':3173,3182,4611 'classifier-bas':4610 'claud':203,1324,1329,1341,1414,1486,2708,5151,5660,5669,5790,6503,6512,6520,7192 'claude-haiku':5659,6502 'claude-opus':6519 'claude-sonnet':202,1485,2707,5668,6511 'clean':2789 'clear':7227 'cli':3114 'click':32,282,303,473,513,1363,1671,1674,1682,1685,1693,1696,1784,2256,2447,2616,2906,3027,3378,3381,3590,3601,4422,4502,4730,4737,4744,4779,4799,4802,4850,4883,4897,5122,5165,5168,5236,5300,6570 'client':198,208,2572 'clipboard':1096 'close':2787 'cmd':947,1154,1196 'code':914 'coher':5809 'collabor':7084 'command':1375,1804,1805,1807,1812,1829,1833,1838,1863,1877,1879,1884,1910,1977,1978,2118,2281,4441 'common':1732,3487 'compar':5507 'complain':5494 'complet':134,417,499,2031,2638,2890,3841,4727,4822,4833,4839,5116,5727,6063 'complex':2199,5097,5280,5666,5672,5685,5707,5711,5716,6229,6490,6499,6508 'complianc':3650 'compon':100 'compound':6201 'comprehens':3875,4293 'comput':2,11,15,24,40,75,152,192,274,456,725,816,830,959,1102,1161,1190,1317,1326,1339,1353,1384,1394,1424,1462,1492,1504,1510,1513,1558,1585,1592,1991,2024,2107,2149,3336,3632,3673,3879,4289,4410,4606,5126,5479,5581,5644,5746,5864,6141,6262,6532,6539,6561,6676,6720,6841,6847,6856,6973,6996,7043,7146,7158,7193 'computer-us':2023,2106 'computer-use-ag':1,958,1189,4605 'computer-use-sandbox':1160,6675,6719 'computeruseag':182,683 'concurr':5640 'config':923,1111,1114 'configur':1070 'confirm':2862,2874,2882,2909,2917,2924,2968,2972,2975,2986,3003,3026,3035,3047,3068,3075,3080,3086,3091,3094,3097,3100,3106,3112,3123,3289,3308,3318,3340,3347,3354,3366,3582,3586,3589,3621,3625,4681,4703,6708,6749 'confirmationg':2997,3349,3580 'confirmedcomputeruseag':3335,3593 'consequ':2934 'consid':3185,6961,7066,7073 'consist':4856,5815 'const':2354,2356,2370 'constraint':954,975 'contact':6600 'contain':751,807,1302,1467,4522,6776,6789,6790,6794,6802,6803,6814,6816,6828,6833,6836,6837,6863,6896,6899,6909,6921,6927,6933,6942,6948,7013,7019,7032,7115 'content':549,579,581,602,1893,1896,1897,1930,1937,1946,1960,2000,2061,2086,2091,2502,2508,2514,2653,2698,2728,2767,4402,4452,4619,4659,4666,5918,5974,5998,6001,6010,6030,6477 'content.get':6003 'content.lower':4652 'content.replace':1947 'context':431,3179,3186,3196,3422,3426,3446,5737,5792,5799,5819,5854,5860,5914,6056,6083,6205,6237 'context.add':6075 'context.get':3198,3204,3210 'contextmanag':5858,6057 'continu':126,638,6478 'control':64,162,465,973,1434,1593,2156,7172 'convert':5962 'coordin':512,1655,2188,4780,4898,5181,7140 'copi':884,912,915,928 'copilot':4516 'core':5826 'correct':128 'cost':2226,4390,5762,6133,6155,6161,6255,6264,6269,6275,6280,6289,6295,6297,6301,6320,6325,6330,6337,6344,6348,6349,6360,6362,6366,6370,6373,6376,6385,6406,6410,7039,7048,7051,7062,7068,7076 'costlimitexceed':6364,6378,6400 'costtrack':6258,6383 'could':6243 'count':449,527,531,559,654,680,5881,5898,5906 'cover':37 'cpu':791,6740 'cpus':990,995,1180,6673 'creat':142,867,4057,4814,6021,6073 'credenti':776,781,2920,3200,3428,4426,4712,4719 'credit':3057,3495,3559,3798 'criteria':7263 'critic':50,129,1401,2919,2973,2974,3046,4408,6534 'crm':4531 'crop':6437,6442,6449 'css':2640 'cue':5225 'current':105,422,536,1359,2664,2677,4145,5128,5424 'cursor':31 'curv':4977,4982,5005 'cvv':3509 'cvv-like':3508 'cycl':5517 'd':1158,3492,3499,3504,3549,4000 'damag':805 'danger':785,1813,1824,1832 'data':573,1311,1614,1623,1644,2208,3481,3788,4383,6631 'databas':4532 'dataclass':1060,1062,1067,2239,2241,2248,2946,2948,2978,3684,3686,3701,3837,6713 'datetim':3276,3689,3691,3709,3852,3856 'datetime.now':3277,3940,3996,4063,4154 'dd':1818 'debit':3561 'debug':3641,3676 'decid':2606 'decis':2582,2703,5656 'decod':261,1647,2544 'decreas':5810 'def':195,223,262,403,1108,1120,1225,1263,1479,1498,1541,1583,1795,1866,1979,2291,2299,2323,2419,2564,2786,2804,3065,3104,3172,3224,3342,3356,3468,3531,3744,3779,3882,3910,3944,4100,4135,4239,4295,4307,4351,4615,4881,4929,4965,5241,5292,5381,5418,5681,5876,5883,5926,5983,6017,6041,6285,6306,6441,6485,6778 'default':1044,3105,3111,3862,6752 'defens':4569,6681,6683,6687,6693,6697,6701,6705,6709,7112 'defin':1503 'delay':218,663,670,703,1713,1719,4931,4936,4945,4958,4964 'deleg':7085 'delet':3063,4550,6543,6603,6758 'denial':1306 'depend':883 'deploy':814,987,3675,6538 'depth':4571 'desc':3379,3402,3411,3417,3445 'describ':7231 'descript':2990,3139,3231,3262,3263,3374,5890,5912,5922,5996 'desktop':161,754,844,936,1433,2197,7164 'destroy':6832 'detail':1392,2977,2994,3143,3233,3247,3248,3255,3266,3267,6015 'detect':144,4613,4622,4678,4746,4815,4847,6860 'devop':7117 'dict':267,268,408,1231,1548,1549,1589,1590,1800,1801,1871,1872,1989,2328,2425,2737,2754,2995,3180,3234,3361,3362,3536,3714,3746,3748,3784,3785,3952,4133,4248,4313,4358,6785 'differ':4495 'dig':1146 'dir':3886,3890,3892,3894,3897,3901,4011,4037,4117,4167,4261 'direct':347,349,358,370,491,737,937,1292,1763,1765,1774,2182,2477,2484,5377,5403,5422,5438,5462,6918 'directori':774 'disappear':5120,5190 'discret':5834 'disk':6080 'display':926,1028,1470,1514,1520 'disregard':4631 'distanc':2481,2493 'distribut':4803,4900 'doc':1418 'docker':750,1106,1156,1218,1275,1466,4581,4585,6646,6649,6685,6716,6862,7119 'docker-compose.yml':951 'dockerfil':827,6920 'document':4476,5155,6557 'document.queryselectorall':2365 'doesn':5108 'dollar':6165 'dom':2140,2349,2586,2843,5207,5368,5378,5404 'domain':1080,1135,1145,1148 'domcontentload':2439 'done':443,496,641,645,2635,2744,5665 'dos':7026 'doubl':1692 'download':1092,3036,4430,4504,4688,6755 'drag':1365,5088,5113,5136,5179,5288,5294 'drag-and-drop':5287 'drift':2189 'driver':1037 'drop':893,1173,4596,5115,5290,5801,6662,6924,6929,6940 'dropdown':1407,5085,5105,5144,5161,5215,5218,5237,5243,5246,5252,5255 'due':6404 'durat':3739,3775,3971,4086,4088,4186,5680,5683,5690,5722 'dynam':4479 'e':1904,1908,1967,1971,2548,2554,4342,4349 'earlier':5752,5806 'easili':6244 'edg':4400 'edit':1380 'editor':1377,1535,1540,1572,1868,1875,1976 'effect':4579 'effici':240,1618,2144,2283,2340,2417,7098 'el':2368 'el.classname':2398 'el.getboundingclientrect':2372 'el.id':2396 'el.name':2394 'el.placeholder':2392 'el.tagname.tolowercase':2382 'el.textcontent':2384 'el.type':2390 'element':1405,2183,2351,2411,2412,2604,2645,2686,2689,2860,4740,4788,5099,5142,5197 'elif':307,327,343,371,1562,1568,1648,1668,1679,1690,1703,1725,1760,1909,2445,2464,2474,2497,2522,3165,3387,3818,6506 'els':360,393,637,1149,1576,1776,2046,2486,2510,3329,3410,3416,3831,5440,5464,5961,5976,6517 'email':2624,4521,4545,6108,6547,6597 'embed':4440,4475 'encod':233 'end':2035,3853,4136,4144,4183 'endpoint':763 'engin':5849,7134 'enter':488,1739,3053,3056,4425,5278 'entir':4530 'entri':2921,3707,4059,4060,4091,4099,4105,4108 'entry.to':4132 'enum':2942,2944,2958 'environ':723,733,832,845,1026,1027,1125,3682,6767,6854,7243 'environment-specif':7242 'error':397,521,674,1578,1790,1831,1862,1906,1939,1969,1973,2097,2552,2558,2772,2781,2856,3453,3717,3761,3955,4072,4073,4675,4706,5757,6129,6846,6872,6898 'escal':3193 'escap':1743,1744 'estim':5678,5682,5688,5693,5720,5721,5726,5728,5731 'estimates.get':5714 'even':4556 'event':4551 'everi':4473,6048,6071,6463 'exact':514,4731,4787 'exceed':6368 'except':617,1859,1901,1902,1964,1965,2545,2546,4339,4340,5398,5399,6379,6399 'execut':84,94,119,263,269,438,657,1226,1232,1542,1550,1802,2124,2420,2426,2733,3357,3363,3419,3461,3843,5538,6992,7006 'exist':3902 'expect':5112,5676,6152 'expens':6173,6526,7081 'expert':7248 'explod':5763,6135 'exploit':4509 'explos':716 'expos':931,938,4553 'extern':6611 'extra':5076 'extract':621,2209,2260,2499,2500,2631,4529,5993 'f':302,322,340,368,388,398,553,1141,1155,1213,1251,1274,1277,1579,1612,1791,1892,1929,1958,1974,2490,2559,2674,2768,3117,3121,3126,3129,3134,3138,3142,3146,3380,3403,3412,3418,3454,4004,4012,4023,4038,4049,4118,4129,4168,4230,4233,4262,4274,4278,5725,6007,6031,6365 'f.read':1615,1894,1931 'f.write':1959,4024,4050,4130 'factori':3863,6753 'fail':2770,3642,4208,5102,5117,5375 'failur':719,3678 'fall':2525,5365,5400 'fals':396,673,1094,1098,2096,2551,2557,2780,2811,3083,3171,3331,3452,3486,3588,3867,4333,4346 'fast':5739 'faster':2169 'feedback':123 'fewer':6420 'field':3687,3861,6576,6751 'file':1381,1945,2914,2939,3043,4097,4112,4114,4126,4164,4227,4258,4271,4394,4431,4505,6545 'filesystem':766,1009,1019,6699 'fill':2207,2219,2905,4500,5735 'filter':784,6955 'final':3868,4221,6821,6830 'financi':2922,2935 'find':2825,5263,6102 'fingerprint':5050 'finit':5795 'firefox':860 'first':1334,4467,5271,5392,6768 'fix':4568,4868,5227,5577,5852,6251,6638 'flag':2112,4762,6915 'float':6292,6741 'flow':2938 'fluxbox':858 'focus':51,5250,6446,6456 'folder':6605 'follow':4439,4804,6577 'foreach':2367 'forev':3627 'forget':5751 'form':2206,2218,2904,3039,4501 'format':256,1633,3653,6432 'found':1943 'fresh':6788 'frontier':1335 'full':713,1295,1432,2113,3049,3618,4317,5797,6868,6883,6935 'fundament':72 'gate':2998,3341,3348,3355,3438,3579,3596 'gaussian':4806,4899 'gemini':4547 'get':849,853,898,1499,2324,2329,2341,2347,2663,2701,4240,4249,4701,5423,5800,5811 'give':735,1293,4714 'go':2821 'goal':795 'goe':803 'good':243 'googl':4533 'grid':4792 'grid-align':4791 'growth':6228 'gui':7186 'h':4001 'haiku':5661,6504 'handl':56,1584,1591,1796,1867,1873,2050,6128 'hang':3626 'happen':4514,6585 'hard':5159 'hardcod':2851 'hasattr':2797 'header':5078 'headless':2302,2316,2317,2810 'height':1521 'hello':483,5624,5630 'hesit':4866 'hidden':4539 'high':748,2911,2969,2970,3033,5092,5741,6138 'higher':6150 'highest':1428 'hijack':4404,4519 'hit':6245 'hold':5302 'host':780,1008,1144,1290 'hover':5118,5188 'http':5077 'human':13,26,2873,4750,4796,4871,4882,4893,4903,4930,4934,4939,4966,4980,4985,5473,5485,5509,5567,5586 'human-lik':4870,4892,4933 'id':1116,1203,1221,1224,1239,1272,1279,1283,2084,2395,2649,3846,3925,3933,3935,3943,4014,4040,4121,4171,4175,4177,4245,4265,4320,6791,6804,6817,6829,6838 'identifi':4772 'ignor':717,4435,4628 'imag':174,234,566,1455,1637,2171,2178,2541,5786,5924,6180,6198,6235,6239,6279,6316,6340,6356,6409,6445,6717 'image.lanczos':249,1628 'image.open':1620 'image/png':572,1643 'img':1613,1619,1622,1624 'img.resize':1625 'img.save':1631 'implement':188,838,1319,1321,1464,1478,5853 'impli':7157,7163,7170,7177,7185,7191,7197,7203,7209,7215 'import':169,173,175,177,179,250,610,625,1055,1057,1061,1065,1247,1440,1444,1448,1450,1454,1456,2235,2240,2244,2246,2536,2734,2814,2943,2947,2951,2954,3275,3520,3566,3685,3690,3694,3697,3699,3922,4877,4879,6544 'includ':6461 'increas':5758 'indefinit':4388 'indent':4234 'independ':5634 'index':2379 'infer':5222,5530 'infinit':700,6982 'info':2350,2646,7065 'inform':5200,5718 'init':196,1109,1480,2292,3066,3343,3883,4296,5877,6286 'inject':4457,4618,4624,4671,4677,6579,6625,7111 'input':1547,1561,1567,1575,1588,1799,1870,2360,2622,3151,6268,6310,6326,6352,7257 'input.get':1596,1654,1707,1729,1764,1768,1806,1878,1881,1915,1920 'insid':4541 'insight':130 'inspect':1393 'instal':843,854,881,889,899,903 'instead':2587,4442,5234,5285,5621,6089,6157,6424 'instruct':4437,4488,4524,4629,4635,6569 'int':1084,1089,1987,2575,3742,3973,4885,4887,4889,4890,4912,4918,5040,5042,5687,6049,6312,6315,6318,6737,6746 'integr':89,157,4284 'intel':5063 'interact':9,22,2222,2355,2400,2410,2603,2685,2688,4764,5095,5133,5712 'interactable.push':2378 'interest':6453 'interfac':5132 'intern':1039,4359 'internet':1042,4601 'interv':316 'introduc':6615 'invit':4543 'invoic':3563 'involv':3199,3205,3427,3432,3541 'io':251,1457 'io.bytesio':253,1621,1630 'irrevers':3211 'isinst':3819 'isoformat':3278 'isol':731,756,1000,4584,6686,6766 'iter':97 'jpeg':6423,6433 'json':471,506,611,622,1254,2610,2735,3698 'json.dump':4231 'json.dumps':4131 'json.jsondecodeerror':618 'json.loads':614,635,2738,4280 'jsonl':4110,4122,4266 'k':3801,3816,3827,3833 'k.lower':3809 'keep':709,5869,5900,5934 'kept':5940,5952,5959 'key':99,330,331,333,335,342,486,487,755,1355,1371,1727,1728,1730,1733,1735,1748,1751,1754,1756,3217,3517,3793,3797,3814 'key.lower':1750 'key_map.get':1749 'keyboard':1367,5229,5239,5261 'kill':1208,1219 'know':5212 'kubernet':7118 'lack':4860 'lambda':3218,6754 'land':4781,4905 'languag':112 'latest':1193,6723 'layer':6679 'leak':1313 'left':292,479,1670 'len':324,3407,3823,4196 'letter':5272 'level':2894 'libcap2':906 'libcap2-bin':905 'like':12,25,1406,3397,3479,3510,4831,4872,4894,4935,4979,5143 'limit':699,790,986,989,1305,1402,1811,1852,1899,2414,2777,4722,6254,6261,6367,6407,6704,6970,6980,6988,7001,7016,7023,7030,7063,7069,7219 'line':4276,4281,4991 'link':4424 'list':1076,1502,3859,3864,4247,6750 'llm':2335,2567,2571,2581,2702,2820,7129 'llm-architect':7128 'llm_client.messages.create':2705 'llms':2154 'load':2456,2850,4480 'localhost':1032,1252 'log':2907,2966,3023,3103,3268,3614,3629,3638,3652,3706,3877,3885,3891,3896,3945,3975,4058,4096,4103,4111,4113,4125,4257,4270,4294,4318,4354,4363,4374,4385,4393,4395,6712,6759,6824,6827 'loggedcomputeruseag':4288 'logger':4300,4306 'login':3041,4690,6101,6757 'long':5744,6037 'long-run':5743 'longer':4950 'look':3396,3469,3478,4830 'loop':70,88,187,216,414,419,701,1996,4812,6975,6983 'lose':5803 'low':2896,2959,2960,3010,3076,3092,3095,3282,3290,3296,3583 'lower':3156,6413 'm':874,1179,3999,4002,5730 'mac':5064 'macintosh':5062 'main':741,2805,2837 'make':2583,5814,6564 'malici':4423,4487,4523,6635 'manag':5855,5859 'mani':4494,5709 'manipul':1416,4538,5153,5379,6633 'map':1731,1736,3007 'mask':3394 'match':627,633,7228 'match.group':636 'mathemat':4783 'matter':2227 'max':445,586,675,1081,1086,1985,2009,2015,2098,2573,2661,2712,2782,3213,5866,5873,6288,6296,6384,6734,6739,6743,6986,7075 'maximum':6968,6978,7061 'may':2983,4752,6620 'mayb':2908,3025,3298 'mb':1088,1178,6736 'mcp':2152 'meaning':4563 'media':570,1641,6554 'medium':2903,2964,2965,3022,3081,3098,3101,3302,3309,3315,3587,4734,5475,5700,5723,6509 'memori':792,992,997,1087,1175,1177,5804,5843,6671,6735,7015,7022,7029,7034 'mention':3532,7155,7161,7168,7175,7183,7189,7195,7201,7207,7213 'menus':5119,5189 'messag':447,592,593,595,604,616,631,1997,2020,2021,2656,2673,2700,2718,2719,4555,5938,5982,6855,6880,6908,6932,6956,6981,7002,7027,7049,7072 'messages.append':576,599,2058,2088,2695,2725,2764,6474 'method':4372,5457 'micro':4863 'micro-mov':4862 'microsoft':4515 'might':1410,5147 'minim':799 'minimum':5566,6643 'minut':5487,5492,7012 'misinterpret':6568 'miss':7265 'mistak':6565,6584 'mkdir':878 'mkfs':1817 'model':91,113,159,200,210,428,547,584,1336,1348,1398,2013,2706,3665,3734,3771,3967,4082,4084,4771,5203,5529,5653,5658,5667,6206,6481,6487,6494,7126,7131 'moder':5705 'modif':2940 'money':3061,3206,3433,3533,3542,3546,3576 'monitor':6252,7053 'month':6160 'mous':1362,1650,4852,4975,5182,5185,5192 'mouse/keyboard':120,270,466 'mousemov':1660 'move':30,374,389,1364,1651,4974,4988,5184,5193,5316 'movement':4853,4864,4967 'mozilla/5.0':5054,5061 'ms':3740,3776,3778,3972,4087,4089,5526,5541,5549 'msg':5943,5949,5957,5968,5972,5979,5987 'msg.get':6000 'multi':5703,7138,7142 'multi-ag':7137 'multi-agent-orchestr':7141 'multi-pag':5702 'multipl':5513,5637,5818,7145 'must':728,5831,6850 'n':556,3118,3168,4134 'name':1159,1512,1530,1537,1545,1557,1563,1569,1582,1734,2393,2623,2650 'navig':2258,2433,2613,2897,3014,4497,6096 'necessari':762 'need':516,1427,2530,2984,5166,5175,6467,7088,7102,7114,7124,7136 'network':759,999,1001,1004,1033,1036,1074,1127,1129,1139,1150,1152,1187,1296,4598,6664,6695,6724,6869,6878,6884,6887 'networkidl':2458 'never':734,4713 'new':980,1169,1918,1921,1950,2829,3919,4592,4634,5838,5937,5981,6616,6658 'new_messages.insert':5955,5969,5977 'next':82 'no-install-recommend':901 'no-new-privileg':978,1167,4590,6656 'non':869,943,4749,6690,6905 'non-human':4748 'non-root':868,942,6689,6904 'none':1078,1119,1153,1284,2264,2268,2272,2295,2297,3073,3235,3720,3725,3733,3738,3743,3857,3872,3909,3958,3962,3966,3970,3974,4143,4238,4599,6665,6726,6888 'nstep':557 'nt':5056 'object':508 'observ':78,124,968 'occasion':4949 'occur':5498 'offer':1338 'offici':1320,1460 'offset':4911,4917,4925,4928 'often':4786,5511 'ok':3903,6429 'old':1913,1916,1933,1940,1948,5928,5932 'older':5798 'one':6091 'open':47,687,1608,1888,1925,1954,4019,4045,4124,4225,4269,5823 'open-sourc':46 'openai':42,7198 'oper':121,1366,1876,2915,5139,5510,7199 'operator/cua':44 'opt':977,1166,4589,6655,6964 'optim':5603,7127 'option':1066,1117,2245,2262,2266,2270,2953,2967,3695,3718,3723,3731,3736,3741,3855,3870,3907,3956,5106,5162,5244,5248,5264,5267,5407,6077,6959 'opus':1342,1386,6521 'orchestr':7116,7144 'os':1058,3700,5065 'os.makedirs':3899 'os.path.join':3895,4009,4035,4115,4165,4259 'output':1200,1842,1853,6274,6313,6333,6354,7237 'p':879,3525,3528,3571,3574,4651,4654 'page':2321,2325,2333,2600,2665,2670,2678,2849,4658,4662,4672,5245,5295,5384,5421,5697,5704,5710,6105 'page.click':5254 'page.evaluate':5429,5450 'page.keyboard.press':5277,5459 'page.keyboard.type':5266 'page.mouse.down':5310 'page.mouse.move':5304,5345,5355 'page.mouse.up':5364 'page.mouse.wheel':5434 'page.select':5406 'page.set':5075 'page.text':4665 'page.type':5629 'pagedown':5460 'pageup':5465 'parallel':5633 'param':3781,3783,3790 'paramet':3660,3713,3756,3951,4068,4069 'params.items':3804 'pars':433,606,2731 'particular':5134 'pass':4377,6380 'password':3054,3398,3512,3619,3794 'path':1880,1882,1889,1926,1955,3726,3993,4008,4020,4028,4030,4034,4046,4054,4056,4978 'pattern':65,146,166,194,695,724,839,1286,1322,1814,1822,1825,1827,2102,2129,2839,2863,3488,3489,3530,3547,3577,3607,3630,4379,4626,4656,4807,4816,4829 'paus':145,2869,2878,4818,4951 'pay':3551 'payment':3565 'per':5534,5552,6179,6188,6248,6270,6276,6281,6290,6298,6331,6338,6345,6386,7070,7077 'percept':67,102,184,411,534 'perception-reasoning-act':66,183,410 'perfect':4848 'perform':4419 'period':6054 'permiss':7258 'persist':1309,6078 'phase':138,4827 'phish':4428 'pil':172,1453 'pip':864 'pip3':888 'pipelin':98 'pixel':2147,2286,4794,5205 'pixel-bas':2146,2285 'placehold':2391 'plan':116 'playwright':2131,2151,2237,2278,2311,2799 'playwright-bas':2130 'playwright.async':2233 'playwright/selenium':7096 'plus':6241 'png':257,1634,2535,6426 'port':933,963 'pos':4969,4972,5009,5012,5015,5020,5023,5026 'posit':4785,5177,5426 'possibl':5232,5605 'post':6551 'potenti':4484,4676 'precis':510,2181,4784,5176 'predict':4817 'prefer':2648 'press':341,1370 'pretend':4645 'prevent':214,7025,7057,7080 'previous':4632,6008,6013,6209 'price':6266 'print':2832,3116,3120,3125,3128,3133,3137,3141,3145,5724,6401 'prior':2883 'privileg':981,1170,4593,6659 'problem':5824 'proceed':3243 'process':2172,4450,4661,6215,6222 'product':1423,3672 'profil':6945,6952 'profile.json':6966 'progress':5761,5816 'project':6604 'prompt':452,591,2591,2717,3115,4456,4540,4623,6578,6624,7110,7133 'proper':1476 'provid':2647,3991 'proxi':1031 'prune':5896,5927,6016 'purchas':2892,2912,3051,3553,4691 'px':1516,1522 'pyautogui':178 'pyautogui.click':293 'pyautogui.moveto':381,5039 'pyautogui.press':334 'pyautogui.screenshot':236 'pyautogui.scroll':362 'pyautogui.typewrite':314 'python':882,1049,4580,4614,4685,4876,5051,5233,5284,5372,5416,5606,5677,5856,6039,6088,6256,6411,6483,6642,6682,6769 'python3':861,863 'python3-pip':862 'quadrat':6227 'qualiti':1429,6428,6434 'quick':6136,6166 'r':629,890,909,1890,1927,3490,3497,3511,3513,3515,3518,3548,3550,3552,3554,3556,3558,3560,3562,3564,4272,4627,4630,4633,4636,4640,4644 'radius':798 'rais':3983,4350,6363 'random':4878 'random.choice':5082 'random.gauss':4913,4919,5032,5036 'random.randint':4993 'random.random':4955 'random.uniform':4946,4959 'rang':1780,2008,2660,4999,5324 'rate':2776,4561 'rather':2161 'rb':1610 're':626,3521,3567 're.search':628,3524,3570,4650 'reach':677,2100,2784,6162 'reaction':4942 'read':768,1016,1020,1183,2898,3018,4603,4952,6667 'read-on':767,1015,1182,4602,6666 'readon':6730 'real':2932,4510,6588 'real-world':2931 'realist':5072,5675 'reason':68,80,109,185,412,543,2034,2055,3246,3440,3457,3666,3735,3772,3774,3968,4083,4085,5673 'receiv':2599 'recent':5871,5902 'recommend':904,4567,4867,5226,5576,5851,6250,6637,6989,7009 'recov':524 'recoveri':721,2857 'rect':2371 'rect.height':2376 'rect.width':2374 'redact':3817 'reduc':5608,6408 'refer':837 'region':6440 'reject':3333,3615,4708 'releas':5353 'relev':6439,6443 'reliabl':1715,2186,5293 'remain':5821 'remov':1268,3786,5931 'repeat':86,441,1697,5643,5755 'repetit':5592 'replac':1539,1571,1912 'replay':4242 'replay/debugging':4256 'repres':4482,4562 'reproduc':3648 'request':1248,3317 'requests.post':1250 'requir':757,1465,2173,3124,3651,5180,5512,5559,6748,7256 'requirements.txt':885 'reserv':994 'resiz':237,1616 'resolut':714,2114,5610,6414 'resourc':789,985,988,1304,6703 'respond':469,502,2608 'respons':436,582,609,624,1249,2011,2704,3150,3159,3166 'response.content':596,2041,2045,2062,2068,2722 'response.json':1262 'response.stop':2033,2054 'restrict':760,6648,6696,6700,6865,6877 'result':125,497,649,651,658,685,1194,1555,1836,2040,2064,2073,2081,2087,2093,2633,2636,2748,2750,2755,2816,2833,3597,3869,4141,4158,4159,4222,4223,4325,4334,4336,4338,4347,6120,6126,6131,6798,6819,6820 'result.get':2762,2771,4331,4335 'result.returncode':1858 'result.stderr':1855 'result.stdout':1850 'result.stdout.decode':1204 'return':231,258,298,318,336,364,384,394,646,671,1222,1261,1507,1554,1559,1565,1573,1577,1635,1665,1676,1687,1700,1722,1737,1738,1740,1757,1786,1789,1830,1848,1861,1895,1905,1938,1961,1968,1972,2037,2094,2399,2401,2440,2461,2471,2494,2516,2538,2549,2555,2745,2778,3163,3170,3201,3207,3212,3221,3244,3291,3310,3325,3330,3450,3464,3485,3522,3568,3749,3835,3941,4151,4282,4337,4648,4674,4705,4922,5713,6006,6012,6375,6454,6501,6510,6518,6818 'returncod':1857 'reus':5648 'revers':5945 'review':2925,2976,3050,7104,7108,7249 'revok':4724 'rf':1816 'right':1681 'risk':745,4458,4463,4564,6618,6984 'rm':1276,1815,6652 'robust':5382 'role':577,600,1998,2059,2089,2363,2696,2726,2765,5916,5971,5973,6028,6475 'root':870,944,1018,1300,6691,6731,6894,6906,6912 'rotat':4392,5046 'rough':6284 'rpa':7216 'rule':1128,1130,1140,1151,1188 'run':404,409,696,729,823,846,872,887,895,940,1101,1157,1287,1298,1315,1373,1980,1990,2565,2577,4095,4308,4314,4352,4360,4371,4586,5596,5636,5745,6042,6051,6140,6527,6650,6772,6779,6796,6851,6892,6902,6910 'runaway':215,7082 'runtim':1053,1082,1216,1259,6744 'runtimeerror':3984 'safari':5070 'safe':822 'safeti':7259 'sandbox':53,722,732,810,829,1054,1073,1107,1124,1163,1235,1269,1294,4577,5638,6582,6641,6645,6678,6722,6844,6853,6859,6866,6873,6881,7109 'sandboxconfig':1069,1112,6715 'sandboxedag':1100 'sandboxedtestrunn':6771 'sanit':1809,2119,3780,3791,3815,3826,3832,3836,4381 'save':3988,6081,6111 'scale':4566,6144,7122 'scan':4616,4669 'scope':771,4711,7230 'scratch':156 'screen':29,79,106,229,463,537,1360,5611,6415,7171 'screenshot':103,225,235,245,421,538,541,574,711,1357,1600,2115,2163,2524,2531,2543,2589,2841,3020,3661,3721,3728,3729,3763,3767,3898,3959,3963,3989,3992,4006,4025,4027,4032,4051,4053,4074,4078,4387,4811,5514,5522,5535,5609,5647,5734,5768,5777,5867,5872,5885,5887,5893,5903,5908,5929,5933,5939,5951,5954,5958,5985,5990,6009,6014,6175,6189,6193,6202,6210,6217,6224,6444,6462 'screenshot.crop':6455 'screenshot.resize':246 'screenshot.save':254,6430 'screenshot_paths.get':4076,4080 'script':4481 'scroll':346,355,363,369,490,1762,2259,2476,2627,3016,5107,5135,5420,5425,5432 'scrollbar':1409,5086,5146,5172 'scrot':1605 'search':690,3031 'seccomp':983,6944,6951,6965 'seccomp-profile.json':984 'second':141,220,1083,1217,1260,4187,4193,4489,4837,5167,5533,5556,5565,5575,5692,6745 'secret':3514,3795 'secur':54,744,866,892,953,974,976,1165,1808,3645,3680,4588,6617,6654,6958,6963,7103,7106 'security-opt':1164,4587,6653,6962 'security-sensit':3679 'security-specialist':7105 'see':461,519,5204,6207 'select':2361,5104,5170,5242,5383,5385,5395,5408,6488,7132 'selector':2261,2357,2366,2617,2621,2632,2641,2655,2852,5247,5256,5386,5396,5409 'self':197,226,265,405,1110,1122,1228,1265,1481,1501,1544,1587,1798,1869,1982,2293,2301,2327,2422,2568,2788,2798,3067,3107,3175,3227,3344,3359,3471,3534,3747,3782,3884,3913,3947,4104,4138,4243,4297,4310,4355,5878,5886,5930,5986,6020,6287,6309,6781 'self._append_to_log':4098 'self._create_progress_summary':6026 'self._default_confirm':3089 'self._handle_bash':1566 'self._handle_computer_action':1560 'self._handle_editor':1574 'self._has_image':5948 'self._looks_sensitive':3400,3429 'self._mentions_money':3434 'self._prune_old_screenshots':5909 'self._run_with_logging':4326 'self._sanitize_params':3757 'self._summarize_screenshot':5967 'self.action':217,669,3102,3754 'self.action_log.append':3271 'self.action_severity.get':3189 'self.agent':3350,4302 'self.agent.execute':3465 'self.auto':3090,3096,3288,3307 'self.browser':2294,2313,2793 'self.browser.close':2795 'self.browser.new':2320 'self.capture':540,6813 'self.classify':3251 'self.client':207,1482 'self.client.beta.messages.create':2012 'self.client.messages.create':583 'self.config':1113 'self.config.max':1176,1215,1258 'self.config.network':1132,1137 'self.confirm':3084,3320 'self.container':1115,1202,1220,1223,1238,1271,1278,1282 'self.create':6793 'self.current':3905,3929,3981,4149,4236,6300,6347,6359,6369 'self.current_session.actions':4197,4205,4215 'self.current_session.actions.append':4090 'self.current_session.end':4152,4188 'self.current_session.end_time.isoformat':4185 'self.current_session.final':4157 'self.current_session.session':4013,4039,4120,4170,4176 'self.current_session.start':4190 'self.current_session.start_time.isoformat':4182 'self.current_session.success':4155 'self.current_session.task':4179 'self.destroy':6835 'self.duration':3777 'self.error':3762 'self.execute':659,2074,2757,6800 'self.gate':3353 'self.gate.check':3441 'self.get':2003,2669,6826 'self.image':6343 'self.input':6329 'self.log':3889,4116,4166,4260 'self.logger':4305 'self.logger.end':4328,4343 'self.logger.start':4321 'self.max':211,528,5907,5953,6294,6361,6372 'self.messages':5879,5946,5980 'self.messages.append':5915,6027 'self.model':209,585,1484,2014,3773 'self.output':6336 'self.page':2296,2318 'self.page.accessibility.snapshot':2346 'self.page.click':2449 'self.page.evaluate':2353,2489 'self.page.fill':2468 'self.page.goto':2435 'self.page.screenshot':2533 'self.page.text':2507,2513 'self.page.title':2406 'self.page.url':2403,2444 'self.page.wait':2454 'self.parameters':3758 'self.playwright':2308 'self.playwright.chromium.launch':2315 'self.playwright.stop':2801 'self.screen':1494,1517,1523,1626 'self.screenshot':3765,3769,3893,3900,4010,4036,5880,5897,5905 'self.start':1240 'self.success':3760 'self.timestamp.isoformat':3751 'self.total':6303,6350 'semant':5199 'send':425,544,1241,3060,6546 'sensit':2865,2886,2893,2999,3405,3470,3480,3681,3787,3792,3813,4382,4554,4683,4686,4696,6556,6630 'sensitiveact':2980,3071,3109,3257 'sent':6596 'servic':957,1308,4536 'session':2307,3844,3845,3906,3912,3921,3924,3930,3932,3934,3942,3982,3987,4119,4137,4146,4150,4161,4169,4174,4237,4241,4244,4254,4263,4264,4319,4322,4329,4344,5835,5839 'set':1206,5674,6104,6960 'setcap':908 'sever':2992,3006,3009,3135,3184,3188,3215,3223,3250,3264,3265,3283,3285,3297,3304,3316,3424,4407,4733,5091,5474,5740,6137,6533,6845,6871,6897,6925,6946,6971,6994,7017,7041,7064 'sh':1211 'sharp':4399 'shell':1197,1280,1374,1839 'short':1147 'shouldn':4433 'show':3617 'similar':4984,5619,7037 'simpl':5004,5655,5657,5694,6500 'simplifi':2348 'singl':3704,3977,4573,5696,6153,6323 'site':4429 'situat':4409,4735,5093,5476,5742,6139,6535 'size':1495,1518,1524,1627,1900,5612,6416 'skill':7222 'skill-computer-use-agents' 'sleep':1214 'slice':2386 'slow':5506,5520 'slower':5471 'small':662,5173 'smaller':5652,6419 'snapshot':2160,2326,2331,2344,2409,2601,2667,2671,2680,2683,2687 'social':6553 'solut':4574 'sonnet':204,1331,1487,2709,5670,6513 'sophist':4842 'sourc':48,567,1638,5296,5305,5307,5327,5331,5336,5340,5925 'source-sickn33' 'specialist':7107 'specif':6728,6890,7244 'speed':2224,5496,5602 'spin':6786 'stale':2859 'standard':1399 'start':1121,1123,2300,2305,2312,3850,3911,3917,3938,4180,5754 'state':107,423,1361,2457,2666,6808,6811,6815,6822,6823 'status':3664 'stderr':1854 'stdout':1849 'step':212,446,448,526,529,530,558,652,653,676,678,679,698,1986,2006,2010,2047,2048,2099,2574,2658,2662,2783,2887,4992,5000,5003,5283,5298,5314,5318,5319,5325,5334,5343,5351,5753,5807,6058,6064,6069,6084,6093,6969,6979,6987 'still':135,4823,4834,4840 'stop':1264,1266,7250 'storag':1310,4389 'store':4386,5910 'str':201,227,407,1077,1118,1230,1538,1546,1570,1661,1663,1907,1911,1914,1917,1919,1922,1934,1941,1949,1951,1970,1984,2255,2263,2267,2271,2553,2570,2989,2991,3178,3230,3232,3238,3473,3544,3712,3719,3724,3732,3737,3821,3847,3849,3871,3887,3915,3916,3926,3950,3957,3969,3995,4016,4042,4142,4246,4312,4348,4357,4620,5686,5889,5891,5988,6046,6491,6718,6725,6784 'straight':4990 'strateg':6482 'strftime':3997 'strict':4583 'strip':1205,3157 'structur':2139,2195,2203,2251,2280,2330,2427,2585,5208 'struggl':5129 'subject':4454 'submit':3038,4689,6756 'subprocess':1056,1449 'subprocess.popen':1210 'subprocess.run':1195,1273,1604,1658,1672,1683,1694,1716,1752,1782,1837 'subprocess.timeoutexpired':1860 'substitut':7240 'subtask':6087,6095,6117,6119,6123,6130 'success':299,319,337,365,385,395,500,647,672,1666,1677,1688,1701,1723,1758,1787,1962,2038,2095,2441,2462,2472,2495,2517,2539,2550,2556,2746,2763,2779,3451,3715,3759,3865,3953,4070,4071,4139,4156,4198,4219,4220,4330,4332,4345,4560,6127,7262 'success/failure':3663 'sudden':4418 'sum':4200,4210 'summar':5984,5989 'summari':4162,4163,4173,4226,4232,5936,5965,5966,5975,6024,6025,6033 'summary.json':4172 'supervisor':865,922 'supervisord.conf':929 'surfac':4470 'surpris':7059 'swarm':7120 'symptom':4416,4741,5100,5481,5749,6145,6541 'synchron':4396 'syscal':783,6954 'system':451,589,590,742,786,1291,2590,2715,2716,4761,4846,6589,6612 'tab':1741,1742 'tag':2381 'take':564,2694,2885,4493,5484,5488,5562,6066 'target':2184,4809,4902,4909,5174,5297,5329,5338,5356,5358 'task':406,416,430,498,554,555,826,1227,1229,1233,1242,1255,1256,1981,1983,1993,2001,2217,2290,2569,2579,2637,2675,2676,3842,3848,3914,3920,3936,3937,4178,4309,4311,4315,4323,4327,4356,4726,5480,5482,5558,5585,5593,5599,5635,5664,5679,5684,5689,5715,5748,5760,5774,5808,6038,6045,6052,6062,6094,6154,6190,6230,6249,6291,6299,6387,6402,6489,6496,6498,6507,6783,6797,6806,7071,7078,7083,7226 'tasksess':3839,3908,3931 'technolog':5503 'temp':773 'temporari':4721 'test':819,6536,6764,6773,6780,6782,6805,7246 'text':36,311,313,315,325,482,551,552,598,1369,1376,1534,1706,1708,1721,1844,1874,2043,2175,2265,2383,2501,2505,2511,2519,2520,2625,2628,2652,2721,2724,2730,2740,3391,3393,3401,3406,3408,3414,3431,3472,3477,3484,3543,4663,4673,5249,5268,5789,5920,5921,5935,5964,5992,5995,6005,6011,6242,6273,6471 'text-on':6470 'text.lower':3526,3572 'textarea':2362 'think':137,4826,4855,4953 'thousand':6163 'throwaway':6775 'tier':6486 'time':180,793,1864,2125,3851,3854,3939,4153,4181,4184,4189,4191,4857,4880,4943 'time.sleep':668,4962,5044 'timeout':1257,1846,2451,2459,3623,5497,6993,7000,7004,7008 'timer':1209 'timestamp':3274,3656,3708,3750,3994,4015,4041,4062 'titl':2404,2682,2684 'tmp':1013,1048 'tmpfs':1023,1185,6669 'today':693 'togeth':7150 'token':239,587,715,2016,2176,2179,2416,2713,3519,3796,4723,5772,5783,5874,6171,6178,6183,6240,6304,6311,6314,6317,6327,6334,6341,6351,6353,6355,6357,6421,7054 'tool':1382,1477,1500,1506,1543,1552,1581,2002,2004,2018,2019,2051,2056,2063,2071,2075,2080,2082,2092,2122 'tool_results.append':2078 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'total':4192,4194,5551 'track':6259,6319,7040,7046,7052 'tracker':6382 'tracker.add':6394 'tradeoff':5580 'transact':2923,2936 'treat':7235 'tree':2338,2343,2408 'tri':522,612,619,1835,1886,1923,2430,4324,5376,5388,5389,5455,6389,6795 'trick':4546 'tricki':1412,5149 'trigger':7086 'trim':2385 'true':300,320,338,366,386,648,911,982,1022,1040,1198,1201,1281,1667,1678,1689,1702,1724,1759,1788,1840,1843,1845,1963,2039,2304,2442,2463,2473,2496,2518,2540,2747,3078,3149,3164,3292,3311,3326,3584,3904,6733,6763 'truncat':3830 'tupl':3236,4888,4970,4973,6448 'turn':2036,6212,6213,6220,6232,6308,6324,6391,6393,6395,6464,6473 'turn.images':6398 'turn.input':6396 'turn.output':6397 'two':4465 'type':35,276,278,281,309,310,323,329,345,373,402,472,480,481,485,489,495,550,565,568,571,644,1064,1368,1509,1527,1533,1636,1639,1642,1705,1711,1718,2079,2243,2257,2389,2466,2534,2620,2950,2988,3005,3029,3130,3132,3177,3191,3229,3254,3259,3261,3369,3371,3377,3389,3390,3404,3413,3421,3444,3460,3591,3600,3658,3693,3711,3753,3755,3949,4065,4067,4694,5270,5623,5626,5919,5923,6004,6573 'typic':4904 'ubuntu':841 'ui':665,706,1404,2200,4739,5098,5141,5545 'unauthor':6627 'unbound':2123 'understand':163,1431,2231 'undo':6593 'unexpect':4420 'uniqu':58 'unknown':399,1580,1792,1975,2560,3372 'unnecessari':6930 'unreli':5090 'untrust':824,4451 'updat':667,850,5546,6106,6469 'url':2269,2402,2443,2614,2679,2681,4499 'usag':681,2802,3578,5862,6381,7055 'use':3,16,41,76,149,153,193,457,726,749,813,817,831,960,1103,1162,1191,1318,1323,1327,1340,1354,1421,1425,1463,1493,1505,1709,1992,2025,2052,2057,2072,2083,2104,2108,2128,2138,2150,2158,2192,2212,2277,2336,2584,2639,2840,2928,3337,3633,3671,3674,3880,4290,4411,4460,4607,4720,5127,5228,5238,5260,5582,5651,5747,5778,5865,6034,6142,6263,6479,6492,6540,6562,6640,6677,6721,6842,6848,6857,6861,6886,6950,6974,6997,7044,7147,7153,7159,7220 'user':548,578,580,871,945,1999,2090,2672,2697,2699,2766,2861,2985,3002,3327,3332,4680,4702,4707,5047,5052,5080,5083,5493,5719,5917,6029,6476,6692,6907,6914,6917,7087,7101,7113,7123,7135,7154,7160,7167,7174,7182,7188,7194,7200,7206,7212 'user-ag':5079 'useradd':873 'uuid':3923 'uuid.uuid4':3927 'v':3802,3820,3824,3828,3834 'valid':6839,7245 'valu':4795,5387,5397,5410,5411 'variabl':4941 'varianc':4873,4895 'vast':4472 'vector':4485 'verif':2202,5413,6810 'verifi':5419,5445,6113 'version':955,1383 'via':1245,1602,3113 'viabl':6644 'view':28,1378,1473,1885 'virtual':753,925,1469 'visibl':5201 'vision':62,90,111,131,158,427,546,1430,2167,2193,2196,2528,4728,4770,4819,5202,5374,5390,5528,6170,7125,7179 'vision-bas':61,2166,7178 'vision-languag':110 'vision_agent.select':5394 'visual':2201,2230,5224,6468,7210 'vnc':927,932,966,1471 'volum':1010,1045 'vs':2177,2194 'vulner':6622 'w':1956,4228 'wait':2437,2847,5543,5625 'want':5589 'warn':6926,6947,6972,6995,7018,7042 'wast':2116 'way':4466 'wb':4021,4047 'weather':692,2827 'weather.com':2823 'web':2204,2221,2289,4401,4415,5371,7090,7100 'web-on':7089 'webpag':4474 'websit':4751,6099 'width':1515 'win64':5058 'window':5055,5738,5793,5820,5861 'window.scrollby':2491 'window.scrolly':5430,5451 'within':4906 'without':697,6581,6843,6858,6922,6943,7014 'wobbl':5030 'work':2845,4575,5110,5447,5832,7149 'workdir':920 'workspac':4535 'world':484,1351,2933,5627,5631 'would':4365 'wrap':4366 'wrapper':1050 'write':3044,4160 'wrong':804,6571,6575 'x':283,286,294,305,375,378,382,391,474,1652,1662,3219,3384,3602,4884,4910,4923,4924,5007,5031,5041,5066,5306,5326,5328,5330,5332,5346,5357,5470 'x.value':3220 'x11vnc':857 'x64':5059 'xdotool':1659,1673,1684,1695,1710,1717,1747,1753,1755,1783 'xdotool/scrot':1603 'xterm':859 'xvfb':856 'y':284,288,295,306,376,380,383,392,476,855,900,1653,1664,3161,3386,3604,3998,4886,4916,4926,4927,5018,5035,5043,5308,5335,5337,5339,5341,5347,5359 'y/n':3155 'yes':3162 'york':2830 'zoom':1389,5138","prices":[{"id":"a981a81b-e4d6-4664-880e-a9c0d8508fee","listingId":"a99ec49f-1cd9-4c52-b844-0e7538fc5b76","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:39:23.863Z"}],"sources":[{"listingId":"a99ec49f-1cd9-4c52-b844-0e7538fc5b76","source":"github","sourceId":"sickn33/antigravity-awesome-skills/computer-use-agents","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/computer-use-agents","isPrimary":false,"firstSeenAt":"2026-04-18T21:34:52.593Z","lastSeenAt":"2026-04-25T06:50:52.564Z"},{"listingId":"a99ec49f-1cd9-4c52-b844-0e7538fc5b76","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/computer-use-agents","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/computer-use-agents","isPrimary":true,"firstSeenAt":"2026-04-18T20:39:23.863Z","lastSeenAt":"2026-04-23T00:40:54.879Z"}],"details":{"listingId":"a99ec49f-1cd9-4c52-b844-0e7538fc5b76","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"computer-use-agents","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34997,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-25T06:33:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"332e6dad1c317f5eb1813304df62e0fa5199dcb6","skill_md_path":"skills/computer-use-agents/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/computer-use-agents"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"computer-use-agents","description":"Build AI agents that interact with computers like humans do -"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/computer-use-agents"},"updatedAt":"2026-04-25T06:50:52.564Z"}}