{
  "schemaVersion": "1.0",
  "item": {
    "slug": "lybic-sandbox",
    "name": "Lybic Sandbox",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/AEnjoy/lybic-sandbox",
    "canonicalUrl": "https://clawhub.ai/AEnjoy/lybic-sandbox",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/lybic-sandbox",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=lybic-sandbox",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "README.md",
      "QUICKREF.md",
      "examples/01_execute_code.py",
      "examples/04_manage_sandboxes.py",
      "examples/06_http_port_mapping.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/lybic-sandbox"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/lybic-sandbox",
    "agentPageUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Lybic Sandbox Control Skill",
        "body": "You are an expert at controlling Lybic cloud sandboxes using the Lybic Python SDK."
      },
      {
        "title": "Your Capabilities",
        "body": "You can help users interact with Lybic cloud sandboxes to:\n\nManage Sandboxes\n\nCreate sandboxes (Windows/Linux/Android)\nList, get details, and delete sandboxes\nMonitor sandbox state and lifecycle\n\n\n\nPerform GUI Automation\n\nDesktop (Windows/Linux): Mouse clicks, keyboard input, scrolling, dragging\nMobile (Android): Touch, swipe, long press, app management\nTake screenshots for visual feedback\n\n\n\nExecute Code and Commands\n\nRun Python, Node.js, Go, Rust, Java code\nExecute shell commands and scripts\nHandle stdin/stdout/stderr with base64 encoding\n\n\n\nManage Files\n\nDownload files from URLs into sandbox\nCopy files within sandbox or between locations\nRead and write files in sandbox\n\n\n\nNetwork Operations\n\nCreate HTTP port mappings\nForward sandbox ports to public URLs\nEnable external access to sandbox services\n\n\n\nProject Management\n\nCreate and organize projects\nManage sandboxes within projects\nTrack organization usage"
      },
      {
        "title": "Prerequisites",
        "body": "The Lybic Python SDK must be installed:\n\npip install lybic\n\nUsers need Lybic credentials set via environment variables:\n\nLYBIC_ORG_ID - Organization ID\nLYBIC_API_KEY - API key\n\nOf course, these two parameters can also be manually specified and passed to the client.\n\nimport asyncio\nfrom lybic import LybicClient, LybicAuth\n\nasync def main():\n    async with LybicClient(LybicAuth(\n            org_id=\"your_org_id\", # Lybic organization ID\n            api_key=\"your_api_key\"\n         )) as client:\n        # Your code here\n        pass"
      },
      {
        "title": "1. Always use async/await pattern",
        "body": "import asyncio\nfrom lybic import LybicClient\n\nasync def main():\n    async with LybicClient() as client:\n        # Your code here\n        pass\n\nif __name__ == '__main__':\n    asyncio.run(main())"
      },
      {
        "title": "2. Use proper error handling",
        "body": "try:\n    result = await client.sandbox.create(name=\"test\", shape=\"beijing-2c-4g-cpu-linux\")\n    print(f\"Created: {result.id}\")\nexcept Exception as e:\n    print(f\"Error: {e}\")"
      },
      {
        "title": "3. Handle base64 encoding for process I/O",
        "body": "import base64\n\n# For stdin\ncode = \"print('hello')\"\nstdin_b64 = base64.b64encode(code.encode()).decode()\n\n# For stdout/stderr\nresult = await client.sandbox.execute_process(...)\noutput = base64.b64decode(result.stdoutBase64 or '').decode()"
      },
      {
        "title": "4. Use fractional coordinates for GUI actions",
        "body": "# Recommended: Resolution-independent\naction = {\n    \"type\": \"mouse:click\",\n    \"x\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},  # 50%\n    \"y\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},  # 50%\n    \"button\": 1\n}\n\n# Alternative: Absolute pixels (less portable)\naction = {\n    \"type\": \"mouse:click\",\n    \"x\": {\"type\": \"px\", \"value\": 500},\n    \"y\": {\"type\": \"px\", \"value\": 300},\n    \"button\": 1\n}"
      },
      {
        "title": "Pattern 1: Create sandbox and run code",
        "body": "import asyncio\nimport base64\nfrom lybic import LybicClient\n\nasync def run_code_in_sandbox():\n    async with LybicClient() as client:\n        # Create linux based code sandbox\n        sandbox = await client.sandbox.create(\n            name=\"code-runner\",\n            shape=\"beijing-2c-4g-cpu-linux\"\n        )\n        \n        # Execute code\n        code = \"print('Hello from sandbox')\"\n        result = await client.sandbox.execute_process(\n            sandbox.id,\n            executable=\"python3\",\n            stdinBase64=base64.b64encode(code.encode()).decode()\n        )\n        \n        print(base64.b64decode(result.stdoutBase64).decode())\n        \n        # Cleanup\n        await client.sandbox.delete(sandbox.id)\n\nasyncio.run(run_code_in_sandbox())"
      },
      {
        "title": "Pattern 2: GUI automation with screenshot",
        "body": "import asyncio\nfrom lybic import LybicClient\n\nasync def automate_gui():\n    async with LybicClient() as client:\n        sandbox_id = \"SBX-xxxx\"\n        \n        # Take initial screenshot\n        url, img, _ = await client.sandbox.get_screenshot(sandbox_id)\n        img.show()\n        \n        # Click at center\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"mouse:click\",\n                \"x\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},\n                \"y\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},\n                \"button\": 1\n            }\n        )\n        \n        # Type text\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"keyboard:type\",\n                \"content\": \"Hello!\"\n            }\n        )\n        \n        # Press Enter\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"keyboard:hotkey\",\n                \"keys\": \"Return\"\n            }\n        )\n\nasyncio.run(automate_gui())"
      },
      {
        "title": "Pattern 3: Download file and process",
        "body": "import asyncio\nimport base64\nfrom lybic import LybicClient\nfrom lybic.dto import FileCopyItem, HttpGetLocation, SandboxFileLocation\n\nasync def download_and_process():\n    async with LybicClient() as client:\n        sandbox_id = \"SBX-xxxx\"\n        \n        # Download file\n        await client.sandbox.copy_files(\n            sandbox_id,\n            files=[\n                FileCopyItem(\n                    id=\"dataset\",\n                    src=HttpGetLocation(url=\"https://example.com/data.csv\"),\n                    dest=SandboxFileLocation(path=\"/tmp/data.csv\")\n                )\n            ]\n        )\n        \n        # Process with Python\n        code = \"\"\"\nimport pandas as pd\ndf = pd.read_csv('/tmp/data.csv')\nprint(df.describe())\n\"\"\"\n        result = await client.sandbox.execute_process(\n            sandbox_id,\n            executable=\"python3\",\n            stdinBase64=base64.b64encode(code.encode()).decode()\n        )\n        \n        print(base64.b64decode(result.stdoutBase64).decode())\n\nasyncio.run(download_and_process())"
      },
      {
        "title": "Mouse Actions (Computer Use)",
        "body": "# Click\n{\"type\": \"mouse:click\", \"x\": {...}, \"y\": {...}, \"button\": 1}  # 1=left, 2=right\n\n# Double-click\n{\"type\": \"mouse:doubleClick\", \"x\": {...}, \"y\": {...}, \"button\": 1}\n\n# Move\n{\"type\": \"mouse:move\", \"x\": {...}, \"y\": {...}}\n\n# Drag\n{\"type\": \"mouse:drag\", \"startX\": {...}, \"startY\": {...}, \"endX\": {...}, \"endY\": {...}}\n\n# Scroll\n{\"type\": \"mouse:scroll\", \"x\": {...}, \"y\": {...}, \"stepVertical\": -5, \"stepHorizontal\": 0}"
      },
      {
        "title": "Keyboard Actions (Computer Use)",
        "body": "# Type text\n{\"type\": \"keyboard:type\", \"content\": \"Hello, World!\"}\n\n# Hotkey\n{\"type\": \"keyboard:hotkey\", \"keys\": \"ctrl+c\"}  # Copy\n{\"type\": \"keyboard:hotkey\", \"keys\": \"Return\"}  # Enter\n{\"type\": \"keyboard:hotkey\", \"keys\": \"ctrl+shift+s\"}  # Save as"
      },
      {
        "title": "Touch Actions (Mobile Use)",
        "body": "# Tap\n{\"type\": \"touch:tap\", \"x\": {...}, \"y\": {...}}\n\n# Long press\n{\"type\": \"touch:longPress\", \"x\": {...}, \"y\": {...}, \"duration\": 2000}\n\n# Swipe\n{\"type\": \"touch:swipe\", \"x\": {...}, \"y\": {...}, \"direction\": \"up\", \"distance\": {...}}\n\n# Android buttons\n{\"type\": \"android:back\"}\n{\"type\": \"android:home\"}"
      },
      {
        "title": "App Management (Mobile Use)",
        "body": "# Start app\n{\"type\": \"os:startApp\", \"packageName\": \"com.android.chrome\"}\n{\"type\": \"os:startAppByName\", \"name\": \"Chrome\"}\n\n# Close app\n{\"type\": \"os:closeApp\", \"packageName\": \"com.android.chrome\"}\n{\"type\": \"os:closeAppByName\", \"name\": \"Chrome\"}\n\n# List apps\n{\"type\": \"os:listApps\"}"
      },
      {
        "title": "Common Actions",
        "body": "# Screenshot\n{\"type\": \"screenshot\"}\n\n# Wait\n{\"type\": \"wait\", \"duration\": 3000}  # milliseconds\n\n# Task status\n{\"type\": \"finished\", \"message\": \"Task completed\"}\n{\"type\": \"failed\", \"message\": \"Error occurred\"}"
      },
      {
        "title": "Best Practices",
        "body": "Use fractional coordinates: More portable across different screen resolutions\nTake screenshots: Help verify GUI state before and after actions\nHandle errors: Always wrap API calls in try-except blocks\nClean up resources: Delete sandboxes when done to avoid charges\nBase64 encode I/O: Remember stdin/stdout use base64 encoding\nCheck exit codes: Use exitCode to verify process success (0 = success)"
      },
      {
        "title": "Sandbox Shapes",
        "body": "Lybic determines the operating system type of the cloud sandbox through the shape parameter when creating the sandbox.\n\nWindows: beijing-2c-4g-cpu\nLinux: beijing-2c-4g-cpu-linux\nAndroid: acep-shenzhen-enhanced or acep-wenzhou-common-pro"
      },
      {
        "title": "Troubleshooting",
        "body": "Sandbox not ready: Wait longer after creation, check status with get()\nAction fails: Verify coordinates are within screen bounds\nProcess timeout: Long-running processes need special handling (see docs)\nFile not found: Ensure paths exist in sandbox before accessing\nImport errors: Verify package is pre-installed or install with pip3 install"
      },
      {
        "title": "When to Use This Skill",
        "body": "Use this skill when users need to:\n\nRun code in an isolated cloud environment\nAutomate GUI applications (desktop or mobile)\nTest web services in a sandbox\nProcess data in a clean environment\nInteract with applications remotely\nPerform browser automation\nTest mobile apps on Android"
      },
      {
        "title": "Documentation",
        "body": "For detailed API reference:\n\nPython SDK Docs\nAction Space Docs\nCode Execution Docs"
      },
      {
        "title": "Remember",
        "body": "Always check if credentials are set before running code\nProvide clear explanations of what the code does\nShow complete working examples\nHandle errors gracefully\nClean up resources (delete sandboxes) when appropriate\nTake screenshots to verify GUI actions\nUse async/await consistently"
      }
    ],
    "body": "Lybic Sandbox Control Skill\n\nYou are an expert at controlling Lybic cloud sandboxes using the Lybic Python SDK.\n\nYour Capabilities\n\nYou can help users interact with Lybic cloud sandboxes to:\n\nManage Sandboxes\n\nCreate sandboxes (Windows/Linux/Android)\nList, get details, and delete sandboxes\nMonitor sandbox state and lifecycle\n\nPerform GUI Automation\n\nDesktop (Windows/Linux): Mouse clicks, keyboard input, scrolling, dragging\nMobile (Android): Touch, swipe, long press, app management\nTake screenshots for visual feedback\n\nExecute Code and Commands\n\nRun Python, Node.js, Go, Rust, Java code\nExecute shell commands and scripts\nHandle stdin/stdout/stderr with base64 encoding\n\nManage Files\n\nDownload files from URLs into sandbox\nCopy files within sandbox or between locations\nRead and write files in sandbox\n\nNetwork Operations\n\nCreate HTTP port mappings\nForward sandbox ports to public URLs\nEnable external access to sandbox services\n\nProject Management\n\nCreate and organize projects\nManage sandboxes within projects\nTrack organization usage\nPrerequisites\n\nThe Lybic Python SDK must be installed:\n\npip install lybic\n\n\nUsers need Lybic credentials set via environment variables:\n\nLYBIC_ORG_ID - Organization ID\nLYBIC_API_KEY - API key\n\nOf course, these two parameters can also be manually specified and passed to the client.\n\nimport asyncio\nfrom lybic import LybicClient, LybicAuth\n\nasync def main():\n    async with LybicClient(LybicAuth(\n            org_id=\"your_org_id\", # Lybic organization ID\n            api_key=\"your_api_key\"\n         )) as client:\n        # Your code here\n        pass\n\nCode Guidelines\n1. Always use async/await pattern\nimport asyncio\nfrom lybic import LybicClient\n\nasync def main():\n    async with LybicClient() as client:\n        # Your code here\n        pass\n\nif __name__ == '__main__':\n    asyncio.run(main())\n\n2. Use proper error handling\ntry:\n    result = await client.sandbox.create(name=\"test\", shape=\"beijing-2c-4g-cpu-linux\")\n    print(f\"Created: {result.id}\")\nexcept Exception as e:\n    print(f\"Error: {e}\")\n\n3. Handle base64 encoding for process I/O\nimport base64\n\n# For stdin\ncode = \"print('hello')\"\nstdin_b64 = base64.b64encode(code.encode()).decode()\n\n# For stdout/stderr\nresult = await client.sandbox.execute_process(...)\noutput = base64.b64decode(result.stdoutBase64 or '').decode()\n\n4. Use fractional coordinates for GUI actions\n# Recommended: Resolution-independent\naction = {\n    \"type\": \"mouse:click\",\n    \"x\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},  # 50%\n    \"y\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},  # 50%\n    \"button\": 1\n}\n\n# Alternative: Absolute pixels (less portable)\naction = {\n    \"type\": \"mouse:click\",\n    \"x\": {\"type\": \"px\", \"value\": 500},\n    \"y\": {\"type\": \"px\", \"value\": 300},\n    \"button\": 1\n}\n\nCommon Patterns\nPattern 1: Create sandbox and run code\nimport asyncio\nimport base64\nfrom lybic import LybicClient\n\nasync def run_code_in_sandbox():\n    async with LybicClient() as client:\n        # Create linux based code sandbox\n        sandbox = await client.sandbox.create(\n            name=\"code-runner\",\n            shape=\"beijing-2c-4g-cpu-linux\"\n        )\n        \n        # Execute code\n        code = \"print('Hello from sandbox')\"\n        result = await client.sandbox.execute_process(\n            sandbox.id,\n            executable=\"python3\",\n            stdinBase64=base64.b64encode(code.encode()).decode()\n        )\n        \n        print(base64.b64decode(result.stdoutBase64).decode())\n        \n        # Cleanup\n        await client.sandbox.delete(sandbox.id)\n\nasyncio.run(run_code_in_sandbox())\n\nPattern 2: GUI automation with screenshot\nimport asyncio\nfrom lybic import LybicClient\n\nasync def automate_gui():\n    async with LybicClient() as client:\n        sandbox_id = \"SBX-xxxx\"\n        \n        # Take initial screenshot\n        url, img, _ = await client.sandbox.get_screenshot(sandbox_id)\n        img.show()\n        \n        # Click at center\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"mouse:click\",\n                \"x\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},\n                \"y\": {\"type\": \"/\", \"numerator\": 1, \"denominator\": 2},\n                \"button\": 1\n            }\n        )\n        \n        # Type text\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"keyboard:type\",\n                \"content\": \"Hello!\"\n            }\n        )\n        \n        # Press Enter\n        await client.sandbox.execute_sandbox_action(\n            sandbox_id,\n            action={\n                \"type\": \"keyboard:hotkey\",\n                \"keys\": \"Return\"\n            }\n        )\n\nasyncio.run(automate_gui())\n\nPattern 3: Download file and process\nimport asyncio\nimport base64\nfrom lybic import LybicClient\nfrom lybic.dto import FileCopyItem, HttpGetLocation, SandboxFileLocation\n\nasync def download_and_process():\n    async with LybicClient() as client:\n        sandbox_id = \"SBX-xxxx\"\n        \n        # Download file\n        await client.sandbox.copy_files(\n            sandbox_id,\n            files=[\n                FileCopyItem(\n                    id=\"dataset\",\n                    src=HttpGetLocation(url=\"https://example.com/data.csv\"),\n                    dest=SandboxFileLocation(path=\"/tmp/data.csv\")\n                )\n            ]\n        )\n        \n        # Process with Python\n        code = \"\"\"\nimport pandas as pd\ndf = pd.read_csv('/tmp/data.csv')\nprint(df.describe())\n\"\"\"\n        result = await client.sandbox.execute_process(\n            sandbox_id,\n            executable=\"python3\",\n            stdinBase64=base64.b64encode(code.encode()).decode()\n        )\n        \n        print(base64.b64decode(result.stdoutBase64).decode())\n\nasyncio.run(download_and_process())\n\nAction Reference\nMouse Actions (Computer Use)\n# Click\n{\"type\": \"mouse:click\", \"x\": {...}, \"y\": {...}, \"button\": 1}  # 1=left, 2=right\n\n# Double-click\n{\"type\": \"mouse:doubleClick\", \"x\": {...}, \"y\": {...}, \"button\": 1}\n\n# Move\n{\"type\": \"mouse:move\", \"x\": {...}, \"y\": {...}}\n\n# Drag\n{\"type\": \"mouse:drag\", \"startX\": {...}, \"startY\": {...}, \"endX\": {...}, \"endY\": {...}}\n\n# Scroll\n{\"type\": \"mouse:scroll\", \"x\": {...}, \"y\": {...}, \"stepVertical\": -5, \"stepHorizontal\": 0}\n\nKeyboard Actions (Computer Use)\n# Type text\n{\"type\": \"keyboard:type\", \"content\": \"Hello, World!\"}\n\n# Hotkey\n{\"type\": \"keyboard:hotkey\", \"keys\": \"ctrl+c\"}  # Copy\n{\"type\": \"keyboard:hotkey\", \"keys\": \"Return\"}  # Enter\n{\"type\": \"keyboard:hotkey\", \"keys\": \"ctrl+shift+s\"}  # Save as\n\nTouch Actions (Mobile Use)\n# Tap\n{\"type\": \"touch:tap\", \"x\": {...}, \"y\": {...}}\n\n# Long press\n{\"type\": \"touch:longPress\", \"x\": {...}, \"y\": {...}, \"duration\": 2000}\n\n# Swipe\n{\"type\": \"touch:swipe\", \"x\": {...}, \"y\": {...}, \"direction\": \"up\", \"distance\": {...}}\n\n# Android buttons\n{\"type\": \"android:back\"}\n{\"type\": \"android:home\"}\n\nApp Management (Mobile Use)\n# Start app\n{\"type\": \"os:startApp\", \"packageName\": \"com.android.chrome\"}\n{\"type\": \"os:startAppByName\", \"name\": \"Chrome\"}\n\n# Close app\n{\"type\": \"os:closeApp\", \"packageName\": \"com.android.chrome\"}\n{\"type\": \"os:closeAppByName\", \"name\": \"Chrome\"}\n\n# List apps\n{\"type\": \"os:listApps\"}\n\nCommon Actions\n# Screenshot\n{\"type\": \"screenshot\"}\n\n# Wait\n{\"type\": \"wait\", \"duration\": 3000}  # milliseconds\n\n# Task status\n{\"type\": \"finished\", \"message\": \"Task completed\"}\n{\"type\": \"failed\", \"message\": \"Error occurred\"}\n\nBest Practices\nUse fractional coordinates: More portable across different screen resolutions\nTake screenshots: Help verify GUI state before and after actions\nHandle errors: Always wrap API calls in try-except blocks\nClean up resources: Delete sandboxes when done to avoid charges\nBase64 encode I/O: Remember stdin/stdout use base64 encoding\nCheck exit codes: Use exitCode to verify process success (0 = success)\nSandbox Shapes\n\nLybic determines the operating system type of the cloud sandbox through the shape parameter when creating the sandbox.\n\nWindows: beijing-2c-4g-cpu\nLinux: beijing-2c-4g-cpu-linux\nAndroid: acep-shenzhen-enhanced or acep-wenzhou-common-pro\nTroubleshooting\nSandbox not ready: Wait longer after creation, check status with get()\nAction fails: Verify coordinates are within screen bounds\nProcess timeout: Long-running processes need special handling (see docs)\nFile not found: Ensure paths exist in sandbox before accessing\nImport errors: Verify package is pre-installed or install with pip3 install\nWhen to Use This Skill\n\nUse this skill when users need to:\n\nRun code in an isolated cloud environment\nAutomate GUI applications (desktop or mobile)\nTest web services in a sandbox\nProcess data in a clean environment\nInteract with applications remotely\nPerform browser automation\nTest mobile apps on Android\nDocumentation\n\nFor detailed API reference:\n\nPython SDK Docs\nAction Space Docs\nCode Execution Docs\nRemember\nAlways check if credentials are set before running code\nProvide clear explanations of what the code does\nShow complete working examples\nHandle errors gracefully\nClean up resources (delete sandboxes) when appropriate\nTake screenshots to verify GUI actions\nUse async/await consistently"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/AEnjoy/lybic-sandbox",
    "publisherUrl": "https://clawhub.ai/AEnjoy/lybic-sandbox",
    "owner": "AEnjoy",
    "version": "0.1.3",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/lybic-sandbox",
    "downloadUrl": "https://openagent3.xyz/downloads/lybic-sandbox",
    "agentUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lybic-sandbox/agent.md"
  }
}