droidrun 0.5.0.dev7__tar.gz → 0.5.1.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/PKG-INFO +7 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/README.md +6 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/configuration.mdx +0 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/events-and-workflows.mdx +21 -60
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/prompts.mdx +6 -2
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/scripter-agent.mdx +17 -14
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/shared-state.mdx +11 -2
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/credentials.mdx +6 -4
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/custom-tools.mdx +4 -3
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/structured-output.mdx +2 -2
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/tracing.mdx +1 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/cli.mdx +6 -6
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/device-setup.mdx +14 -9
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/overview.mdx +1 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/quickstart.mdx +2 -4
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/base-tools.mdx +23 -16
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/configuration.mdx +70 -50
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/droid-agent.mdx +16 -21
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/tools_agent.py +49 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/droid_agent.py +52 -2
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/events.py +18 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/state.py +29 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/manager_agent.py +45 -24
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/main.py +13 -59
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/tools_system.jinja2 +1 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/system.jinja2 +2 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_example.yaml +3 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/config_manager.py +1 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/migrations/__init__.py +1 -1
- droidrun-0.5.1.dev2/droidrun/config_manager/migrations/v003_add_auto_setup.py +12 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/client.py +9 -4
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/portal.py +217 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/indexed_formatter.py +14 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/pyproject.toml +1 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/uv.lock +1 -1
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.dockerignore +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/black.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/bounty.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/claude-code-review.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/claude.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/docker.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/publish.yml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.gitignore +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.python-version +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/CHANGELOG.md +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/CONTRIBUTING.md +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/Dockerfile +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/LICENSE +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/MANIFEST.in +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/SKILL.md +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/ favicon.svg +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/custom.css +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/docs.json +51 -51
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/favicon-dark.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/favicon.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/logo/dark.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/logo/light.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/agent.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/android-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/models.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/portal-app.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/cli.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/gemini.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/ollama.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/openailike.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/overview.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/telemetry.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/images/portal_apk.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/overview.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/quickstart.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/architecture.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/events-and-workflows.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/prompts.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/scripter-agent.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/shared-state.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/app-cards.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/credentials.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/custom-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/custom-variables.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/structured-output.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/telemetry.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/tracing.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/cli.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/device-setup.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/docker.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/migration-v3-to-v4.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/overview.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/overview.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/quickstart.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/adb-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/base-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/droid-agent.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/ios-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/reference.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/architecture.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/app-cards.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/custom-variables.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/telemetry.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/docker.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/overview.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/adb-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/ios-tools.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/reference.mdx +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/__main__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/action_context.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/action_result.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/codeact_agent.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/xml_parser.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/constants.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/executor_agent.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/prompts.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/autoglm.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/mai_ui.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/prompts.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/stateless_manager_agent.py +18 -18
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/app_starter_workflow.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/structured_output_agent.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/text_manipulator.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/scripter_agent.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/tool_registry.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/trajectory/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/trajectory/writer.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/usage.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/actions.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/chat_utils.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/code_checker.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/executer.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/inference.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/llm_loader.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/llm_picker.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/prompt_resolver.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/signatures.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/tracing_setup.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/trajectory.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/app_card_provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/composite_provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/local_provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/server_provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/doctor.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/event_handler.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/logs.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/app.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/commands.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/advanced_tab.tcss +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/app.tcss +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/models_tab.tcss +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/settings_screen.tcss +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/advanced_tab.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/agent_tab.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/data.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/models_tab.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/section.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/settings_screen.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/command_dropdown.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/device_picker.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/input_bar.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/log_view.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/status_bar.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/README.md +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/app_cards.json +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/gmail.md +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/credentials_example.yaml +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/system.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/tools_user.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/user.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/executor/rev1.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/executor/system.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/rev1.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/stateless.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/trained.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/scripter/system.jinja2 +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/env_keys.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/loader.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/migrations/v002_add_code_exec.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/path_resolver.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/prompt_loader.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/safe_execution.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/credential_manager.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/file_credential_manager.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/log_handlers.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/__main__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/cli.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/replay.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/adapter.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/config.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/events.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/langfuse_processor.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/phoenix.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/tracker.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/android/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/android/portal_client.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/android.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/base.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/cloud.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/ios.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/recording.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/stealth.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/base.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/concise_filter.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/detailed_filter.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/base.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/coordinate.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/element_search.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/geometry.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ios/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/__init__.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/ios_provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/provider.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/state.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/stealth_state.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/gen-docs-sdk-ref.sh +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/setup.py +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/static/droidrun-dark.png +0 -0
- {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/static/droidrun.png +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: droidrun
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.1.dev2
|
|
4
4
|
Summary: A framework for controlling Android devices through LLM agents
|
|
5
5
|
Project-URL: Homepage, https://github.com/droidrun/droidrun
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/droidrun/droidrun/issues
|
|
@@ -71,6 +71,8 @@ Description-Content-Type: text/markdown
|
|
|
71
71
|
<img src="./static/droidrun.png" width="full">
|
|
72
72
|
</picture>
|
|
73
73
|
|
|
74
|
+
<h3 align="center"><em>DroidRun is not affiliated with, endorsed by, or sponsored by Google LLC or the Android Open Source Project. Android™ is a trademark of Google LLC.</em></h3>
|
|
75
|
+
|
|
74
76
|
<div align="center">
|
|
75
77
|
|
|
76
78
|
[](https://docs.droidrun.ai)
|
|
@@ -107,6 +109,10 @@ Description-Content-Type: text/markdown
|
|
|
107
109
|
|
|
108
110
|
DroidRun is a powerful framework for controlling Android and iOS devices through LLM agents. It allows you to automate device interactions using natural language commands. [Checkout our benchmark results](https://droidrun.ai/benchmark)
|
|
109
111
|
|
|
112
|
+
## ⚖️ Disclaimer
|
|
113
|
+
|
|
114
|
+
Droidrun is an independent, open-source project and is not affiliated with, endorsed by, or sponsored by Google LLC or the Android Open Source Project. "Android" is a trademark of Google LLC. All other trademarks and brand names mentioned are the property of their respective owners. DroidRun is a third-party tool that interacts with the Android platform but is not part of the Android ecosystem.
|
|
115
|
+
|
|
110
116
|
## Why Droidrun?
|
|
111
117
|
|
|
112
118
|
- 🤖 Control Android and iOS devices with natural language commands
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
<img src="./static/droidrun.png" width="full">
|
|
5
5
|
</picture>
|
|
6
6
|
|
|
7
|
+
<h3 align="center"><em>DroidRun is not affiliated with, endorsed by, or sponsored by Google LLC or the Android Open Source Project. Android™ is a trademark of Google LLC.</em></h3>
|
|
8
|
+
|
|
7
9
|
<div align="center">
|
|
8
10
|
|
|
9
11
|
[](https://docs.droidrun.ai)
|
|
@@ -40,6 +42,10 @@
|
|
|
40
42
|
|
|
41
43
|
DroidRun is a powerful framework for controlling Android and iOS devices through LLM agents. It allows you to automate device interactions using natural language commands. [Checkout our benchmark results](https://droidrun.ai/benchmark)
|
|
42
44
|
|
|
45
|
+
## ⚖️ Disclaimer
|
|
46
|
+
|
|
47
|
+
Droidrun is an independent, open-source project and is not affiliated with, endorsed by, or sponsored by Google LLC or the Android Open Source Project. "Android" is a trademark of Google LLC. All other trademarks and brand names mentioned are the property of their respective owners. DroidRun is a third-party tool that interacts with the Android platform but is not part of the Android ecosystem.
|
|
48
|
+
|
|
43
49
|
## Why Droidrun?
|
|
44
50
|
|
|
45
51
|
- 🤖 Control Android and iOS devices with natural language commands
|
|
@@ -75,7 +75,7 @@ class ManagerPlanEvent(Event):
|
|
|
75
75
|
plan: str
|
|
76
76
|
current_subgoal: str
|
|
77
77
|
thought: str
|
|
78
|
-
|
|
78
|
+
answer: str = ""
|
|
79
79
|
success: bool | None = None
|
|
80
80
|
|
|
81
81
|
class ExecutorInputEvent(Event):
|
|
@@ -115,8 +115,8 @@ Internal to ManagerAgent, streamed to frontend/logging.
|
|
|
115
115
|
class ManagerContextEvent(Event): pass
|
|
116
116
|
|
|
117
117
|
class ManagerResponseEvent(Event):
|
|
118
|
-
|
|
119
|
-
usage: Optional[UsageResult]
|
|
118
|
+
response: str
|
|
119
|
+
usage: Optional[UsageResult] = None
|
|
120
120
|
|
|
121
121
|
class ManagerPlanDetailsEvent(Event):
|
|
122
122
|
plan: str
|
|
@@ -145,7 +145,7 @@ class ExecutorActionEvent(Event):
|
|
|
145
145
|
action_json: str
|
|
146
146
|
thought: str
|
|
147
147
|
description: str
|
|
148
|
-
full_response: str
|
|
148
|
+
full_response: str = ""
|
|
149
149
|
|
|
150
150
|
class ExecutorActionResultEvent(Event):
|
|
151
151
|
action: Dict
|
|
@@ -190,10 +190,10 @@ class ScripterInputEvent(Event):
|
|
|
190
190
|
pass
|
|
191
191
|
|
|
192
192
|
class ScripterThinkingEvent(Event):
|
|
193
|
-
|
|
194
|
-
code: Optional[str]
|
|
195
|
-
full_response: str
|
|
196
|
-
usage: Optional[UsageResult]
|
|
193
|
+
thought: str
|
|
194
|
+
code: Optional[str] = None
|
|
195
|
+
full_response: str = ""
|
|
196
|
+
usage: Optional[UsageResult] = None
|
|
197
197
|
|
|
198
198
|
class ScripterExecutionEvent(Event):
|
|
199
199
|
code: str
|
|
@@ -204,64 +204,25 @@ class ScripterExecutionResultEvent(Event):
|
|
|
204
204
|
class ScripterEndEvent(Event):
|
|
205
205
|
message: str
|
|
206
206
|
success: bool
|
|
207
|
-
code_executions: int
|
|
207
|
+
code_executions: int = 0
|
|
208
208
|
```
|
|
209
209
|
</Accordion>
|
|
210
210
|
|
|
211
|
-
<Accordion title="
|
|
212
|
-
Emitted when actions are performed, used for macro recording and trajectory tracking.
|
|
213
|
-
|
|
211
|
+
<Accordion title="Common, Visual & Telemetry Events">
|
|
214
212
|
```python
|
|
215
|
-
|
|
216
|
-
action_type: str
|
|
217
|
-
description: str
|
|
218
|
-
|
|
219
|
-
class TapActionEvent(MacroEvent):
|
|
220
|
-
x: int
|
|
221
|
-
y: int
|
|
222
|
-
element_index: int = None
|
|
223
|
-
element_text: str = ""
|
|
224
|
-
element_bounds: str = ""
|
|
225
|
-
|
|
226
|
-
class SwipeActionEvent(MacroEvent):
|
|
227
|
-
start_x: int
|
|
228
|
-
start_y: int
|
|
229
|
-
end_x: int
|
|
230
|
-
end_y: int
|
|
231
|
-
duration_ms: int
|
|
232
|
-
|
|
233
|
-
class DragActionEvent(MacroEvent):
|
|
234
|
-
start_x: int
|
|
235
|
-
start_y: int
|
|
236
|
-
end_x: int
|
|
237
|
-
end_y: int
|
|
238
|
-
duration_ms: int
|
|
239
|
-
|
|
240
|
-
class InputTextActionEvent(MacroEvent):
|
|
241
|
-
text: str
|
|
242
|
-
|
|
243
|
-
class KeyPressActionEvent(MacroEvent):
|
|
244
|
-
keycode: int
|
|
245
|
-
key_name: str = ""
|
|
246
|
-
|
|
247
|
-
class StartAppEvent(MacroEvent):
|
|
248
|
-
package: str
|
|
249
|
-
activity: str = None
|
|
250
|
-
|
|
251
|
-
class WaitEvent(MacroEvent):
|
|
252
|
-
duration: float
|
|
253
|
-
```
|
|
254
|
-
</Accordion>
|
|
255
|
-
|
|
256
|
-
<Accordion title="Visual & Telemetry Events">
|
|
257
|
-
```python
|
|
258
|
-
# Visual events
|
|
213
|
+
# Common events (droidrun/agent/common/events.py)
|
|
259
214
|
class ScreenshotEvent(Event):
|
|
260
215
|
screenshot: bytes
|
|
261
216
|
|
|
262
217
|
class RecordUIStateEvent(Event):
|
|
263
218
|
ui_state: list[Dict[str, Any]]
|
|
264
219
|
|
|
220
|
+
class ToolExecutionEvent(Event):
|
|
221
|
+
tool_name: str
|
|
222
|
+
tool_args: Dict[str, Any]
|
|
223
|
+
success: bool
|
|
224
|
+
summary: str
|
|
225
|
+
|
|
265
226
|
# Telemetry events (when enabled)
|
|
266
227
|
class DroidAgentInitEvent(TelemetryEvent):
|
|
267
228
|
goal: str
|
|
@@ -392,13 +353,13 @@ async def monitor_execution(goal: str):
|
|
|
392
353
|
- Coordination: `ManagerInputEvent`, `ManagerPlanEvent`, `ExecutorInputEvent`, `ExecutorResultEvent`
|
|
393
354
|
- Internal Manager: `ManagerContextEvent`, `ManagerResponseEvent`, `ManagerPlanDetailsEvent`
|
|
394
355
|
- Internal Executor: `ExecutorContextEvent`, `ExecutorResponseEvent`, `ExecutorActionEvent`, `ExecutorActionResultEvent`
|
|
395
|
-
-
|
|
356
|
+
- Tool execution: `ToolExecutionEvent` (after every tool dispatch)
|
|
396
357
|
- Visual: `ScreenshotEvent`, `RecordUIStateEvent` (when enabled)
|
|
397
358
|
|
|
398
359
|
**Direct Mode** (`reasoning=False`) emits:
|
|
399
360
|
- Coordination: `FastAgentExecuteEvent`, `FastAgentResultEvent`
|
|
400
361
|
- Internal FastAgent: `FastAgentInputEvent`, `FastAgentResponseEvent`, `FastAgentToolCallEvent`, `FastAgentOutputEvent`, `FastAgentEndEvent`
|
|
401
|
-
-
|
|
362
|
+
- Tool execution: `ToolExecutionEvent` (after every tool dispatch)
|
|
402
363
|
- Visual: `ScreenshotEvent`, `RecordUIStateEvent` (when enabled)
|
|
403
364
|
|
|
404
365
|
**ScripterAgent** (when triggered by `<script>` tags) emits:
|
|
@@ -419,9 +380,9 @@ async def monitor_execution(goal: str):
|
|
|
419
380
|
- Located in agent-specific event files
|
|
420
381
|
- Examples: `ManagerPlanDetailsEvent`, `ExecutorActionEvent`, `FastAgentResponseEvent`
|
|
421
382
|
|
|
422
|
-
**
|
|
383
|
+
**Common Events** - Emitted during execution (for screenshots, UI state recording, and tool tracking)
|
|
423
384
|
- Located in `droidrun/agent/common/events.py`
|
|
424
|
-
- Examples: `
|
|
385
|
+
- Examples: `ScreenshotEvent`, `RecordUIStateEvent`, `ToolExecutionEvent`
|
|
425
386
|
|
|
426
387
|
**Telemetry Events** - Captured for analytics (when enabled)
|
|
427
388
|
- Located in `droidrun/telemetry/events.py`
|
|
@@ -63,9 +63,13 @@ Each agent has access to different variables in its templates:
|
|
|
63
63
|
|
|
64
64
|
- `instruction` - User's goal
|
|
65
65
|
- `device_state` - Current UI tree
|
|
66
|
+
- `plan` - Current plan from Manager
|
|
66
67
|
- `subgoal` - Current subgoal from Manager
|
|
68
|
+
- `progress_status` - Cumulative progress summary
|
|
67
69
|
- `atomic_actions` - Available actions (includes custom tools)
|
|
68
70
|
- `action_history` - Recent actions with outcomes
|
|
71
|
+
- `available_secrets` - Available credential IDs
|
|
72
|
+
- `variables` - Custom variables passed to DroidAgent
|
|
69
73
|
|
|
70
74
|
### FastAgent
|
|
71
75
|
|
|
@@ -82,8 +86,8 @@ Each agent has access to different variables in its templates:
|
|
|
82
86
|
### Scripter
|
|
83
87
|
|
|
84
88
|
- `task` - Task description from Manager
|
|
85
|
-
- `
|
|
86
|
-
- `
|
|
89
|
+
- `max_steps` - Maximum execution steps allowed
|
|
90
|
+
- `available_libraries` - Descriptions of available Python libraries
|
|
87
91
|
|
|
88
92
|
## Example: Custom Manager Prompt
|
|
89
93
|
|
|
@@ -134,21 +134,24 @@ Found 23 contacts from New York and saved them to /tmp/filtered_contacts.json
|
|
|
134
134
|
```yaml
|
|
135
135
|
agent:
|
|
136
136
|
scripter:
|
|
137
|
+
enabled: true
|
|
137
138
|
max_steps: 10
|
|
138
|
-
safe_execution:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
139
|
+
safe_execution: true # Enable sandboxed execution
|
|
140
|
+
|
|
141
|
+
# Top-level safe execution config (shared by all code-executing agents)
|
|
142
|
+
safe_execution:
|
|
143
|
+
allowed_modules:
|
|
144
|
+
- requests # API calls, webhooks
|
|
145
|
+
- json # JSON parsing
|
|
146
|
+
- csv # CSV file operations
|
|
147
|
+
- pathlib # File path handling
|
|
148
|
+
blocked_modules:
|
|
149
|
+
- subprocess # Process spawning
|
|
150
|
+
- os # System operations
|
|
151
|
+
- sys # System modifications
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Safe execution** restricts dangerous operations when enabled. The `agent.scripter.safe_execution` flag enables sandboxing, and the top-level `safe_execution` config controls which modules and builtins are accessible.
|
|
152
155
|
|
|
153
156
|
## Key Points
|
|
154
157
|
|
|
@@ -34,16 +34,25 @@ class DroidAgentState(BaseModel):
|
|
|
34
34
|
summary_history: List[str] = [] # Action summaries
|
|
35
35
|
|
|
36
36
|
# Memory
|
|
37
|
-
|
|
37
|
+
manager_memory: str = "" # Manager's planning notes (append-only)
|
|
38
|
+
fast_memory: List[str] = [] # FastAgent remember() items (max 10)
|
|
38
39
|
|
|
39
40
|
# Planning (Manager)
|
|
40
41
|
plan: str = "" # Current plan
|
|
41
42
|
current_subgoal: str = "" # Current subgoal
|
|
42
|
-
|
|
43
|
+
answer: str = "" # Final answer (manager completion or complete() tool)
|
|
44
|
+
|
|
45
|
+
# Completion (set by complete() tool)
|
|
46
|
+
finished: bool = False # Whether task is done
|
|
47
|
+
success: Optional[bool] = None # Whether task succeeded
|
|
43
48
|
|
|
44
49
|
# Error handling
|
|
45
50
|
error_flag_plan: bool = False # Signal error to Manager
|
|
46
51
|
error_descriptions: List[str] = [] # Error messages
|
|
52
|
+
err_to_manager_thresh: int = 2 # Consecutive errors before escalation
|
|
53
|
+
|
|
54
|
+
# Message history (for stateful agents)
|
|
55
|
+
message_history: List[ChatMessage] = [] # Preserves ThinkingBlock, ImageBlock, etc.
|
|
47
56
|
|
|
48
57
|
# Script execution (Scripter)
|
|
49
58
|
scripter_history: List[Dict] = [] # Scripter results
|
|
@@ -105,10 +105,12 @@ When credentials are provided, the `type_secret` action is **automatically avail
|
|
|
105
105
|
|
|
106
106
|
### FastAgent Mode
|
|
107
107
|
```xml
|
|
108
|
-
<
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
</
|
|
108
|
+
<function_calls>
|
|
109
|
+
<invoke name="type_secret">
|
|
110
|
+
<parameter name="secret_id">MY_PASSWORD</parameter>
|
|
111
|
+
<parameter name="index">5</parameter>
|
|
112
|
+
</invoke>
|
|
113
|
+
</function_calls>
|
|
112
114
|
```
|
|
113
115
|
|
|
114
116
|
The agent never sees the actual value - only the secret ID.
|
|
@@ -152,8 +152,8 @@ async def check_action_history(action_name: str, *, ctx, **kwargs) -> str:
|
|
|
152
152
|
if shared_state.step_number > 10:
|
|
153
153
|
return "Warning: Task taking too many steps"
|
|
154
154
|
|
|
155
|
-
# Access memory
|
|
156
|
-
if "skip_validation" in shared_state.
|
|
155
|
+
# Access fast memory
|
|
156
|
+
if any("skip_validation" in m for m in shared_state.fast_memory):
|
|
157
157
|
return "Validation skipped per memory"
|
|
158
158
|
|
|
159
159
|
return f"Action '{action_name}' not yet performed"
|
|
@@ -173,7 +173,8 @@ custom_tools = {
|
|
|
173
173
|
- `step_number` - Current execution step
|
|
174
174
|
- `action_history` - List of executed actions
|
|
175
175
|
- `action_outcomes` - Success/failure per action
|
|
176
|
-
- `
|
|
176
|
+
- `manager_memory` - Manager planning notes (append-only string)
|
|
177
|
+
- `fast_memory` - FastAgent remember() items (list of strings, max 10)
|
|
177
178
|
- `custom_variables` - User-provided variables
|
|
178
179
|
- `visited_packages` - Apps visited
|
|
179
180
|
- `current_package_name` - Current app package
|
|
@@ -117,7 +117,7 @@ if result.structured_output:
|
|
|
117
117
|
|
|
118
118
|
### Custom Extraction LLM
|
|
119
119
|
|
|
120
|
-
By default, extraction uses the `fast_agent` LLM.
|
|
120
|
+
By default, extraction uses the `structured_output` LLM profile. If not configured, it falls back to the `fast_agent` LLM. You can specify a dedicated `structured_output` profile:
|
|
121
121
|
|
|
122
122
|
**config.yaml:**
|
|
123
123
|
```yaml
|
|
@@ -257,7 +257,7 @@ async def finalize(self, ctx: Context, ev: FinalizeEvent) -> ResultEvent:
|
|
|
257
257
|
pydantic_model=self.output_model,
|
|
258
258
|
answer_text=ev.reason,
|
|
259
259
|
)
|
|
260
|
-
extraction_result = await
|
|
260
|
+
extraction_result = await structured_agent.run()
|
|
261
261
|
if extraction_result["success"]:
|
|
262
262
|
result.structured_output = extraction_result["structured_output"]
|
|
263
263
|
|
|
@@ -91,7 +91,7 @@ For more on using Phoenix, see the [Arize Phoenix documentation](https://docs.ar
|
|
|
91
91
|
Set environment variables to customize Phoenix:
|
|
92
92
|
|
|
93
93
|
```sh
|
|
94
|
-
# Custom Phoenix server URL (default: http://
|
|
94
|
+
# Custom Phoenix server URL (default: http://0.0.0.0:6006)
|
|
95
95
|
export phoenix_url=http://localhost:6006
|
|
96
96
|
|
|
97
97
|
# Project name for organizing traces
|
|
@@ -21,7 +21,7 @@ droidrun run "Turn on Do Not Disturb"
|
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
<Note>
|
|
24
|
-
**Auto-configuration**: If
|
|
24
|
+
**Auto-configuration**: If no config exists, Droidrun creates a default `config.yaml` at `~/.config/droidrun/config.yaml` automatically.
|
|
25
25
|
|
|
26
26
|
**Command shorthand**: `droidrun "task"` is equivalent to `droidrun run "task"`
|
|
27
27
|
</Note>
|
|
@@ -57,7 +57,7 @@ droidrun "<command>" [OPTIONS]
|
|
|
57
57
|
| `--tcp` | Use TCP instead of content provider | `false` |
|
|
58
58
|
| `--debug` | Verbose logging | `false` |
|
|
59
59
|
| `--save-trajectory` | Save execution (`none`, `step`, `action`) | `none` |
|
|
60
|
-
| `--config`, `-c` | Custom config path |
|
|
60
|
+
| `--config`, `-c` | Custom config path | `~/.config/droidrun/config.yaml` |
|
|
61
61
|
|
|
62
62
|
### Examples
|
|
63
63
|
|
|
@@ -174,7 +174,7 @@ droidrun setup --path /path/to/portal.apk
|
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
**What it does:**
|
|
177
|
-
1. Downloads
|
|
177
|
+
1. Downloads compatible Portal APK for your SDK version
|
|
178
178
|
2. Installs with all permissions
|
|
179
179
|
3. Auto-enables accessibility service
|
|
180
180
|
4. Opens settings if manual enable needed
|
|
@@ -324,7 +324,7 @@ trajectories/2025-10-16_14-30-45/
|
|
|
324
324
|
### Override Priority
|
|
325
325
|
|
|
326
326
|
1. **CLI flags** (highest)
|
|
327
|
-
2. **Config file** (
|
|
327
|
+
2. **Config file** (`~/.config/droidrun/config.yaml`)
|
|
328
328
|
3. **Defaults** (lowest)
|
|
329
329
|
|
|
330
330
|
### Common Patterns
|
|
@@ -387,7 +387,7 @@ droidrun setup
|
|
|
387
387
|
|
|
388
388
|
# Enable accessibility manually
|
|
389
389
|
adb shell settings put secure enabled_accessibility_services \
|
|
390
|
-
com.droidrun.portal
|
|
390
|
+
com.droidrun.portal/com.droidrun.portal.service.DroidrunAccessibilityService
|
|
391
391
|
```
|
|
392
392
|
</Accordion>
|
|
393
393
|
|
|
@@ -444,7 +444,7 @@ droidrun ping --tcp
|
|
|
444
444
|
| `OPENAI_API_KEY` | OpenAI API key | None |
|
|
445
445
|
| `ANTHROPIC_API_KEY` | Anthropic API key | None |
|
|
446
446
|
| `DEEPSEEK_API_KEY` | DeepSeek API key | None |
|
|
447
|
-
| `DROIDRUN_CONFIG` | Config file path |
|
|
447
|
+
| `DROIDRUN_CONFIG` | Config file path | `~/.config/droidrun/config.yaml` |
|
|
448
448
|
|
|
449
449
|
**Setting variables:**
|
|
450
450
|
|
|
@@ -35,7 +35,7 @@ Droidrun controls devices through a specialized Portal app that bridges your com
|
|
|
35
35
|
|
|
36
36
|
<Step title="Install Portal App">
|
|
37
37
|
```bash
|
|
38
|
-
# Automatic setup (downloads
|
|
38
|
+
# Automatic setup (downloads compatible Portal APK)
|
|
39
39
|
droidrun setup
|
|
40
40
|
|
|
41
41
|
# Or specify device
|
|
@@ -43,7 +43,7 @@ Droidrun controls devices through a specialized Portal app that bridges your com
|
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
This will:
|
|
46
|
-
- Download the
|
|
46
|
+
- Download the compatible Portal APK for your SDK version
|
|
47
47
|
- Install with all permissions granted
|
|
48
48
|
- Enable accessibility service automatically
|
|
49
49
|
</Step>
|
|
@@ -223,7 +223,7 @@ The Portal only communicates locally via ADB. No data is sent to external server
|
|
|
223
223
|
```python
|
|
224
224
|
import asyncio
|
|
225
225
|
from droidrun import DeviceConfig, DroidrunConfig, DroidAgent
|
|
226
|
-
from
|
|
226
|
+
from async_adbutils import adb
|
|
227
227
|
|
|
228
228
|
async def control_device(serial: str, command: str):
|
|
229
229
|
device_config = DeviceConfig(serial=serial)
|
|
@@ -232,7 +232,7 @@ The Portal only communicates locally via ADB. No data is sent to external server
|
|
|
232
232
|
return await agent.run()
|
|
233
233
|
|
|
234
234
|
async def main():
|
|
235
|
-
devices = adb.list()
|
|
235
|
+
devices = await adb.list()
|
|
236
236
|
|
|
237
237
|
tasks = [
|
|
238
238
|
control_device(devices[0].serial, "Open settings"),
|
|
@@ -279,7 +279,7 @@ The Portal only communicates locally via ADB. No data is sent to external server
|
|
|
279
279
|
1. Auto-enable:
|
|
280
280
|
```bash
|
|
281
281
|
adb shell settings put secure enabled_accessibility_services \
|
|
282
|
-
com.droidrun.portal/com.droidrun.portal.DroidrunAccessibilityService
|
|
282
|
+
com.droidrun.portal/com.droidrun.portal.service.DroidrunAccessibilityService
|
|
283
283
|
adb shell settings put secure accessibility_enabled 1
|
|
284
284
|
```
|
|
285
285
|
2. Manual: Settings > Accessibility > Droidrun Portal > Toggle ON
|
|
@@ -298,7 +298,7 @@ The Portal only communicates locally via ADB. No data is sent to external server
|
|
|
298
298
|
```bash
|
|
299
299
|
# Verify
|
|
300
300
|
adb shell settings get secure default_input_method
|
|
301
|
-
# Should show: com.droidrun.portal/.DroidrunKeyboardIME
|
|
301
|
+
# Should show: com.droidrun.portal/.input.DroidrunKeyboardIME
|
|
302
302
|
```
|
|
303
303
|
2. Manual switch: Long press space bar → Select "Droidrun Keyboard"
|
|
304
304
|
3. Focus the element first (tap it), then input text
|
|
@@ -349,9 +349,14 @@ iOS support is currently **experimental**. Functionality is limited compared to
|
|
|
349
349
|
</Step>
|
|
350
350
|
|
|
351
351
|
<Step title="Test Connection">
|
|
352
|
+
Run a simple task to verify connectivity:
|
|
352
353
|
```bash
|
|
353
|
-
droidrun
|
|
354
|
+
droidrun run "take a screenshot" --ios
|
|
354
355
|
```
|
|
356
|
+
|
|
357
|
+
<Note>
|
|
358
|
+
The `droidrun ping` command is Android-only (uses ADB). For iOS, run a simple task with `--ios` to verify the connection.
|
|
359
|
+
</Note>
|
|
355
360
|
</Step>
|
|
356
361
|
</Steps>
|
|
357
362
|
|
|
@@ -411,8 +416,8 @@ Current iOS support has these limitations:
|
|
|
411
416
|
| Feature | Status | Notes |
|
|
412
417
|
|---------|--------|-------|
|
|
413
418
|
| `get_date()` | ❌ | Not available on iOS |
|
|
414
|
-
| `back()` | ❌ |
|
|
415
|
-
| `drag()` | ❌ | Not
|
|
419
|
+
| `back()` | ❌ | No iOS equivalent, silently ignored |
|
|
420
|
+
| `drag()` | ❌ | Not supported, auto-disabled |
|
|
416
421
|
| `get_apps()` | ⚠️ | Use `list_packages()` instead |
|
|
417
422
|
| `input_text()` | ⚠️ | No `index` or `clear` parameters |
|
|
418
423
|
| `tap()`, `swipe()` | ✅ | Fully supported |
|
|
@@ -11,7 +11,7 @@ Welcome to the Droidrun Guides! This section provides step-by-step instructions
|
|
|
11
11
|
### Getting Started
|
|
12
12
|
|
|
13
13
|
**[CLI Reference](./cli)** - Complete command-line interface guide
|
|
14
|
-
- All CLI commands (`run`, `setup`, `devices`, `connect`, `ping`, `macro`)
|
|
14
|
+
- All CLI commands (`run`, `setup`, `devices`, `connect`, `disconnect`, `ping`, `macro`, `doctor`, `tui`)
|
|
15
15
|
- Configuration overrides and flags
|
|
16
16
|
- Environment variables and API keys
|
|
17
17
|
- Common workflows and troubleshooting
|
|
@@ -18,7 +18,7 @@ This guide will help you get Droidrun installed and running quickly, controlling
|
|
|
18
18
|
|
|
19
19
|
Before installing Droidrun, ensure you have:
|
|
20
20
|
|
|
21
|
-
1. **Python 3.11
|
|
21
|
+
1. **Python 3.11-3.13** installed on your system
|
|
22
22
|
2. [Android Debug Bridge (adb)](https://developer.android.com/studio/releases/platform-tools) installed and configured
|
|
23
23
|
3. **Android device** with:
|
|
24
24
|
- [Developer options enabled](https://developer.android.com/studio/debug/dev-options)
|
|
@@ -78,9 +78,7 @@ droidrun ping
|
|
|
78
78
|
|
|
79
79
|
If successful, you'll see:
|
|
80
80
|
```
|
|
81
|
-
|
|
82
|
-
✓ Accessibility service enabled
|
|
83
|
-
✓ Device ready
|
|
81
|
+
Portal is installed and accessible. You're good to go!
|
|
84
82
|
```
|
|
85
83
|
|
|
86
84
|
### Configure Your LLM
|
|
@@ -36,11 +36,11 @@ The tools architecture follows a multi-layer pattern:
|
|
|
36
36
|
2. **Driver Implementations**: Platform-specific drivers
|
|
37
37
|
- `AndroidDriver` (`tools/driver/android.py`): Android devices via ADB + Portal app
|
|
38
38
|
- `IOSDriver` (`tools/driver/ios.py`): iOS devices via HTTP REST API to Portal app
|
|
39
|
-
- `StealthDriver` (`tools/driver/stealth.py`):
|
|
39
|
+
- `StealthDriver` (`tools/driver/stealth.py`): Wraps another driver, adds human-like timing jitter
|
|
40
40
|
- `RecordingDriver` (`tools/driver/recording.py`): Wraps another driver with trajectory recording
|
|
41
41
|
- `CloudDriver` (`tools/driver/cloud.py`): Cloud-hosted device driver
|
|
42
42
|
3. **StateProvider** (`tools/ui/provider.py`): Fetches raw data from a driver, applies filters/formatters, produces `UIState`
|
|
43
|
-
4. **UIState** (`tools/ui/state.py`): Parsed UI elements with element resolution (`get_element()`, `get_element_coords()`, `get_element_info()`)
|
|
43
|
+
4. **UIState** (`tools/ui/state.py`): Parsed UI elements with element resolution (`get_element()`, `get_element_coords()`, `get_element_info()`, `get_clear_point()`, `convert_point()`)
|
|
44
44
|
5. **ToolRegistry** (`agent/tool_registry.py`): Central registry of all agent-callable tools
|
|
45
45
|
6. **ActionContext** (`agent/action_context.py`): Dependency bag passed as `ctx` kwarg to action functions
|
|
46
46
|
7. **ActionResult** (`agent/action_result.py`): Structured return type (`success: bool`, `summary: str`)
|
|
@@ -103,7 +103,7 @@ class StateProvider:
|
|
|
103
103
|
async def get_state(self) -> UIState: ...
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
Base class for state providers. Subclass to support different platforms.
|
|
106
|
+
Base class for state providers. Subclass to support different platforms. Declares a `supported` set for capability checking (e.g. `{"element_index", "convert_point"}`).
|
|
107
107
|
|
|
108
108
|
### AndroidStateProvider
|
|
109
109
|
|
|
@@ -111,7 +111,7 @@ Base class for state providers. Subclass to support different platforms.
|
|
|
111
111
|
class AndroidStateProvider(StateProvider)
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
Fetches state from an Android device via `driver.get_ui_tree()`. Includes retry logic (3 attempts). Applies tree filters and formatters to produce a `UIState` snapshot.
|
|
114
|
+
Fetches state from an Android device via `driver.get_ui_tree()`. Includes retry logic (3 attempts). Applies tree filters and formatters to produce a `UIState` snapshot. Constructor accepts `stealth: bool` to select `StealthUIState` (randomized tap coordinates within element bounds) vs regular `UIState`.
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
@@ -130,6 +130,8 @@ Holds parsed UI elements for a single device state snapshot.
|
|
|
130
130
|
- `get_element(index: int) -> Dict | None` - Recursively find an element by its index
|
|
131
131
|
- `get_element_coords(index: int) -> Tuple[int, int]` - Return the centre (x, y) of an element. Raises `ValueError` when element is missing or has no bounds.
|
|
132
132
|
- `get_element_info(index: int) -> Dict` - Return element metadata (text, className, type, child_texts)
|
|
133
|
+
- `get_clear_point(index: int) -> Tuple[int, int]` - Find a tap point that avoids overlapping elements (falls back to centre)
|
|
134
|
+
- `convert_point(x: int, y: int) -> Tuple[int, int]` - Convert point to absolute pixels if normalized mode is active
|
|
133
135
|
|
|
134
136
|
**Key Attributes:**
|
|
135
137
|
|
|
@@ -138,6 +140,7 @@ Holds parsed UI elements for a single device state snapshot.
|
|
|
138
140
|
- `focused_text` - Text of the currently focused element
|
|
139
141
|
- `phone_state` - Dict with current activity, keyboard visibility, etc.
|
|
140
142
|
- `screen_width` / `screen_height` - Device screen dimensions
|
|
143
|
+
- `use_normalized` - Whether normalized coordinate mode is active
|
|
141
144
|
|
|
142
145
|
---
|
|
143
146
|
|
|
@@ -193,19 +196,17 @@ async def click(index: int, *, ctx: ActionContext) -> ActionResult:
|
|
|
193
196
|
**Available actions:**
|
|
194
197
|
- `click(index)` - Click UI element by index
|
|
195
198
|
- `click_at(x, y)` - Click at screen coordinates
|
|
196
|
-
- `click_area(
|
|
199
|
+
- `click_area(x1, y1, x2, y2)` - Click center of area defined by coordinates
|
|
197
200
|
- `long_press(index)` - Long press UI element by index
|
|
198
201
|
- `long_press_at(x, y)` - Long press at screen coordinates
|
|
199
|
-
- `type(text, index)` - Input text into element
|
|
200
|
-
- `type_secret(secret_id)` - Input a credential secret
|
|
201
|
-
- `swipe(coordinate, coordinate2)` - Swipe gesture
|
|
202
|
+
- `type(text, index, clear=False)` - Input text into element (set `clear=True` to clear field first)
|
|
203
|
+
- `type_secret(secret_id, index)` - Input a credential secret into element by index
|
|
204
|
+
- `swipe(coordinate, coordinate2, duration=1.0)` - Swipe gesture between two coordinate lists
|
|
202
205
|
- `system_button(button)` - Press system buttons (back, home, enter)
|
|
203
|
-
- `open_app(text)` - Open app by name
|
|
204
|
-
- `wait(
|
|
206
|
+
- `open_app(text)` - Open app by name or description
|
|
207
|
+
- `wait(duration=1.0)` - Wait for a duration in seconds
|
|
205
208
|
- `remember(information)` - Store info in agent memory
|
|
206
|
-
- `complete(success,
|
|
207
|
-
- `get_state()` - Get accessibility tree + phone state
|
|
208
|
-
- `take_screenshot()` - Capture device screen
|
|
209
|
+
- `complete(success, message)` - Mark task as finished
|
|
209
210
|
|
|
210
211
|
---
|
|
211
212
|
|
|
@@ -221,9 +222,15 @@ Central registry of all agent-callable tools.
|
|
|
221
222
|
|
|
222
223
|
**Methods:**
|
|
223
224
|
|
|
224
|
-
- `register(name, fn, params, description)` - Register a single tool
|
|
225
|
-
- `register_from_dict(tools_dict)` - Register tools from `{"name": {"parameters": {...}, "description": "...", "function": callable}}` format
|
|
226
|
-
- `disable(tool_names)` - Remove tools by name
|
|
225
|
+
- `register(name, fn, params, description, deps=None)` - Register a single tool with optional capability dependencies
|
|
226
|
+
- `register_from_dict(tools_dict)` - Register tools from `{"name": {"parameters": {...}, "description": "...", "function": callable, "deps": set}}` format
|
|
227
|
+
- `disable(tool_names)` - Remove tools by name (silently ignores unknown names)
|
|
228
|
+
- `disable_unsupported(capabilities)` - Remove tools whose `deps` are not satisfied by the given capabilities set
|
|
229
|
+
- `execute(name, args, ctx, workflow_ctx=None)` - Dispatch action by name, returns `ActionResult`
|
|
230
|
+
- `get_tool_descriptions_xml(exclude=None)` - Build XML `<functions>` block for FastAgent
|
|
231
|
+
- `get_tool_descriptions_text(exclude=None)` - Build text descriptions for executor prompts
|
|
232
|
+
- `get_param_types(exclude=None)` - Build flat `{param_name: type_string}` map for XML coercion
|
|
233
|
+
- `get_signatures(exclude=None)` - Return `{name: {parameters, description}}` dict for prompt building
|
|
227
234
|
|
|
228
235
|
---
|
|
229
236
|
|