droidrun 0.5.1.dev3__tar.gz → 0.5.2__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.1.dev3 → droidrun-0.5.2}/PKG-INFO +2 -8
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/README.md +1 -7
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/__init__.py +0 -4
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/droid_agent.py +73 -273
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/events.py +0 -37
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/state.py +3 -17
- droidrun-0.5.2/droidrun/agent/external/README.md +131 -0
- droidrun-0.5.2/droidrun/agent/external/__init__.py +91 -0
- droidrun-0.5.2/droidrun/agent/fast_agent/__init__.py +3 -0
- droidrun-0.5.2/droidrun/agent/fast_agent/events.py +45 -0
- droidrun-0.5.1.dev3/droidrun/agent/codeact/tools_agent.py → droidrun-0.5.2/droidrun/agent/fast_agent/fast_agent.py +6 -9
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/manager_agent.py +2 -26
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/stateless_manager_agent.py +2 -9
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/tool_registry.py +3 -4
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/__init__.py +0 -7
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/actions.py +5 -16
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/chat_utils.py +1 -34
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/llm_loader.py +3 -7
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/llm_picker.py +2 -2
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/prompt_resolver.py +1 -2
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/signatures.py +1 -1
- droidrun-0.5.2/droidrun/cli/device_commands.py +278 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/doctor.py +24 -6
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/event_handler.py +1 -56
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/main.py +27 -12
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/data.py +4 -9
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/rev1.jinja2 +0 -67
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/stateless.jinja2 +0 -11
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/system.jinja2 +0 -63
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/trained.jinja2 +0 -4
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_example.yaml +14 -147
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/__init__.py +0 -12
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/config_manager.py +8 -53
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/__init__.py +1 -1
- droidrun-0.5.2/droidrun/config_manager/migrations/v004_remove_deprecated_agents.py +41 -0
- droidrun-0.5.2/droidrun/config_manager/migrations/v005_remove_external_agents.py +15 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/cli.py +3 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/replay.py +16 -3
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/langfuse_processor.py +4 -8
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/android/portal_client.py +131 -19
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/android.py +17 -3
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/base.py +6 -2
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/cloud.py +33 -14
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/ios.py +18 -18
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/recording.py +7 -3
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/stealth.py +4 -0
- droidrun-0.5.2/droidrun/tools/ui/provider.py +226 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/pyproject.toml +1 -1
- droidrun-0.5.2/static/droidrun-dark.png +0 -0
- droidrun-0.5.2/static/droidrun.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/uv.lock +1 -1
- droidrun-0.5.1.dev3/droidrun/agent/codeact/__init__.py +0 -4
- droidrun-0.5.1.dev3/droidrun/agent/codeact/codeact_agent.py +0 -522
- droidrun-0.5.1.dev3/droidrun/agent/codeact/events.py +0 -84
- droidrun-0.5.1.dev3/droidrun/agent/external/__init__.py +0 -41
- droidrun-0.5.1.dev3/droidrun/agent/external/autoglm.py +0 -1119
- droidrun-0.5.1.dev3/droidrun/agent/external/mai_ui.py +0 -819
- droidrun-0.5.1.dev3/droidrun/agent/oneflows/text_manipulator.py +0 -215
- droidrun-0.5.1.dev3/droidrun/agent/scripter/__init__.py +0 -7
- droidrun-0.5.1.dev3/droidrun/agent/scripter/events.py +0 -46
- droidrun-0.5.1.dev3/droidrun/agent/scripter/scripter_agent.py +0 -331
- droidrun-0.5.1.dev3/droidrun/agent/utils/code_checker.py +0 -36
- droidrun-0.5.1.dev3/droidrun/agent/utils/executer.py +0 -231
- droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/system.jinja2 +0 -124
- droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/user.jinja2 +0 -5
- droidrun-0.5.1.dev3/droidrun/config/prompts/scripter/system.jinja2 +0 -86
- droidrun-0.5.1.dev3/droidrun/config_manager/safe_execution.py +0 -282
- droidrun-0.5.1.dev3/droidrun/tools/ui/provider.py +0 -122
- droidrun-0.5.1.dev3/static/droidrun-dark.png +0 -0
- droidrun-0.5.1.dev3/static/droidrun.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.dockerignore +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/black.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/bounty.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/claude-code-review.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/claude.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/docker.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/publish.yml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.gitignore +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.python-version +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/CHANGELOG.md +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/CONTRIBUTING.md +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/Dockerfile +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/LICENSE +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/MANIFEST.in +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/SKILL.md +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/ favicon.svg +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/custom.css +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/docs.json +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/favicon-dark.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/favicon.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/logo/dark.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/logo/light.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/agent.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/android-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/models.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/portal-app.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/cli.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/gemini.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/ollama.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/openailike.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/telemetry.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/images/portal_apk.png +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/quickstart.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/architecture.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/events-and-workflows.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/prompts.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/scripter-agent.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/shared-state.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/app-cards.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/credentials.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/custom-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/custom-variables.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/structured-output.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/telemetry.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/tracing.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/cli.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/device-setup.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/docker.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/migration-v3-to-v4.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/quickstart.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/adb-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/base-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/configuration.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/droid-agent.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/ios-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/reference.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/architecture.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/events-and-workflows.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/prompts.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/scripter-agent.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/shared-state.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/app-cards.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/credentials.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/custom-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/custom-variables.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/structured-output.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/telemetry.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/tracing.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/cli.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/device-setup.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/docker.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/overview.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/quickstart.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/adb-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/base-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/configuration.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/droid-agent.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/ios-tools.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/reference.mdx +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/__main__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/action_context.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/action_result.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/constants.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/events.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/events.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/executor_agent.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/prompts.py +0 -0
- {droidrun-0.5.1.dev3/droidrun/agent/codeact → droidrun-0.5.2/droidrun/agent/fast_agent}/xml_parser.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/events.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/prompts.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/app_starter_workflow.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/structured_output_agent.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/trajectory/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/trajectory/writer.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/usage.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/inference.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/tracing_setup.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/trajectory.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/app_card_provider.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/composite_provider.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/local_provider.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/server_provider.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/logs.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/app.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/commands.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/advanced_tab.tcss +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/app.tcss +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/models_tab.tcss +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/settings_screen.tcss +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/advanced_tab.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/agent_tab.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/models_tab.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/section.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/settings_screen.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/command_dropdown.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/device_picker.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/input_bar.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/log_view.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/status_bar.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/README.md +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/app_cards.json +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/gmail.md +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/credentials_example.yaml +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/executor/rev1.jinja2 +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/executor/system.jinja2 +0 -0
- /droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/tools_system.jinja2 → /droidrun-0.5.2/droidrun/config/prompts/fast_agent/system.jinja2 +0 -0
- /droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/tools_user.jinja2 → /droidrun-0.5.2/droidrun/config/prompts/fast_agent/user.jinja2 +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/env_keys.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/loader.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/v002_add_code_exec.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/v003_add_auto_setup.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/path_resolver.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/prompt_loader.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/credential_manager.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/file_credential_manager.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/log_handlers.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/__main__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/adapter.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/client.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/config.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/portal.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/events.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/phoenix.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/tracker.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/android/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/base.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/concise_filter.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/detailed_filter.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/base.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/indexed_formatter.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/coordinate.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/element_search.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/geometry.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ios/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/__init__.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/ios_provider.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/state.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/stealth_state.py +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/gen-docs-sdk-ref.sh +0 -0
- {droidrun-0.5.1.dev3 → droidrun-0.5.2}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: droidrun
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2
|
|
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,7 +71,6 @@ 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
75
|
<div align="center">
|
|
77
76
|
|
|
@@ -107,13 +106,8 @@ Description-Content-Type: text/markdown
|
|
|
107
106
|
|
|
108
107
|
|
|
109
108
|
|
|
110
|
-
|
|
109
|
+
Mobilerun is a cloud solution powered by Droidrun 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)
|
|
111
110
|
|
|
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
|
-
|
|
116
|
-
## Why Droidrun?
|
|
117
111
|
|
|
118
112
|
- 🤖 Control Android and iOS devices with natural language commands
|
|
119
113
|
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
|
@@ -4,7 +4,6 @@
|
|
|
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
8
|
<div align="center">
|
|
10
9
|
|
|
@@ -40,13 +39,8 @@
|
|
|
40
39
|
|
|
41
40
|
|
|
42
41
|
|
|
43
|
-
|
|
42
|
+
Mobilerun is a cloud solution powered by Droidrun 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)
|
|
44
43
|
|
|
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
|
-
|
|
49
|
-
## Why Droidrun?
|
|
50
44
|
|
|
51
45
|
- 🤖 Control Android and iOS devices with natural language commands
|
|
52
46
|
- 🔀 Supports multiple LLM providers (OpenAI, Anthropic, Gemini, Ollama, DeepSeek)
|
|
@@ -36,8 +36,6 @@ from droidrun.config_manager import (
|
|
|
36
36
|
LLMProfile,
|
|
37
37
|
LoggingConfig,
|
|
38
38
|
ManagerConfig,
|
|
39
|
-
SafeExecutionConfig,
|
|
40
|
-
ScripterConfig,
|
|
41
39
|
TelemetryConfig,
|
|
42
40
|
ToolsConfig,
|
|
43
41
|
TracingConfig,
|
|
@@ -67,7 +65,6 @@ __all__ = [
|
|
|
67
65
|
"FastAgentConfig",
|
|
68
66
|
"ManagerConfig",
|
|
69
67
|
"ExecutorConfig",
|
|
70
|
-
"ScripterConfig",
|
|
71
68
|
"AppCardConfig",
|
|
72
69
|
"DeviceConfig",
|
|
73
70
|
"LoggingConfig",
|
|
@@ -75,6 +72,5 @@ __all__ = [
|
|
|
75
72
|
"TelemetryConfig",
|
|
76
73
|
"ToolsConfig",
|
|
77
74
|
"CredentialsConfig",
|
|
78
|
-
"SafeExecutionConfig",
|
|
79
75
|
"LLMProfile",
|
|
80
76
|
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""
|
|
2
2
|
DroidAgent - A wrapper class that coordinates the planning and execution of tasks
|
|
3
|
-
to achieve a user's goal on
|
|
3
|
+
to achieve a user's goal on a mobile device.
|
|
4
4
|
|
|
5
5
|
Architecture:
|
|
6
|
-
- When reasoning=False: Uses
|
|
6
|
+
- When reasoning=False: Uses FastAgent directly
|
|
7
7
|
- When reasoning=True: Uses Manager (planning) + Executor (action) workflows
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -21,8 +21,8 @@ from workflows.events import Event
|
|
|
21
21
|
from workflows.handler import WorkflowHandler
|
|
22
22
|
|
|
23
23
|
from droidrun.agent.action_context import ActionContext
|
|
24
|
-
from droidrun.agent.
|
|
25
|
-
from droidrun.agent.
|
|
24
|
+
from droidrun.agent.fast_agent import FastAgent
|
|
25
|
+
from droidrun.agent.fast_agent.events import FastAgentOutputEvent
|
|
26
26
|
from droidrun.agent.common.events import RecordUIStateEvent, ScreenshotEvent
|
|
27
27
|
from droidrun.agent.droid.events import (
|
|
28
28
|
ExecutorInputEvent,
|
|
@@ -34,18 +34,12 @@ from droidrun.agent.droid.events import (
|
|
|
34
34
|
ManagerInputEvent,
|
|
35
35
|
ManagerPlanEvent,
|
|
36
36
|
ResultEvent,
|
|
37
|
-
ScripterExecutorInputEvent,
|
|
38
|
-
ScripterExecutorResultEvent,
|
|
39
|
-
TextManipulatorInputEvent,
|
|
40
|
-
TextManipulatorResultEvent,
|
|
41
37
|
)
|
|
42
38
|
from droidrun.agent.droid.state import DroidAgentState, QueuedUserMessage
|
|
43
39
|
from droidrun.agent.executor import ExecutorAgent
|
|
44
40
|
from droidrun.agent.external import load_agent
|
|
45
41
|
from droidrun.agent.manager import ManagerAgent, StatelessManagerAgent
|
|
46
42
|
from droidrun.agent.oneflows.structured_output_agent import StructuredOutputAgent
|
|
47
|
-
from droidrun.agent.oneflows.text_manipulator import run_text_manipulation_agent
|
|
48
|
-
from droidrun.agent.scripter import ScripterAgent
|
|
49
43
|
from droidrun.agent.tool_registry import ToolRegistry
|
|
50
44
|
from droidrun.agent.trajectory import TrajectoryWriter
|
|
51
45
|
from droidrun.agent.utils.actions import complete, open_app, remember
|
|
@@ -74,7 +68,6 @@ from droidrun.config_manager.config_manager import (
|
|
|
74
68
|
ToolsConfig,
|
|
75
69
|
TracingConfig,
|
|
76
70
|
)
|
|
77
|
-
from droidrun.config_manager.safe_execution import SafeExecutionConfig
|
|
78
71
|
from droidrun.credential_manager import CredentialManager, FileCredentialManager
|
|
79
72
|
from droidrun.log_handlers import CLILogHandler, configure_logging
|
|
80
73
|
from droidrun.mcp.adapter import mcp_to_droidrun_tools
|
|
@@ -109,7 +102,7 @@ class DroidAgent(Workflow):
|
|
|
109
102
|
A wrapper class that coordinates between agents to achieve a user's goal.
|
|
110
103
|
|
|
111
104
|
Reasoning modes:
|
|
112
|
-
- reasoning=False: Uses
|
|
105
|
+
- reasoning=False: Uses FastAgent directly for immediate execution
|
|
113
106
|
- reasoning=True: Uses ManagerAgent (planning) + ExecutorAgent (actions)
|
|
114
107
|
"""
|
|
115
108
|
|
|
@@ -189,7 +182,6 @@ class DroidAgent(Workflow):
|
|
|
189
182
|
telemetry=config.telemetry if config else TelemetryConfig(),
|
|
190
183
|
llm_profiles=config.llm_profiles if config else {},
|
|
191
184
|
credentials=config.credentials if config else CredentialsConfig(),
|
|
192
|
-
safe_execution=config.safe_execution if config else SafeExecutionConfig(),
|
|
193
185
|
external_agents=config.external_agents if config else {},
|
|
194
186
|
mcp=config.mcp if config else MCPConfig(),
|
|
195
187
|
)
|
|
@@ -250,9 +242,7 @@ class DroidAgent(Workflow):
|
|
|
250
242
|
self.manager_llm = llms.get("manager")
|
|
251
243
|
self.executor_llm = llms.get("executor")
|
|
252
244
|
self.fast_agent_llm = llms.get("fast_agent")
|
|
253
|
-
self.text_manipulator_llm = llms.get("text_manipulator")
|
|
254
245
|
self.app_opener_llm = llms.get("app_opener")
|
|
255
|
-
self.scripter_llm = llms.get("scripter", self.fast_agent_llm)
|
|
256
246
|
self.structured_output_llm = llms.get(
|
|
257
247
|
"structured_output", self.fast_agent_llm
|
|
258
248
|
)
|
|
@@ -260,21 +250,20 @@ class DroidAgent(Workflow):
|
|
|
260
250
|
self.manager_llm = llms
|
|
261
251
|
self.executor_llm = llms
|
|
262
252
|
self.fast_agent_llm = llms
|
|
263
|
-
self.text_manipulator_llm = llms
|
|
264
253
|
self.app_opener_llm = llms
|
|
265
|
-
self.scripter_llm = llms
|
|
266
254
|
self.structured_output_llm = llms
|
|
267
255
|
else:
|
|
268
256
|
logger.debug(f"🔄 Using external agent: {self.config.agent.name}")
|
|
269
257
|
self.manager_llm = None
|
|
270
258
|
self.executor_llm = None
|
|
271
259
|
self.fast_agent_llm = None
|
|
272
|
-
self.text_manipulator_llm = None
|
|
273
260
|
self.app_opener_llm = None
|
|
274
|
-
self.scripter_llm = None
|
|
275
261
|
self.structured_output_llm = None
|
|
276
262
|
|
|
277
|
-
if
|
|
263
|
+
if (
|
|
264
|
+
not self._using_external_agent
|
|
265
|
+
and self.config.logging.save_trajectory != "none"
|
|
266
|
+
):
|
|
278
267
|
self.trajectory = Trajectory(
|
|
279
268
|
goal=self.shared_state.instruction,
|
|
280
269
|
base_path=self.config.logging.trajectory_path,
|
|
@@ -338,11 +327,6 @@ class DroidAgent(Workflow):
|
|
|
338
327
|
if self.fast_agent_llm
|
|
339
328
|
else "None"
|
|
340
329
|
),
|
|
341
|
-
"text_manipulator": (
|
|
342
|
-
self.text_manipulator_llm.class_name()
|
|
343
|
-
if self.text_manipulator_llm
|
|
344
|
-
else "None"
|
|
345
|
-
),
|
|
346
330
|
"app_opener": (
|
|
347
331
|
self.app_opener_llm.class_name()
|
|
348
332
|
if self.app_opener_llm
|
|
@@ -390,6 +374,53 @@ class DroidAgent(Workflow):
|
|
|
390
374
|
if self.trajectory_writer:
|
|
391
375
|
await self.trajectory_writer.start()
|
|
392
376
|
|
|
377
|
+
# ── 0. External agent — early exit ────────────────────────────
|
|
378
|
+
if self._using_external_agent:
|
|
379
|
+
agent_name = self.config.agent.name
|
|
380
|
+
|
|
381
|
+
# Load the agent module
|
|
382
|
+
agent_module = load_agent(agent_name)
|
|
383
|
+
if not agent_module:
|
|
384
|
+
from droidrun.agent.external import list_agents
|
|
385
|
+
|
|
386
|
+
available = list_agents()
|
|
387
|
+
if available:
|
|
388
|
+
agents_str = ", ".join(available)
|
|
389
|
+
raise ValueError(
|
|
390
|
+
f"Failed to load external agent '{agent_name}'.\n"
|
|
391
|
+
f"Available agents: {agents_str}"
|
|
392
|
+
)
|
|
393
|
+
raise ValueError(
|
|
394
|
+
f"External agent '{agent_name}' not found.\n"
|
|
395
|
+
"No external agents are currently installed.\n"
|
|
396
|
+
"Run: droidrun run --help to see available agents."
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
# Resolve config — missing section is fine, agent may use DEFAULT_CONFIG or env vars
|
|
400
|
+
agent_config = self.config.external_agents.get(agent_name) or {}
|
|
401
|
+
final_config = {**agent_module["config"], **agent_config}
|
|
402
|
+
|
|
403
|
+
# Resolve device serial and get raw AdbDevice
|
|
404
|
+
device_serial = self.resolved_device_config.serial
|
|
405
|
+
if device_serial is None:
|
|
406
|
+
devices = await adb.list()
|
|
407
|
+
if not devices:
|
|
408
|
+
raise ValueError("No connected Android devices found.")
|
|
409
|
+
device_serial = devices[0].serial
|
|
410
|
+
|
|
411
|
+
adb_device = await adb.device(serial=device_serial)
|
|
412
|
+
|
|
413
|
+
logger.info(f"🤖 Using external agent: {agent_name}")
|
|
414
|
+
|
|
415
|
+
result = await agent_module["run"](
|
|
416
|
+
device=adb_device,
|
|
417
|
+
instruction=self.shared_state.instruction,
|
|
418
|
+
config=final_config,
|
|
419
|
+
max_steps=self.config.agent.max_steps,
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
return FinalizeEvent(success=result["success"], reason=result["reason"])
|
|
423
|
+
|
|
393
424
|
# ── 1. Create driver ──────────────────────────────────────────
|
|
394
425
|
if self.config.agent.reasoning:
|
|
395
426
|
vision_enabled = self.config.agent.manager.vision
|
|
@@ -549,33 +580,6 @@ class DroidAgent(Workflow):
|
|
|
549
580
|
# ── 6. Fetch device date once ─────────────────────────────────
|
|
550
581
|
self.shared_state.device_date = await driver.get_date()
|
|
551
582
|
|
|
552
|
-
# ── 7. External agent mode ────────────────────────────────────
|
|
553
|
-
if self._using_external_agent:
|
|
554
|
-
agent_name = self.config.agent.name
|
|
555
|
-
agent_module = load_agent(agent_name)
|
|
556
|
-
if not agent_module:
|
|
557
|
-
raise ValueError(f"Failed to load external agent: {agent_name}")
|
|
558
|
-
|
|
559
|
-
agent_config = self.config.external_agents.get(agent_name)
|
|
560
|
-
if not agent_config:
|
|
561
|
-
raise ValueError(
|
|
562
|
-
f"No config found for agent '{agent_name}' in external_agents section"
|
|
563
|
-
)
|
|
564
|
-
|
|
565
|
-
final_config = {**agent_module["config"], **agent_config}
|
|
566
|
-
|
|
567
|
-
logger.info(f"🤖 Using external agent: {agent_name}")
|
|
568
|
-
|
|
569
|
-
result = await agent_module["run"](
|
|
570
|
-
driver=self.driver,
|
|
571
|
-
action_ctx=self.action_ctx,
|
|
572
|
-
instruction=self.shared_state.instruction,
|
|
573
|
-
config=final_config,
|
|
574
|
-
max_steps=self.config.agent.max_steps,
|
|
575
|
-
)
|
|
576
|
-
|
|
577
|
-
return FinalizeEvent(success=result["success"], reason=result["reason"])
|
|
578
|
-
|
|
579
583
|
if self.config.logging.save_trajectory != "none":
|
|
580
584
|
self.trajectory_writer.write(self.trajectory, stage="init")
|
|
581
585
|
|
|
@@ -606,49 +610,32 @@ class DroidAgent(Workflow):
|
|
|
606
610
|
return queued
|
|
607
611
|
|
|
608
612
|
# ========================================================================
|
|
609
|
-
# execute_task — FastAgent
|
|
613
|
+
# execute_task — FastAgent
|
|
610
614
|
# ========================================================================
|
|
611
615
|
|
|
612
616
|
@step
|
|
613
617
|
async def execute_task(
|
|
614
618
|
self, ctx: Context, ev: FastAgentExecuteEvent
|
|
615
619
|
) -> FastAgentResultEvent:
|
|
616
|
-
"""Execute a single task using
|
|
620
|
+
"""Execute a single task using FastAgent."""
|
|
617
621
|
|
|
618
622
|
logger.debug(f"🔧 Executing task: {ev.instruction}")
|
|
619
623
|
|
|
620
624
|
try:
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
tracing_config=self.config.tracing,
|
|
636
|
-
)
|
|
637
|
-
else:
|
|
638
|
-
agent = FastAgent(
|
|
639
|
-
llm=self.fast_agent_llm,
|
|
640
|
-
agent_config=self.config.agent,
|
|
641
|
-
registry=self.registry,
|
|
642
|
-
action_ctx=self.action_ctx,
|
|
643
|
-
state_provider=self.state_provider,
|
|
644
|
-
save_trajectory=self.config.logging.save_trajectory,
|
|
645
|
-
debug=self.config.logging.debug,
|
|
646
|
-
shared_state=self.shared_state,
|
|
647
|
-
output_model=self.output_model,
|
|
648
|
-
prompt_resolver=self.prompt_resolver,
|
|
649
|
-
timeout=self.timeout,
|
|
650
|
-
tracing_config=self.config.tracing,
|
|
651
|
-
)
|
|
625
|
+
agent = FastAgent(
|
|
626
|
+
llm=self.fast_agent_llm,
|
|
627
|
+
agent_config=self.config.agent,
|
|
628
|
+
registry=self.registry,
|
|
629
|
+
action_ctx=self.action_ctx,
|
|
630
|
+
state_provider=self.state_provider,
|
|
631
|
+
save_trajectory=self.config.logging.save_trajectory,
|
|
632
|
+
debug=self.config.logging.debug,
|
|
633
|
+
shared_state=self.shared_state,
|
|
634
|
+
output_model=self.output_model,
|
|
635
|
+
prompt_resolver=self.prompt_resolver,
|
|
636
|
+
timeout=self.timeout,
|
|
637
|
+
tracing_config=self.config.tracing,
|
|
638
|
+
)
|
|
652
639
|
|
|
653
640
|
handler = agent.run(
|
|
654
641
|
input=ev.instruction,
|
|
@@ -658,7 +645,7 @@ class DroidAgent(Workflow):
|
|
|
658
645
|
async for nested_ev in handler.stream_events():
|
|
659
646
|
self.handle_stream_event(nested_ev, ctx)
|
|
660
647
|
|
|
661
|
-
if isinstance(nested_ev,
|
|
648
|
+
if isinstance(nested_ev, FastAgentOutputEvent):
|
|
662
649
|
if self.config.logging.save_trajectory != "none":
|
|
663
650
|
self.trajectory_writer.write(
|
|
664
651
|
self.trajectory,
|
|
@@ -764,9 +751,7 @@ class DroidAgent(Workflow):
|
|
|
764
751
|
self, ctx: Context, ev: ManagerPlanEvent
|
|
765
752
|
) -> (
|
|
766
753
|
ExecutorInputEvent
|
|
767
|
-
| ScripterExecutorInputEvent
|
|
768
754
|
| FinalizeEvent
|
|
769
|
-
| TextManipulatorInputEvent
|
|
770
755
|
| ManagerInputEvent
|
|
771
756
|
):
|
|
772
757
|
"""Process Manager output and decide next step."""
|
|
@@ -783,131 +768,9 @@ class DroidAgent(Workflow):
|
|
|
783
768
|
self.shared_state.progress_summary = f"Answer: {ev.answer}"
|
|
784
769
|
return FinalizeEvent(success=success, reason=ev.answer)
|
|
785
770
|
|
|
786
|
-
# Check for <script> tag
|
|
787
|
-
if "<script>" in ev.current_subgoal:
|
|
788
|
-
start_idx = ev.plan.find("<script>")
|
|
789
|
-
end_idx = ev.plan.find("</script>")
|
|
790
|
-
|
|
791
|
-
if start_idx != -1 and end_idx != -1 and end_idx > start_idx:
|
|
792
|
-
task = ev.plan[start_idx + len("<script>") : end_idx].strip()
|
|
793
|
-
logger.debug(f"🐍 Routing to ScripterAgent: {task[:80]}...")
|
|
794
|
-
event = ScripterExecutorInputEvent(task=task)
|
|
795
|
-
ctx.write_event_to_stream(event)
|
|
796
|
-
return event
|
|
797
|
-
else:
|
|
798
|
-
logger.warning(
|
|
799
|
-
"⚠️ Found <script> in subgoal but not properly closed in plan, treating as regular subgoal"
|
|
800
|
-
)
|
|
801
|
-
if "TEXT_TASK" in ev.current_subgoal:
|
|
802
|
-
if self.config.agent.fast_agent.codeact:
|
|
803
|
-
return TextManipulatorInputEvent(
|
|
804
|
-
task=ev.current_subgoal.replace("TEXT_TASK:", "")
|
|
805
|
-
.replace("TEXT_TASK", "")
|
|
806
|
-
.strip()
|
|
807
|
-
)
|
|
808
|
-
else:
|
|
809
|
-
logger.debug(
|
|
810
|
-
"⚠️ TEXT_TASK in tools mode — routing to Executor instead of TextManipulator"
|
|
811
|
-
)
|
|
812
|
-
subgoal = (
|
|
813
|
-
ev.current_subgoal.replace("TEXT_TASK:", "")
|
|
814
|
-
.replace("TEXT_TASK", "")
|
|
815
|
-
.strip()
|
|
816
|
-
)
|
|
817
|
-
return ExecutorInputEvent(current_subgoal=subgoal)
|
|
818
|
-
|
|
819
771
|
logger.debug(f"▶️ Proceeding to Executor with subgoal: {ev.current_subgoal}")
|
|
820
772
|
return ExecutorInputEvent(current_subgoal=ev.current_subgoal)
|
|
821
773
|
|
|
822
|
-
@step
|
|
823
|
-
async def run_text_manipulator(
|
|
824
|
-
self, ctx: Context, ev: TextManipulatorInputEvent
|
|
825
|
-
) -> TextManipulatorResultEvent:
|
|
826
|
-
logger.debug(f"🔍 Running TextManipulatorAgent for task: {ev.task}")
|
|
827
|
-
|
|
828
|
-
if not self.shared_state.focused_text:
|
|
829
|
-
logger.warning("⚠️ No focused text available, using empty string")
|
|
830
|
-
current_text = ""
|
|
831
|
-
else:
|
|
832
|
-
current_text = self.shared_state.focused_text
|
|
833
|
-
|
|
834
|
-
try:
|
|
835
|
-
text_to_type, code_ran = await run_text_manipulation_agent(
|
|
836
|
-
instruction=self.shared_state.instruction,
|
|
837
|
-
current_subgoal=ev.task,
|
|
838
|
-
current_text=current_text,
|
|
839
|
-
overall_plan=self.shared_state.plan,
|
|
840
|
-
llm=self.text_manipulator_llm,
|
|
841
|
-
stream=self.config.agent.streaming,
|
|
842
|
-
)
|
|
843
|
-
|
|
844
|
-
return TextManipulatorResultEvent(
|
|
845
|
-
task=ev.task, text_to_type=text_to_type, code_ran=code_ran
|
|
846
|
-
)
|
|
847
|
-
|
|
848
|
-
except Exception as e:
|
|
849
|
-
logger.error(f"❌ TextManipulator agent failed: {e}")
|
|
850
|
-
if self.config.logging.debug:
|
|
851
|
-
logger.error(traceback.format_exc())
|
|
852
|
-
|
|
853
|
-
return TextManipulatorResultEvent(
|
|
854
|
-
task=ev.task, text_to_type="", code_ran=""
|
|
855
|
-
)
|
|
856
|
-
|
|
857
|
-
@step
|
|
858
|
-
async def handle_text_manipulator_result(
|
|
859
|
-
self, ctx: Context, ev: TextManipulatorResultEvent
|
|
860
|
-
) -> ManagerInputEvent:
|
|
861
|
-
if not ev.text_to_type or not ev.text_to_type.strip():
|
|
862
|
-
logger.warning("⚠️ TextManipulator returned empty text, treating as no-op")
|
|
863
|
-
self.shared_state.last_summary = "Text manipulation returned empty result"
|
|
864
|
-
self.shared_state.action_outcomes.append(False)
|
|
865
|
-
else:
|
|
866
|
-
try:
|
|
867
|
-
success = await self.action_ctx.driver.input_text(
|
|
868
|
-
ev.text_to_type, clear=True
|
|
869
|
-
)
|
|
870
|
-
|
|
871
|
-
if not success:
|
|
872
|
-
logger.warning("⚠️ Text input may have failed")
|
|
873
|
-
self.shared_state.last_summary = (
|
|
874
|
-
"Text manipulation attempted but may have failed"
|
|
875
|
-
)
|
|
876
|
-
self.shared_state.action_outcomes.append(False)
|
|
877
|
-
else:
|
|
878
|
-
logger.debug(
|
|
879
|
-
f"✅ Text manipulator successfully typed {len(ev.text_to_type)} characters"
|
|
880
|
-
)
|
|
881
|
-
self.shared_state.last_summary = f"Text manipulation successful: typed {len(ev.text_to_type)} characters"
|
|
882
|
-
self.shared_state.action_outcomes.append(True)
|
|
883
|
-
except Exception as e:
|
|
884
|
-
logger.error(f"❌ Error during text input: {e}")
|
|
885
|
-
self.shared_state.last_summary = f"Text manipulation error: {str(e)}"
|
|
886
|
-
self.shared_state.action_outcomes.append(False)
|
|
887
|
-
|
|
888
|
-
text_manipulation_record = {
|
|
889
|
-
"task": ev.task,
|
|
890
|
-
"code_ran": ev.code_ran,
|
|
891
|
-
"text_length": len(ev.text_to_type) if ev.text_to_type else 0,
|
|
892
|
-
"success": (
|
|
893
|
-
self.shared_state.action_outcomes[-1]
|
|
894
|
-
if self.shared_state.action_outcomes
|
|
895
|
-
else False
|
|
896
|
-
),
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
self.shared_state.text_manipulation_history.append(text_manipulation_record)
|
|
900
|
-
self.shared_state.last_text_manipulation_success = text_manipulation_record[
|
|
901
|
-
"success"
|
|
902
|
-
]
|
|
903
|
-
|
|
904
|
-
if self.config.logging.save_trajectory != "none":
|
|
905
|
-
self.trajectory_writer.write(
|
|
906
|
-
self.trajectory, stage=f"step_{self.shared_state.step_number}"
|
|
907
|
-
)
|
|
908
|
-
|
|
909
|
-
return ManagerInputEvent()
|
|
910
|
-
|
|
911
774
|
@step
|
|
912
775
|
async def run_executor(
|
|
913
776
|
self, ctx: Context, ev: ExecutorInputEvent
|
|
@@ -962,69 +825,6 @@ class DroidAgent(Workflow):
|
|
|
962
825
|
|
|
963
826
|
return ManagerInputEvent()
|
|
964
827
|
|
|
965
|
-
# ========================================================================
|
|
966
|
-
# Script Executor Workflow Steps
|
|
967
|
-
# ========================================================================
|
|
968
|
-
|
|
969
|
-
@step
|
|
970
|
-
async def run_scripter(
|
|
971
|
-
self, ctx: Context, ev: ScripterExecutorInputEvent
|
|
972
|
-
) -> ScripterExecutorResultEvent:
|
|
973
|
-
"""Instantiate and run ScripterAgent for off-device operations."""
|
|
974
|
-
logger.debug(f"🐍 Starting ScripterAgent for task: {ev.task[:2000]}...")
|
|
975
|
-
|
|
976
|
-
scripter_agent = ScripterAgent(
|
|
977
|
-
llm=self.scripter_llm,
|
|
978
|
-
agent_config=self.config.agent,
|
|
979
|
-
shared_state=self.shared_state,
|
|
980
|
-
task=ev.task,
|
|
981
|
-
safe_execution_config=self.config.safe_execution,
|
|
982
|
-
timeout=self.timeout,
|
|
983
|
-
)
|
|
984
|
-
|
|
985
|
-
handler = scripter_agent.run()
|
|
986
|
-
|
|
987
|
-
async for nested_ev in handler.stream_events():
|
|
988
|
-
self.handle_stream_event(nested_ev, ctx)
|
|
989
|
-
|
|
990
|
-
result = await handler
|
|
991
|
-
|
|
992
|
-
script_record = {
|
|
993
|
-
"task": ev.task,
|
|
994
|
-
"message": result["message"],
|
|
995
|
-
"success": result["success"],
|
|
996
|
-
"code_executions": result.get("code_executions", 0),
|
|
997
|
-
}
|
|
998
|
-
self.shared_state.scripter_history.append(script_record)
|
|
999
|
-
self.shared_state.last_scripter_message = result["message"]
|
|
1000
|
-
self.shared_state.last_scripter_success = result["success"]
|
|
1001
|
-
|
|
1002
|
-
return ScripterExecutorResultEvent(
|
|
1003
|
-
task=ev.task,
|
|
1004
|
-
message=result["message"],
|
|
1005
|
-
success=result["success"],
|
|
1006
|
-
code_executions=result.get("code_executions", 0),
|
|
1007
|
-
)
|
|
1008
|
-
|
|
1009
|
-
@step
|
|
1010
|
-
async def handle_scripter_result(
|
|
1011
|
-
self, ctx: Context, ev: ScripterExecutorResultEvent
|
|
1012
|
-
) -> ManagerInputEvent:
|
|
1013
|
-
"""Process ScripterAgent result and loop back to Manager."""
|
|
1014
|
-
if ev.success:
|
|
1015
|
-
logger.debug(
|
|
1016
|
-
f"✅ Script completed successfully in {ev.code_executions} steps"
|
|
1017
|
-
)
|
|
1018
|
-
else:
|
|
1019
|
-
logger.warning(f"⚠️ Script failed or reached max steps: {ev.message}")
|
|
1020
|
-
|
|
1021
|
-
if self.config.logging.save_trajectory != "none":
|
|
1022
|
-
self.trajectory_writer.write(
|
|
1023
|
-
self.trajectory, stage=f"step_{self.shared_state.step_number}"
|
|
1024
|
-
)
|
|
1025
|
-
|
|
1026
|
-
return ManagerInputEvent()
|
|
1027
|
-
|
|
1028
828
|
# ========================================================================
|
|
1029
829
|
# Finalize
|
|
1030
830
|
# ========================================================================
|
|
@@ -62,43 +62,6 @@ class ExecutorResultEvent(Event):
|
|
|
62
62
|
summary: str
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
# ============================================================================
|
|
66
|
-
# Script executor coordination events
|
|
67
|
-
# ============================================================================
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class ScripterExecutorInputEvent(Event):
|
|
71
|
-
"""Trigger ScripterAgent workflow for off-device operations"""
|
|
72
|
-
|
|
73
|
-
task: str
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
class ScripterExecutorResultEvent(Event):
|
|
77
|
-
"""Scripter finished."""
|
|
78
|
-
|
|
79
|
-
task: str
|
|
80
|
-
message: str
|
|
81
|
-
success: bool
|
|
82
|
-
code_executions: int
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# ============================================================================
|
|
86
|
-
# TEXT MANIPULATOR WORKFLOW EVENTS
|
|
87
|
-
# ============================================================================
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
class TextManipulatorInputEvent(Event):
|
|
91
|
-
"""Trigger TextManipulatorAgent workflow for text manipulation"""
|
|
92
|
-
|
|
93
|
-
task: str
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
class TextManipulatorResultEvent(Event):
|
|
97
|
-
task: str
|
|
98
|
-
text_to_type: str
|
|
99
|
-
code_ran: str
|
|
100
|
-
|
|
101
|
-
|
|
102
65
|
# ============================================================================
|
|
103
66
|
# EXTERNAL USER MESSAGE EVENTS
|
|
104
67
|
# ============================================================================
|
|
@@ -85,10 +85,10 @@ class DroidAgentState(BaseModel):
|
|
|
85
85
|
manager_memory: str = "" # Manager's planning notes (append-only string)
|
|
86
86
|
fast_memory: List[str] = Field(
|
|
87
87
|
default_factory=list
|
|
88
|
-
) # FastAgent
|
|
88
|
+
) # FastAgent remember() items
|
|
89
89
|
|
|
90
90
|
# ========================================================================
|
|
91
|
-
# Completion State (set by complete() tool, checked by FastAgent
|
|
91
|
+
# Completion State (set by complete() tool, checked by FastAgent)
|
|
92
92
|
# ========================================================================
|
|
93
93
|
finished: bool = False
|
|
94
94
|
success: Optional[bool] = None
|
|
@@ -104,20 +104,6 @@ class DroidAgentState(BaseModel):
|
|
|
104
104
|
error_flag_plan: bool = False
|
|
105
105
|
err_to_manager_thresh: int = 2
|
|
106
106
|
|
|
107
|
-
# ========================================================================
|
|
108
|
-
# Script Execution Tracking
|
|
109
|
-
# ========================================================================
|
|
110
|
-
scripter_history: List[Dict] = Field(default_factory=list)
|
|
111
|
-
last_scripter_message: str = ""
|
|
112
|
-
last_scripter_success: bool = True
|
|
113
|
-
|
|
114
|
-
# ========================================================================
|
|
115
|
-
# Text Manipulation Tracking
|
|
116
|
-
# ========================================================================
|
|
117
|
-
has_text_to_modify: bool = False
|
|
118
|
-
text_manipulation_history: List[Dict] = Field(default_factory=list)
|
|
119
|
-
last_text_manipulation_success: bool = False
|
|
120
|
-
|
|
121
107
|
# ========================================================================
|
|
122
108
|
# External User Messages (mid-run injection queue)
|
|
123
109
|
# ========================================================================
|
|
@@ -135,7 +121,7 @@ class DroidAgentState(BaseModel):
|
|
|
135
121
|
# ========================================================================
|
|
136
122
|
|
|
137
123
|
async def remember(self, information: str) -> str:
|
|
138
|
-
"""Store information in fast_memory for FastAgent
|
|
124
|
+
"""Store information in fast_memory for FastAgent context."""
|
|
139
125
|
if (
|
|
140
126
|
not information
|
|
141
127
|
or not isinstance(information, str)
|