droidrun 0.3.5__tar.gz → 0.3.7__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 (98) hide show
  1. {droidrun-0.3.5 → droidrun-0.3.7}/.github/workflows/bounty.yml +2 -2
  2. {droidrun-0.3.5 → droidrun-0.3.7}/PKG-INFO +23 -24
  3. {droidrun-0.3.5 → droidrun-0.3.7}/README.md +1 -1
  4. {droidrun-0.3.5 → droidrun-0.3.7}/docs/docs.json +1 -1
  5. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/cli.mdx +7 -7
  6. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/gemini.mdx +1 -1
  7. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/ollama.mdx +1 -1
  8. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/openailike.mdx +1 -1
  9. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/quickstart.mdx +4 -3
  10. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/sdk/droid-agent.mdx +1 -1
  11. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/codeact/codeact_agent.py +16 -3
  12. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/codeact/events.py +3 -0
  13. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/common/events.py +5 -1
  14. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/droid/droid_agent.py +137 -84
  15. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/planner/events.py +2 -0
  16. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/planner/planner_agent.py +15 -5
  17. droidrun-0.3.7/droidrun/agent/usage.py +213 -0
  18. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/executer.py +1 -1
  19. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/llm_picker.py +91 -54
  20. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/trajectory.py +256 -154
  21. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/cli/logs.py +4 -1
  22. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/cli/main.py +3 -1
  23. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/portal.py +62 -17
  24. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/telemetry/events.py +1 -1
  25. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/tools/adb.py +97 -167
  26. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/tools/tools.py +0 -1
  27. {droidrun-0.3.5 → droidrun-0.3.7}/pyproject.toml +37 -23
  28. {droidrun-0.3.5 → droidrun-0.3.7}/.github/workflows/publish.yml +0 -0
  29. {droidrun-0.3.5 → droidrun-0.3.7}/.gitignore +0 -0
  30. {droidrun-0.3.5 → droidrun-0.3.7}/CHANGELOG.md +0 -0
  31. {droidrun-0.3.5 → droidrun-0.3.7}/CONTRIBUTING.md +0 -0
  32. {droidrun-0.3.5 → droidrun-0.3.7}/LICENSE +0 -0
  33. {droidrun-0.3.5 → droidrun-0.3.7}/MANIFEST.in +0 -0
  34. {droidrun-0.3.5 → droidrun-0.3.7}/docs/.generated-files.txt +0 -0
  35. {droidrun-0.3.5 → droidrun-0.3.7}/docs/favicon.png +0 -0
  36. {droidrun-0.3.5 → droidrun-0.3.7}/docs/logo/dark.svg +0 -0
  37. {droidrun-0.3.5 → droidrun-0.3.7}/docs/logo/light.svg +0 -0
  38. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v1/concepts/agent.mdx +0 -0
  39. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v1/concepts/android-control.mdx +0 -0
  40. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v1/concepts/portal-app.mdx +0 -0
  41. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v1/overview.mdx +0 -0
  42. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v1/quickstart.mdx +0 -0
  43. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/concepts/agent.mdx +0 -0
  44. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/concepts/android-control.mdx +0 -0
  45. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/concepts/planning.mdx +0 -0
  46. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/concepts/portal-app.mdx +0 -0
  47. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/concepts/tracing.mdx +0 -0
  48. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/overview.mdx +0 -0
  49. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v2/quickstart.mdx +0 -0
  50. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/concepts/agent.mdx +0 -0
  51. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/concepts/android-tools.mdx +0 -0
  52. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/concepts/models.mdx +0 -0
  53. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/concepts/portal-app.mdx +0 -0
  54. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/overview.mdx +0 -0
  55. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/guides/telemetry.mdx +0 -0
  56. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/images/portal_apk.png +0 -0
  57. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/overview.mdx +0 -0
  58. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/sdk/adb-tools.mdx +0 -0
  59. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/sdk/base-tools.mdx +0 -0
  60. {droidrun-0.3.5 → droidrun-0.3.7}/docs/v3/sdk/ios-tools.mdx +0 -0
  61. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/__init__.py +0 -0
  62. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/__main__.py +0 -0
  63. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/__init__.py +0 -0
  64. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/codeact/__init__.py +0 -0
  65. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/codeact/prompts.py +0 -0
  66. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/common/default.py +0 -0
  67. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/__init__.py +0 -0
  68. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/agent_persona.py +0 -0
  69. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/context_injection_manager.py +0 -0
  70. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/episodic_memory.py +0 -0
  71. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/personas/__init__.py +0 -0
  72. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/personas/app_starter.py +0 -0
  73. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/personas/big_agent.py +0 -0
  74. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/personas/default.py +0 -0
  75. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/personas/ui_expert.py +0 -0
  76. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/reflection.py +0 -0
  77. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/context/task_manager.py +0 -0
  78. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/droid/__init__.py +0 -0
  79. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/droid/events.py +0 -0
  80. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/oneflows/reflector.py +0 -0
  81. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/planner/__init__.py +0 -0
  82. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/planner/prompts.py +0 -0
  83. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/__init__.py +0 -0
  84. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/async_utils.py +0 -0
  85. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/agent/utils/chat_utils.py +0 -0
  86. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/cli/__init__.py +0 -0
  87. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/macro/__init__.py +0 -0
  88. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/macro/__main__.py +0 -0
  89. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/macro/cli.py +0 -0
  90. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/macro/replay.py +0 -0
  91. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/telemetry/__init__.py +0 -0
  92. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/telemetry/tracker.py +0 -0
  93. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/tools/__init__.py +0 -0
  94. {droidrun-0.3.5 → droidrun-0.3.7}/droidrun/tools/ios.py +0 -0
  95. {droidrun-0.3.5 → droidrun-0.3.7}/gen-docs-sdk-ref.sh +0 -0
  96. {droidrun-0.3.5 → droidrun-0.3.7}/setup.py +0 -0
  97. {droidrun-0.3.5 → droidrun-0.3.7}/static/droidrun-dark.png +0 -0
  98. {droidrun-0.3.5 → droidrun-0.3.7}/static/droidrun.png +0 -0
@@ -64,7 +64,7 @@ jobs:
64
64
  eligible) OPT_NAME="📝 Eligible" ;;
65
65
  bounty-official) OPT_NAME="💰 Bounty" ;;
66
66
  claimed) OPT_NAME="🛠️ In Progress" ;;
67
- *) echo "No matching status for $LABEL"; exit 0 ;;
67
+ *) echo "No matching status for $LABEL"; exit 78 ;;
68
68
  esac
69
69
 
70
70
  # extract from JSON map
@@ -131,4 +131,4 @@ jobs:
131
131
  -f proj="${PROJECT_ID}" \
132
132
  -f item="${ITEM_ID}" \
133
133
  -f field="${STATUS_FIELD_ID}" \
134
- -f opt="${OPTION_ID}"
134
+ -f opt="${OPTION_ID}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: droidrun
3
- Version: 0.3.5
3
+ Version: 0.3.7
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
@@ -26,32 +26,31 @@ Classifier: Topic :: Software Development :: Testing :: Acceptance
26
26
  Classifier: Topic :: System :: Emulators
27
27
  Classifier: Topic :: Utilities
28
28
  Requires-Python: >=3.11
29
- Requires-Dist: adbutils==2.10.0
30
- Requires-Dist: aiofiles>=23.0.0
31
- Requires-Dist: anthropic>=0.7.0
29
+ Requires-Dist: adbutils>=2.10.2
32
30
  Requires-Dist: apkutils==2.0.0
33
- Requires-Dist: arize-phoenix
34
- Requires-Dist: click>=8.1.0
35
- Requires-Dist: llama-index
36
- Requires-Dist: llama-index-callbacks-arize-phoenix
37
- Requires-Dist: llama-index-llms-anthropic
38
- Requires-Dist: llama-index-llms-deepseek
39
- Requires-Dist: llama-index-llms-google-genai
40
- Requires-Dist: llama-index-llms-ollama
41
- Requires-Dist: llama-index-llms-openai
42
- Requires-Dist: llama-index-llms-openai-like
43
- Requires-Dist: openai>=1.0.0
44
- Requires-Dist: pillow>=10.0.0
45
- Requires-Dist: posthog==6.0.2
46
- Requires-Dist: pydantic>=2.0.0
47
- Requires-Dist: python-dotenv>=1.0.0
48
- Requires-Dist: rich>=13.0.0
31
+ Requires-Dist: llama-index>=0.13.6
32
+ Requires-Dist: posthog>=6.7.4
33
+ Requires-Dist: pydantic>=2.11.7
34
+ Requires-Dist: rich>=14.1.0
35
+ Provides-Extra: anthropic
36
+ Requires-Dist: anthropic>=0.67.0; extra == 'anthropic'
37
+ Requires-Dist: llama-index-llms-anthropic>=0.8.6; extra == 'anthropic'
38
+ Provides-Extra: deepseek
39
+ Requires-Dist: llama-index-llms-deepseek>=0.2.1; extra == 'deepseek'
49
40
  Provides-Extra: dev
50
- Requires-Dist: bandit>=1.7.0; extra == 'dev'
41
+ Requires-Dist: bandit>=1.8.6; extra == 'dev'
51
42
  Requires-Dist: black>=23.0.0; extra == 'dev'
52
43
  Requires-Dist: mypy>=1.0.0; extra == 'dev'
53
- Requires-Dist: ruff>=0.1.0; extra == 'dev'
54
- Requires-Dist: safety>=2.0.0; extra == 'dev'
44
+ Requires-Dist: ruff>=0.13.0; extra == 'dev'
45
+ Requires-Dist: safety>=3.2.11; extra == 'dev'
46
+ Provides-Extra: google
47
+ Requires-Dist: llama-index-llms-google-genai>=0.3.1; extra == 'google'
48
+ Provides-Extra: ollama
49
+ Requires-Dist: llama-index-llms-ollama>=0.7.2; extra == 'ollama'
50
+ Provides-Extra: openai
51
+ Requires-Dist: llama-index-llms-openai-like>=0.5.1; extra == 'openai'
52
+ Requires-Dist: llama-index-llms-openai>=0.5.6; extra == 'openai'
53
+ Requires-Dist: openai>=1.107.1; extra == 'openai'
55
54
  Description-Content-Type: text/markdown
56
55
 
57
56
  <picture>
@@ -89,7 +88,7 @@ DroidRun is a powerful framework for controlling Android and iOS devices through
89
88
  ## 📦 Installation
90
89
 
91
90
  ```bash
92
- pip install droidrun
91
+ pip install droidrun[google,anthropic,openai,deepseek,ollama,dev]
93
92
  ```
94
93
 
95
94
  ## 🚀 Quickstart
@@ -33,7 +33,7 @@ DroidRun is a powerful framework for controlling Android and iOS devices through
33
33
  ## 📦 Installation
34
34
 
35
35
  ```bash
36
- pip install droidrun
36
+ pip install droidrun[google,anthropic,openai,deepseek,ollama,dev]
37
37
  ```
38
38
 
39
39
  ## 🚀 Quickstart
@@ -14,7 +14,7 @@
14
14
  "tab": "Framework",
15
15
  "versions": [
16
16
  {
17
- "version": "0.3.3",
17
+ "version": "0.3.6",
18
18
  "groups": [
19
19
  {
20
20
  "group": "Introduction",
@@ -11,9 +11,9 @@ DroidRun lets you control Android devices using natural language and LLM agents.
11
11
  ## Prerequisites
12
12
 
13
13
  <Steps>
14
- <Step title="Install DroidRun and its dependencies.">
14
+ <Step title="Install DroidRun and its dependencies. Choose which ever provider you'd like to use.">
15
15
  ```sh
16
- pip install droidrun
16
+ pip install droidrun[google,anthropic,openai,deepseek,ollama,dev]
17
17
  ```
18
18
  </Step>
19
19
  <Step title="Ensure your Android device is connected and the DroidRun Portal is installed">
@@ -27,11 +27,11 @@ DroidRun lets you control Android devices using natural language and LLM agents.
27
27
  droidrun ping
28
28
  ```
29
29
  </Step>
30
- <Step title="Install the required LlamaIndex LLM integrations for your provider">
31
- ```sh
32
- pip install llama-index-llms-openai llama-index-llms-ollama llama-index-llms-gemini
33
- ```
34
- </Step>
30
+ <Step title="If you want to use a provider thats not included with our extras, install the required LlamaIndex LLM integrations">
31
+ ```sh
32
+ pip install llama-index-llms-openrouter
33
+ ```
34
+ </Step>
35
35
  </Steps>
36
36
  ---
37
37
 
@@ -32,7 +32,7 @@ Make sure you've set up and enabled the Droidrun Portal.
32
32
  ## 2. Install Required Python Packages
33
33
 
34
34
  ```sh
35
- pip install droidrun llama-index-llms-google-genai
35
+ pip install droidrun[google]
36
36
  ```
37
37
 
38
38
  ## 3. Example: Using Droidrun with Gemini LLM
@@ -47,7 +47,7 @@ ollama pull llama4
47
47
  Make sure you have the required Python packages:
48
48
 
49
49
  ```sh
50
- pip install droidrun llama-index-llms-ollama
50
+ pip install droidrun[ollama]
51
51
  ```
52
52
 
53
53
  ## 3. Example: Using Droidrun with Ollama LLM
@@ -36,7 +36,7 @@ Get your API key for the provider you've choosen
36
36
  ## 2. Install the required Python packages:
37
37
 
38
38
  ```sh
39
- pip install droidrun llama-index-llms-openai-like
39
+ pip install droidrun[openai]
40
40
  ```
41
41
 
42
42
  ## 3. Example: Using Droidrun with OpenAI-like LLM
@@ -26,8 +26,9 @@ Before installing DroidRun, ensure you have:
26
26
  - Connected via USB or on the same network (for wireless debugging)
27
27
 
28
28
  ### Install from PyPI
29
+ Choose which ever provider you'd like to use. If you encounter dependency resolution issues use [`uv`](https://docs.astral.sh/uv/getting-started/installation/).
29
30
  ```bash
30
- pip install droidrun
31
+ pip install droidrun[google,anthropic,openai,deepseek,ollama,dev]
31
32
  ```
32
33
 
33
34
  ### Setup the Portal APK
@@ -90,5 +91,5 @@ Now that you've got DroidRun running, you can:
90
91
 
91
92
  - Learn about the [Agent](/v3/concepts/agent)
92
93
  - See supported [LLM providers](/v3/concepts/models)
93
- - Discover [Android interactions](/v3/concepts/android-control)
94
- - Learn about the [Portal App](/v3/concepts/portal-app)
94
+ - Discover [Android interactions](/v3/concepts/android-tools)
95
+ - Learn about the [Portal App](/v3/concepts/portal-app)
@@ -33,7 +33,7 @@ def __init__(
33
33
  reflection: bool = False,
34
34
  enable_tracing: bool = False,
35
35
  debug: bool = False,
36
- save_trajectories: str = "none",
36
+ save_trajectories: str = "none",
37
37
  excluded_tools: List[str] = None,
38
38
  *args,
39
39
  **kwargs
@@ -18,7 +18,8 @@ from droidrun.agent.codeact.events import (
18
18
  TaskThinkingEvent,
19
19
  EpisodicMemoryEvent,
20
20
  )
21
- from droidrun.agent.common.events import ScreenshotEvent
21
+ from droidrun.agent.common.events import ScreenshotEvent, RecordUIStateEvent
22
+ from droidrun.agent.usage import get_usage_from_response
22
23
  from droidrun.agent.utils import chat_utils
23
24
  from droidrun.agent.utils.executer import SimpleCodeExecutor
24
25
  from droidrun.agent.codeact.prompts import (
@@ -182,6 +183,7 @@ class CodeActAgent(Workflow):
182
183
  try:
183
184
  state = self.tools.get_state()
184
185
  await ctx.set("ui_state", state["a11y_tree"])
186
+ ctx.write_event_to_stream(RecordUIStateEvent(ui_state=state["a11y_tree"]))
185
187
  chat_history = await chat_utils.add_ui_text_block(
186
188
  state["a11y_tree"], chat_history
187
189
  )
@@ -202,11 +204,17 @@ class CodeActAgent(Workflow):
202
204
  success=False, reason="LLM response is None. This is a critical error."
203
205
  )
204
206
 
207
+ try:
208
+ usage = get_usage_from_response(self.llm.class_name(), response)
209
+ except Exception as e:
210
+ logger.warning(f"Could not get llm usage from response: {e}")
211
+ usage = None
212
+
205
213
  await self.chat_memory.aput(response.message)
206
214
 
207
215
  code, thoughts = chat_utils.extract_code_and_thought(response.message.content)
208
216
 
209
- event = TaskThinkingEvent(thoughts=thoughts, code=code)
217
+ event = TaskThinkingEvent(thoughts=thoughts, code=code, usage=usage)
210
218
  ctx.write_event_to_stream(event)
211
219
  return event
212
220
 
@@ -255,6 +263,10 @@ class CodeActAgent(Workflow):
255
263
  for screenshot in screenshots[:-1]: # the last screenshot will be captured by next step
256
264
  ctx.write_event_to_stream(ScreenshotEvent(screenshot=screenshot))
257
265
 
266
+ ui_states = result['ui_states']
267
+ for ui_state in ui_states[:-1]:
268
+ ctx.write_event_to_stream(RecordUIStateEvent(ui_state=ui_state['a11y_tree']))
269
+
258
270
  if self.tools.finished == True:
259
271
  logger.debug(" - Task completed.")
260
272
  event = TaskEndEvent(
@@ -311,7 +323,8 @@ class CodeActAgent(Workflow):
311
323
  await ctx.set("chat_memory", self.chat_memory)
312
324
 
313
325
  # Add final state observation to episodic memory
314
- await self._add_final_state_observation(ctx)
326
+ if self.vision:
327
+ await self._add_final_state_observation(ctx)
315
328
 
316
329
  result = {}
317
330
  result.update(
@@ -1,6 +1,8 @@
1
1
  from llama_index.core.llms import ChatMessage
2
2
  from llama_index.core.workflow import Event
3
3
  from typing import Optional
4
+
5
+ from droidrun.agent.usage import UsageResult
4
6
  from ..context.episodic_memory import EpisodicMemory
5
7
 
6
8
  class TaskInputEvent(Event):
@@ -11,6 +13,7 @@ class TaskInputEvent(Event):
11
13
  class TaskThinkingEvent(Event):
12
14
  thoughts: Optional[str] = None
13
15
  code: Optional[str] = None
16
+ usage: Optional[UsageResult] = None
14
17
 
15
18
  class TaskExecutionEvent(Event):
16
19
  code: str
@@ -1,4 +1,5 @@
1
1
  from llama_index.core.workflow import Event
2
+ from typing import Dict, Any
2
3
 
3
4
  class ScreenshotEvent(Event):
4
5
  screenshot: bytes
@@ -44,4 +45,7 @@ class KeyPressActionEvent(MacroEvent):
44
45
  class StartAppEvent(MacroEvent):
45
46
  """"Event for starting an app"""
46
47
  package: str
47
- activity: str = None
48
+ activity: str = None
49
+
50
+ class RecordUIStateEvent(Event):
51
+ ui_state: list[Dict[str, Any]]