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.
Files changed (256) hide show
  1. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/PKG-INFO +2 -8
  2. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/README.md +1 -7
  3. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/__init__.py +0 -4
  4. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/droid_agent.py +73 -273
  5. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/events.py +0 -37
  6. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/state.py +3 -17
  7. droidrun-0.5.2/droidrun/agent/external/README.md +131 -0
  8. droidrun-0.5.2/droidrun/agent/external/__init__.py +91 -0
  9. droidrun-0.5.2/droidrun/agent/fast_agent/__init__.py +3 -0
  10. droidrun-0.5.2/droidrun/agent/fast_agent/events.py +45 -0
  11. droidrun-0.5.1.dev3/droidrun/agent/codeact/tools_agent.py → droidrun-0.5.2/droidrun/agent/fast_agent/fast_agent.py +6 -9
  12. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/manager_agent.py +2 -26
  13. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/stateless_manager_agent.py +2 -9
  14. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/tool_registry.py +3 -4
  15. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/__init__.py +0 -7
  16. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/actions.py +5 -16
  17. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/chat_utils.py +1 -34
  18. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/llm_loader.py +3 -7
  19. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/llm_picker.py +2 -2
  20. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/prompt_resolver.py +1 -2
  21. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/signatures.py +1 -1
  22. droidrun-0.5.2/droidrun/cli/device_commands.py +278 -0
  23. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/doctor.py +24 -6
  24. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/event_handler.py +1 -56
  25. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/main.py +27 -12
  26. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/data.py +4 -9
  27. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/rev1.jinja2 +0 -67
  28. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/stateless.jinja2 +0 -11
  29. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/system.jinja2 +0 -63
  30. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/manager/trained.jinja2 +0 -4
  31. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_example.yaml +14 -147
  32. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/__init__.py +0 -12
  33. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/config_manager.py +8 -53
  34. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/__init__.py +1 -1
  35. droidrun-0.5.2/droidrun/config_manager/migrations/v004_remove_deprecated_agents.py +41 -0
  36. droidrun-0.5.2/droidrun/config_manager/migrations/v005_remove_external_agents.py +15 -0
  37. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/cli.py +3 -0
  38. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/replay.py +16 -3
  39. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/langfuse_processor.py +4 -8
  40. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/android/portal_client.py +131 -19
  41. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/android.py +17 -3
  42. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/base.py +6 -2
  43. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/cloud.py +33 -14
  44. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/ios.py +18 -18
  45. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/recording.py +7 -3
  46. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/stealth.py +4 -0
  47. droidrun-0.5.2/droidrun/tools/ui/provider.py +226 -0
  48. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/pyproject.toml +1 -1
  49. droidrun-0.5.2/static/droidrun-dark.png +0 -0
  50. droidrun-0.5.2/static/droidrun.png +0 -0
  51. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/uv.lock +1 -1
  52. droidrun-0.5.1.dev3/droidrun/agent/codeact/__init__.py +0 -4
  53. droidrun-0.5.1.dev3/droidrun/agent/codeact/codeact_agent.py +0 -522
  54. droidrun-0.5.1.dev3/droidrun/agent/codeact/events.py +0 -84
  55. droidrun-0.5.1.dev3/droidrun/agent/external/__init__.py +0 -41
  56. droidrun-0.5.1.dev3/droidrun/agent/external/autoglm.py +0 -1119
  57. droidrun-0.5.1.dev3/droidrun/agent/external/mai_ui.py +0 -819
  58. droidrun-0.5.1.dev3/droidrun/agent/oneflows/text_manipulator.py +0 -215
  59. droidrun-0.5.1.dev3/droidrun/agent/scripter/__init__.py +0 -7
  60. droidrun-0.5.1.dev3/droidrun/agent/scripter/events.py +0 -46
  61. droidrun-0.5.1.dev3/droidrun/agent/scripter/scripter_agent.py +0 -331
  62. droidrun-0.5.1.dev3/droidrun/agent/utils/code_checker.py +0 -36
  63. droidrun-0.5.1.dev3/droidrun/agent/utils/executer.py +0 -231
  64. droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/system.jinja2 +0 -124
  65. droidrun-0.5.1.dev3/droidrun/config/prompts/codeact/user.jinja2 +0 -5
  66. droidrun-0.5.1.dev3/droidrun/config/prompts/scripter/system.jinja2 +0 -86
  67. droidrun-0.5.1.dev3/droidrun/config_manager/safe_execution.py +0 -282
  68. droidrun-0.5.1.dev3/droidrun/tools/ui/provider.py +0 -122
  69. droidrun-0.5.1.dev3/static/droidrun-dark.png +0 -0
  70. droidrun-0.5.1.dev3/static/droidrun.png +0 -0
  71. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.dockerignore +0 -0
  72. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/black.yml +0 -0
  73. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/bounty.yml +0 -0
  74. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/claude-code-review.yml +0 -0
  75. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/claude.yml +0 -0
  76. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/docker.yml +0 -0
  77. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.github/workflows/publish.yml +0 -0
  78. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.gitignore +0 -0
  79. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/.python-version +0 -0
  80. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/CHANGELOG.md +0 -0
  81. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/CONTRIBUTING.md +0 -0
  82. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/Dockerfile +0 -0
  83. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/LICENSE +0 -0
  84. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/MANIFEST.in +0 -0
  85. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/SKILL.md +0 -0
  86. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/ favicon.svg +0 -0
  87. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/custom.css +0 -0
  88. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/docs.json +0 -0
  89. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/favicon-dark.png +0 -0
  90. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/favicon.png +0 -0
  91. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/logo/dark.png +0 -0
  92. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/logo/light.png +0 -0
  93. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/agent.mdx +0 -0
  94. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/android-tools.mdx +0 -0
  95. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/models.mdx +0 -0
  96. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/concepts/portal-app.mdx +0 -0
  97. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/cli.mdx +0 -0
  98. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/gemini.mdx +0 -0
  99. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/ollama.mdx +0 -0
  100. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/openailike.mdx +0 -0
  101. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/overview.mdx +0 -0
  102. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/guides/telemetry.mdx +0 -0
  103. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/images/portal_apk.png +0 -0
  104. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/overview.mdx +0 -0
  105. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v3/quickstart.mdx +0 -0
  106. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/architecture.mdx +0 -0
  107. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/events-and-workflows.mdx +0 -0
  108. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/prompts.mdx +0 -0
  109. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/scripter-agent.mdx +0 -0
  110. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/concepts/shared-state.mdx +0 -0
  111. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/app-cards.mdx +0 -0
  112. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/credentials.mdx +0 -0
  113. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/custom-tools.mdx +0 -0
  114. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/custom-variables.mdx +0 -0
  115. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/structured-output.mdx +0 -0
  116. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/telemetry.mdx +0 -0
  117. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/features/tracing.mdx +0 -0
  118. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/cli.mdx +0 -0
  119. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/device-setup.mdx +0 -0
  120. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/docker.mdx +0 -0
  121. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/migration-v3-to-v4.mdx +0 -0
  122. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/guides/overview.mdx +0 -0
  123. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/overview.mdx +0 -0
  124. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/quickstart.mdx +0 -0
  125. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/adb-tools.mdx +0 -0
  126. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/base-tools.mdx +0 -0
  127. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/configuration.mdx +0 -0
  128. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/droid-agent.mdx +0 -0
  129. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/ios-tools.mdx +0 -0
  130. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v4/sdk/reference.mdx +0 -0
  131. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/architecture.mdx +0 -0
  132. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/events-and-workflows.mdx +0 -0
  133. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/prompts.mdx +0 -0
  134. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/scripter-agent.mdx +0 -0
  135. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/concepts/shared-state.mdx +0 -0
  136. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/app-cards.mdx +0 -0
  137. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/credentials.mdx +0 -0
  138. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/custom-tools.mdx +0 -0
  139. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/custom-variables.mdx +0 -0
  140. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/structured-output.mdx +0 -0
  141. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/telemetry.mdx +0 -0
  142. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/features/tracing.mdx +0 -0
  143. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/cli.mdx +0 -0
  144. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/device-setup.mdx +0 -0
  145. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/docker.mdx +0 -0
  146. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/guides/overview.mdx +0 -0
  147. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/overview.mdx +0 -0
  148. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/quickstart.mdx +0 -0
  149. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/adb-tools.mdx +0 -0
  150. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/base-tools.mdx +0 -0
  151. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/configuration.mdx +0 -0
  152. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/droid-agent.mdx +0 -0
  153. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/ios-tools.mdx +0 -0
  154. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/docs/v5/sdk/reference.mdx +0 -0
  155. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/__main__.py +0 -0
  156. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/__init__.py +0 -0
  157. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/action_context.py +0 -0
  158. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/action_result.py +0 -0
  159. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/__init__.py +0 -0
  160. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/constants.py +0 -0
  161. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/common/events.py +0 -0
  162. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/droid/__init__.py +0 -0
  163. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/__init__.py +0 -0
  164. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/events.py +0 -0
  165. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/executor_agent.py +0 -0
  166. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/executor/prompts.py +0 -0
  167. {droidrun-0.5.1.dev3/droidrun/agent/codeact → droidrun-0.5.2/droidrun/agent/fast_agent}/xml_parser.py +0 -0
  168. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/__init__.py +0 -0
  169. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/events.py +0 -0
  170. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/manager/prompts.py +0 -0
  171. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/__init__.py +0 -0
  172. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/app_starter_workflow.py +0 -0
  173. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/oneflows/structured_output_agent.py +0 -0
  174. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/trajectory/__init__.py +0 -0
  175. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/trajectory/writer.py +0 -0
  176. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/usage.py +0 -0
  177. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/inference.py +0 -0
  178. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/tracing_setup.py +0 -0
  179. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/agent/utils/trajectory.py +0 -0
  180. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/__init__.py +0 -0
  181. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/app_card_provider.py +0 -0
  182. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/__init__.py +0 -0
  183. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/composite_provider.py +0 -0
  184. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/local_provider.py +0 -0
  185. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/app_cards/providers/server_provider.py +0 -0
  186. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/__init__.py +0 -0
  187. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/logs.py +0 -0
  188. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/__init__.py +0 -0
  189. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/app.py +0 -0
  190. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/commands.py +0 -0
  191. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/advanced_tab.tcss +0 -0
  192. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/app.tcss +0 -0
  193. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/models_tab.tcss +0 -0
  194. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/css/settings_screen.tcss +0 -0
  195. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/__init__.py +0 -0
  196. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/advanced_tab.py +0 -0
  197. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/agent_tab.py +0 -0
  198. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/models_tab.py +0 -0
  199. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/section.py +0 -0
  200. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/settings/settings_screen.py +0 -0
  201. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/__init__.py +0 -0
  202. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/command_dropdown.py +0 -0
  203. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/device_picker.py +0 -0
  204. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/input_bar.py +0 -0
  205. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/log_view.py +0 -0
  206. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/cli/tui/widgets/status_bar.py +0 -0
  207. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/README.md +0 -0
  208. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/app_cards.json +0 -0
  209. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/app_cards/gmail.md +0 -0
  210. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/credentials_example.yaml +0 -0
  211. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/executor/rev1.jinja2 +0 -0
  212. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config/prompts/executor/system.jinja2 +0 -0
  213. /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
  214. /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
  215. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/env_keys.py +0 -0
  216. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/loader.py +0 -0
  217. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/v002_add_code_exec.py +0 -0
  218. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/migrations/v003_add_auto_setup.py +0 -0
  219. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/path_resolver.py +0 -0
  220. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/config_manager/prompt_loader.py +0 -0
  221. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/__init__.py +0 -0
  222. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/credential_manager.py +0 -0
  223. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/credential_manager/file_credential_manager.py +0 -0
  224. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/log_handlers.py +0 -0
  225. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/__init__.py +0 -0
  226. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/macro/__main__.py +0 -0
  227. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/__init__.py +0 -0
  228. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/adapter.py +0 -0
  229. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/client.py +0 -0
  230. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/mcp/config.py +0 -0
  231. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/portal.py +0 -0
  232. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/__init__.py +0 -0
  233. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/events.py +0 -0
  234. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/phoenix.py +0 -0
  235. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/telemetry/tracker.py +0 -0
  236. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/__init__.py +0 -0
  237. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/android/__init__.py +0 -0
  238. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/driver/__init__.py +0 -0
  239. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/__init__.py +0 -0
  240. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/base.py +0 -0
  241. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/concise_filter.py +0 -0
  242. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/filters/detailed_filter.py +0 -0
  243. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/__init__.py +0 -0
  244. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/base.py +0 -0
  245. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/formatters/indexed_formatter.py +0 -0
  246. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/__init__.py +0 -0
  247. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/coordinate.py +0 -0
  248. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/element_search.py +0 -0
  249. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/helpers/geometry.py +0 -0
  250. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ios/__init__.py +0 -0
  251. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/__init__.py +0 -0
  252. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/ios_provider.py +0 -0
  253. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/state.py +0 -0
  254. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/droidrun/tools/ui/stealth_state.py +0 -0
  255. {droidrun-0.5.1.dev3 → droidrun-0.5.2}/gen-docs-sdk-ref.sh +0 -0
  256. {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.1.dev3
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
- 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
+ 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
- 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
+ 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 an Android device.
3
+ to achieve a user's goal on a mobile device.
4
4
 
5
5
  Architecture:
6
- - When reasoning=False: Uses CodeActAgent directly
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.codeact import CodeActAgent, FastAgent
25
- from droidrun.agent.codeact.events import CodeActOutputEvent, FastAgentOutputEvent
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 CodeActAgent directly for immediate execution
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 self.config.logging.save_trajectory != "none":
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 / CodeActAgent
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 CodeActAgent or FastAgent."""
620
+ """Execute a single task using FastAgent."""
617
621
 
618
622
  logger.debug(f"🔧 Executing task: {ev.instruction}")
619
623
 
620
624
  try:
621
- if self.config.agent.fast_agent.codeact:
622
- agent = CodeActAgent(
623
- llm=self.fast_agent_llm,
624
- agent_config=self.config.agent,
625
- registry=self.registry,
626
- action_ctx=self.action_ctx,
627
- state_provider=self.state_provider,
628
- save_trajectory=self.config.logging.save_trajectory,
629
- debug=self.config.logging.debug,
630
- shared_state=self.shared_state,
631
- safe_execution_config=self.config.safe_execution,
632
- output_model=self.output_model,
633
- prompt_resolver=self.prompt_resolver,
634
- timeout=self.timeout,
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, (CodeActOutputEvent, FastAgentOutputEvent)):
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/CodeAct remember() items
88
+ ) # FastAgent remember() items
89
89
 
90
90
  # ========================================================================
91
- # Completion State (set by complete() tool, checked by FastAgent/CodeAct)
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/CodeAct context."""
124
+ """Store information in fast_memory for FastAgent context."""
139
125
  if (
140
126
  not information
141
127
  or not isinstance(information, str)