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.
Files changed (246) hide show
  1. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/PKG-INFO +7 -1
  2. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/README.md +6 -0
  3. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/configuration.mdx +0 -1
  4. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/events-and-workflows.mdx +21 -60
  5. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/prompts.mdx +6 -2
  6. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/scripter-agent.mdx +17 -14
  7. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/shared-state.mdx +11 -2
  8. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/credentials.mdx +6 -4
  9. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/custom-tools.mdx +4 -3
  10. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/structured-output.mdx +2 -2
  11. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/tracing.mdx +1 -1
  12. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/cli.mdx +6 -6
  13. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/device-setup.mdx +14 -9
  14. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/overview.mdx +1 -1
  15. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/quickstart.mdx +2 -4
  16. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/base-tools.mdx +23 -16
  17. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/configuration.mdx +70 -50
  18. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/droid-agent.mdx +16 -21
  19. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/tools_agent.py +49 -1
  20. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/droid_agent.py +52 -2
  21. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/events.py +18 -1
  22. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/state.py +29 -0
  23. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/manager_agent.py +45 -24
  24. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/main.py +13 -59
  25. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/tools_system.jinja2 +1 -0
  26. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/system.jinja2 +2 -0
  27. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_example.yaml +3 -1
  28. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/config_manager.py +1 -0
  29. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/migrations/__init__.py +1 -1
  30. droidrun-0.5.1.dev2/droidrun/config_manager/migrations/v003_add_auto_setup.py +12 -0
  31. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/client.py +9 -4
  32. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/portal.py +217 -1
  33. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/indexed_formatter.py +14 -1
  34. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/pyproject.toml +1 -1
  35. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/uv.lock +1 -1
  36. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.dockerignore +0 -0
  37. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/black.yml +0 -0
  38. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/bounty.yml +0 -0
  39. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/claude-code-review.yml +0 -0
  40. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/claude.yml +0 -0
  41. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/docker.yml +0 -0
  42. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.github/workflows/publish.yml +0 -0
  43. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.gitignore +0 -0
  44. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/.python-version +0 -0
  45. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/CHANGELOG.md +0 -0
  46. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/CONTRIBUTING.md +0 -0
  47. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/Dockerfile +0 -0
  48. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/LICENSE +0 -0
  49. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/MANIFEST.in +0 -0
  50. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/SKILL.md +0 -0
  51. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/ favicon.svg +0 -0
  52. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/custom.css +0 -0
  53. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/docs.json +51 -51
  54. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/favicon-dark.png +0 -0
  55. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/favicon.png +0 -0
  56. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/logo/dark.png +0 -0
  57. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/logo/light.png +0 -0
  58. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/agent.mdx +0 -0
  59. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/android-tools.mdx +0 -0
  60. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/models.mdx +0 -0
  61. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/concepts/portal-app.mdx +0 -0
  62. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/cli.mdx +0 -0
  63. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/gemini.mdx +0 -0
  64. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/ollama.mdx +0 -0
  65. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/openailike.mdx +0 -0
  66. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/overview.mdx +0 -0
  67. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/guides/telemetry.mdx +0 -0
  68. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/images/portal_apk.png +0 -0
  69. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/overview.mdx +0 -0
  70. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v3/quickstart.mdx +0 -0
  71. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/architecture.mdx +0 -0
  72. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/events-and-workflows.mdx +0 -0
  73. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/prompts.mdx +0 -0
  74. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/scripter-agent.mdx +0 -0
  75. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/concepts/shared-state.mdx +0 -0
  76. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/app-cards.mdx +0 -0
  77. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/credentials.mdx +0 -0
  78. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/custom-tools.mdx +0 -0
  79. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/custom-variables.mdx +0 -0
  80. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/structured-output.mdx +0 -0
  81. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/telemetry.mdx +0 -0
  82. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/features/tracing.mdx +0 -0
  83. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/cli.mdx +0 -0
  84. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/device-setup.mdx +0 -0
  85. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/docker.mdx +0 -0
  86. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/migration-v3-to-v4.mdx +0 -0
  87. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/guides/overview.mdx +0 -0
  88. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/overview.mdx +0 -0
  89. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/quickstart.mdx +0 -0
  90. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/adb-tools.mdx +0 -0
  91. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/base-tools.mdx +0 -0
  92. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/droid-agent.mdx +0 -0
  93. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/ios-tools.mdx +0 -0
  94. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v4/sdk/reference.mdx +0 -0
  95. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/concepts/architecture.mdx +0 -0
  96. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/app-cards.mdx +0 -0
  97. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/custom-variables.mdx +0 -0
  98. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/features/telemetry.mdx +0 -0
  99. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/guides/docker.mdx +0 -0
  100. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/overview.mdx +0 -0
  101. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/adb-tools.mdx +0 -0
  102. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/ios-tools.mdx +0 -0
  103. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/docs/v5/sdk/reference.mdx +0 -0
  104. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/__init__.py +0 -0
  105. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/__main__.py +0 -0
  106. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/__init__.py +0 -0
  107. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/action_context.py +0 -0
  108. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/action_result.py +0 -0
  109. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/__init__.py +0 -0
  110. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/codeact_agent.py +0 -0
  111. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/events.py +0 -0
  112. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/codeact/xml_parser.py +0 -0
  113. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/__init__.py +0 -0
  114. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/constants.py +0 -0
  115. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/common/events.py +0 -0
  116. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/droid/__init__.py +0 -0
  117. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/__init__.py +0 -0
  118. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/events.py +0 -0
  119. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/executor_agent.py +0 -0
  120. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/executor/prompts.py +0 -0
  121. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/__init__.py +0 -0
  122. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/autoglm.py +0 -0
  123. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/external/mai_ui.py +0 -0
  124. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/__init__.py +0 -0
  125. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/events.py +0 -0
  126. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/prompts.py +0 -0
  127. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/manager/stateless_manager_agent.py +18 -18
  128. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/__init__.py +0 -0
  129. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/app_starter_workflow.py +0 -0
  130. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/structured_output_agent.py +0 -0
  131. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/oneflows/text_manipulator.py +0 -0
  132. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/__init__.py +0 -0
  133. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/events.py +0 -0
  134. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/scripter/scripter_agent.py +0 -0
  135. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/tool_registry.py +0 -0
  136. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/trajectory/__init__.py +0 -0
  137. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/trajectory/writer.py +0 -0
  138. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/usage.py +0 -0
  139. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/__init__.py +0 -0
  140. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/actions.py +0 -0
  141. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/chat_utils.py +0 -0
  142. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/code_checker.py +0 -0
  143. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/executer.py +0 -0
  144. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/inference.py +0 -0
  145. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/llm_loader.py +0 -0
  146. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/llm_picker.py +0 -0
  147. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/prompt_resolver.py +0 -0
  148. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/signatures.py +0 -0
  149. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/tracing_setup.py +0 -0
  150. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/agent/utils/trajectory.py +0 -0
  151. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/__init__.py +0 -0
  152. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/app_card_provider.py +0 -0
  153. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/__init__.py +0 -0
  154. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/composite_provider.py +0 -0
  155. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/local_provider.py +0 -0
  156. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/app_cards/providers/server_provider.py +0 -0
  157. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/__init__.py +0 -0
  158. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/doctor.py +0 -0
  159. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/event_handler.py +0 -0
  160. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/logs.py +0 -0
  161. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/__init__.py +0 -0
  162. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/app.py +0 -0
  163. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/commands.py +0 -0
  164. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/advanced_tab.tcss +0 -0
  165. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/app.tcss +0 -0
  166. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/models_tab.tcss +0 -0
  167. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/css/settings_screen.tcss +0 -0
  168. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/__init__.py +0 -0
  169. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/advanced_tab.py +0 -0
  170. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/agent_tab.py +0 -0
  171. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/data.py +0 -0
  172. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/models_tab.py +0 -0
  173. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/section.py +0 -0
  174. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/settings/settings_screen.py +0 -0
  175. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/__init__.py +0 -0
  176. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/command_dropdown.py +0 -0
  177. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/device_picker.py +0 -0
  178. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/input_bar.py +0 -0
  179. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/log_view.py +0 -0
  180. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/cli/tui/widgets/status_bar.py +0 -0
  181. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/README.md +0 -0
  182. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/app_cards.json +0 -0
  183. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/app_cards/gmail.md +0 -0
  184. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/credentials_example.yaml +0 -0
  185. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/system.jinja2 +0 -0
  186. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/tools_user.jinja2 +0 -0
  187. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/codeact/user.jinja2 +0 -0
  188. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/executor/rev1.jinja2 +0 -0
  189. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/executor/system.jinja2 +0 -0
  190. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/rev1.jinja2 +0 -0
  191. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/stateless.jinja2 +0 -0
  192. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/manager/trained.jinja2 +0 -0
  193. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config/prompts/scripter/system.jinja2 +0 -0
  194. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/__init__.py +0 -0
  195. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/env_keys.py +0 -0
  196. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/loader.py +0 -0
  197. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/migrations/v002_add_code_exec.py +0 -0
  198. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/path_resolver.py +0 -0
  199. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/prompt_loader.py +0 -0
  200. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/config_manager/safe_execution.py +0 -0
  201. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/__init__.py +0 -0
  202. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/credential_manager.py +0 -0
  203. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/credential_manager/file_credential_manager.py +0 -0
  204. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/log_handlers.py +0 -0
  205. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/__init__.py +0 -0
  206. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/__main__.py +0 -0
  207. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/cli.py +0 -0
  208. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/macro/replay.py +0 -0
  209. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/__init__.py +0 -0
  210. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/adapter.py +0 -0
  211. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/mcp/config.py +0 -0
  212. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/__init__.py +0 -0
  213. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/events.py +0 -0
  214. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/langfuse_processor.py +0 -0
  215. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/phoenix.py +0 -0
  216. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/telemetry/tracker.py +0 -0
  217. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/__init__.py +0 -0
  218. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/android/__init__.py +0 -0
  219. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/android/portal_client.py +0 -0
  220. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/__init__.py +0 -0
  221. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/android.py +0 -0
  222. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/base.py +0 -0
  223. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/cloud.py +0 -0
  224. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/ios.py +0 -0
  225. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/recording.py +0 -0
  226. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/driver/stealth.py +0 -0
  227. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/__init__.py +0 -0
  228. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/base.py +0 -0
  229. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/concise_filter.py +0 -0
  230. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/filters/detailed_filter.py +0 -0
  231. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/__init__.py +0 -0
  232. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/formatters/base.py +0 -0
  233. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/__init__.py +0 -0
  234. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/coordinate.py +0 -0
  235. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/element_search.py +0 -0
  236. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/helpers/geometry.py +0 -0
  237. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ios/__init__.py +0 -0
  238. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/__init__.py +0 -0
  239. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/ios_provider.py +0 -0
  240. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/provider.py +0 -0
  241. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/state.py +0 -0
  242. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/droidrun/tools/ui/stealth_state.py +0 -0
  243. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/gen-docs-sdk-ref.sh +0 -0
  244. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/setup.py +0 -0
  245. {droidrun-0.5.0.dev7 → droidrun-0.5.1.dev2}/static/droidrun-dark.png +0 -0
  246. {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.0.dev7
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
  [![Docs](https://img.shields.io/badge/Docs-📕-0D9373?style=for-the-badge)](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
  [![Docs](https://img.shields.io/badge/Docs-📕-0D9373?style=for-the-badge)](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
@@ -189,7 +189,6 @@ TelemetryConfig(
189
189
  from droidrun import ToolsConfig
190
190
 
191
191
  ToolsConfig(
192
- allow_drag=True, # Enable drag tool
193
192
  disabled_tools=[], # List of tools to disable (e.g., ["long_press", "wait"])
194
193
  )
195
194
  ```
@@ -75,7 +75,7 @@ class ManagerPlanEvent(Event):
75
75
  plan: str
76
76
  current_subgoal: str
77
77
  thought: str
78
- manager_answer: str = ""
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
- output_planning: str
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
- thoughts: str
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="Action Recording Events">
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
- class MacroEvent(Event): # Base class
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
- - Actions: All action recording events (`TapActionEvent`, `SwipeActionEvent`, etc.)
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
- - Actions: All action recording events
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
- **Action Recording Events** - Emitted when actions are performed (for macros/trajectories)
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: `TapActionEvent`, `SwipeActionEvent`, `InputTextActionEvent`
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
- - `available_secrets` - Credential IDs
86
- - `variables` - Custom variables
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
- enabled: true
140
- allowed_modules:
141
- - requests # API calls, webhooks
142
- - json # JSON parsing
143
- - csv # CSV file operations
144
- - pathlib # File path handling
145
- blocked_modules:
146
- - subprocess # Process spawning
147
- - os # System operations
148
- - sys # System modifications
149
- ```
150
-
151
- **Safe execution** restricts dangerous operations by default. Only modules in `allowed_modules` can be imported.
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
- memory: str = "" # Agent persistent memory
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
- manager_answer: str = "" # Answer-type responses
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
- <type_secret>
109
- <secret_id>MY_PASSWORD</secret_id>
110
- <index>5</index>
111
- </type_secret>
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.memory:
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
- - `memory` - Agent memory dict
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. Specify a dedicated `structured_output` profile:
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 (await structured_agent.run())
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://127.0.0.1:6006)
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 `config.yaml` doesn't exist, Droidrun creates it from `config_example.yaml` automatically.
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 | `config.yaml` |
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 latest Portal APK
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** (`config.yaml`)
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/.DroidrunAccessibilityService
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 | `config.yaml` |
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 latest Portal APK)
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 latest Portal APK
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 adbutils import adb
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 ping --ios
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()` | ❌ | Raises `NotImplementedError` |
415
- | `drag()` | ❌ | Not implemented, returns False |
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+** installed on your system (Python 3.14 is not currently supported)
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
- Portal is running
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`): Stealth mode driver
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(area)` - Click a named screen 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(seconds)` - Wait for a duration
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, reason)` - Mark task as finished
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