minitap-mobile-use 2.1.0__py3-none-any.whl → 2.3.0__py3-none-any.whl

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.

Potentially problematic release.


This version of minitap-mobile-use might be problematic. Click here for more details.

Files changed (36) hide show
  1. minitap/mobile_use/agents/contextor/contextor.py +4 -2
  2. minitap/mobile_use/agents/cortex/cortex.md +72 -26
  3. minitap/mobile_use/agents/cortex/cortex.py +1 -2
  4. minitap/mobile_use/agents/executor/executor.md +6 -4
  5. minitap/mobile_use/agents/executor/executor.py +3 -1
  6. minitap/mobile_use/agents/executor/utils.py +2 -1
  7. minitap/mobile_use/agents/outputter/test_outputter.py +104 -42
  8. minitap/mobile_use/agents/planner/planner.md +1 -1
  9. minitap/mobile_use/agents/planner/planner.py +4 -2
  10. minitap/mobile_use/config.py +16 -1
  11. minitap/mobile_use/controllers/mobile_command_controller.py +4 -4
  12. minitap/mobile_use/main.py +2 -2
  13. minitap/mobile_use/sdk/agent.py +17 -8
  14. minitap/mobile_use/sdk/builders/agent_config_builder.py +2 -2
  15. minitap/mobile_use/sdk/types/exceptions.py +30 -0
  16. minitap/mobile_use/sdk/utils.py +3 -2
  17. minitap/mobile_use/servers/device_hardware_bridge.py +2 -1
  18. minitap/mobile_use/servers/utils.py +6 -9
  19. minitap/mobile_use/services/llm.py +23 -6
  20. minitap/mobile_use/tools/index.py +21 -15
  21. minitap/mobile_use/tools/mobile/clear_text.py +73 -25
  22. minitap/mobile_use/tools/mobile/copy_text_from.py +7 -5
  23. minitap/mobile_use/tools/mobile/{take_screenshot.py → glimpse_screen.py} +15 -11
  24. minitap/mobile_use/tools/mobile/input_text.py +94 -13
  25. minitap/mobile_use/tools/mobile/paste_text.py +34 -8
  26. minitap/mobile_use/tools/mobile/swipe.py +107 -9
  27. minitap/mobile_use/tools/test_utils.py +351 -0
  28. minitap/mobile_use/tools/tool_wrapper.py +5 -0
  29. minitap/mobile_use/tools/utils.py +147 -40
  30. minitap/mobile_use/utils/recorder.py +2 -9
  31. minitap/mobile_use/utils/test_ui_hierarchy.py +178 -0
  32. minitap/mobile_use/utils/ui_hierarchy.py +2 -2
  33. {minitap_mobile_use-2.1.0.dist-info → minitap_mobile_use-2.3.0.dist-info}/METADATA +28 -8
  34. {minitap_mobile_use-2.1.0.dist-info → minitap_mobile_use-2.3.0.dist-info}/RECORD +36 -34
  35. {minitap_mobile_use-2.1.0.dist-info → minitap_mobile_use-2.3.0.dist-info}/WHEEL +0 -0
  36. {minitap_mobile_use-2.1.0.dist-info → minitap_mobile_use-2.3.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,178 @@
1
+ from unittest.mock import patch
2
+
3
+ from minitap.mobile_use.utils.ui_hierarchy import (
4
+ ElementBounds,
5
+ Point,
6
+ find_element_by_resource_id,
7
+ get_bounds_for_element,
8
+ get_element_text,
9
+ is_element_focused,
10
+ text_input_is_empty,
11
+ )
12
+
13
+
14
+ def test_text_input_is_empty():
15
+ assert text_input_is_empty(text=None, hint_text=None)
16
+ assert text_input_is_empty(text="", hint_text=None)
17
+ assert text_input_is_empty(text="", hint_text="")
18
+ assert text_input_is_empty(text="text", hint_text="text")
19
+
20
+ assert not text_input_is_empty(text="text", hint_text=None)
21
+ assert not text_input_is_empty(text="text", hint_text="")
22
+
23
+
24
+ def test_find_element_by_resource_id():
25
+ ui_hierarchy = [
26
+ {"resourceId": "com.example:id/button1", "text": "Button 1", "children": []},
27
+ {
28
+ "resourceId": "com.example:id/container",
29
+ "children": [
30
+ {
31
+ "resourceId": "com.example:id/nested_button",
32
+ "text": "Nested Button",
33
+ "children": [],
34
+ }
35
+ ],
36
+ },
37
+ ]
38
+
39
+ result = find_element_by_resource_id(ui_hierarchy, "com.example:id/button1")
40
+ assert result is not None
41
+ assert result["resourceId"] == "com.example:id/button1"
42
+ assert result["text"] == "Button 1"
43
+
44
+ result = find_element_by_resource_id(ui_hierarchy, "com.example:id/nested_button")
45
+ assert result is not None
46
+ assert result["resourceId"] == "com.example:id/nested_button"
47
+ assert result["text"] == "Nested Button"
48
+
49
+ result = find_element_by_resource_id(ui_hierarchy, "com.example:id/nonexistent")
50
+ assert result is None
51
+
52
+ result = find_element_by_resource_id([], "com.example:id/button1")
53
+ assert result is None
54
+
55
+
56
+ def test_find_element_by_resource_id_rich_hierarchy():
57
+ rich_hierarchy = [
58
+ {"attributes": {"resource-id": "com.example:id/button1"}, "children": []},
59
+ {
60
+ "attributes": {"resource-id": "com.example:id/container"},
61
+ "children": [
62
+ {"attributes": {"resource-id": "com.example:id/nested_button"}, "children": []}
63
+ ],
64
+ },
65
+ ]
66
+
67
+ result = find_element_by_resource_id(
68
+ rich_hierarchy, "com.example:id/button1", is_rich_hierarchy=True
69
+ )
70
+ assert result is not None
71
+ assert result["resource-id"] == "com.example:id/button1"
72
+
73
+ result = find_element_by_resource_id(
74
+ rich_hierarchy, "com.example:id/nested_button", is_rich_hierarchy=True
75
+ )
76
+ assert result is not None
77
+ assert result["resource-id"] == "com.example:id/nested_button"
78
+
79
+ result = find_element_by_resource_id(
80
+ rich_hierarchy, "com.example:id/nonexistent", is_rich_hierarchy=True
81
+ )
82
+ assert result is None
83
+
84
+
85
+ def test_is_element_focused():
86
+ focused_element = {"focused": "true"}
87
+ assert is_element_focused(focused_element)
88
+
89
+ non_focused_element = {"focused": "false"}
90
+ assert not is_element_focused(non_focused_element)
91
+
92
+ no_focused_element = {"text": "some text"}
93
+ assert not is_element_focused(no_focused_element)
94
+
95
+ none_focused_element = {"focused": None}
96
+ assert not is_element_focused(none_focused_element)
97
+
98
+
99
+ def test_get_element_text():
100
+ element = {"text": "Button Text", "hintText": "Hint Text"}
101
+ assert get_element_text(element) == "Button Text"
102
+ assert get_element_text(element, hint_text=False) == "Button Text"
103
+ assert get_element_text(element, hint_text=True) == "Hint Text"
104
+
105
+ element_no_text = {"hintText": "Hint Text"}
106
+ assert get_element_text(element_no_text) is None
107
+ assert get_element_text(element_no_text, hint_text=True) == "Hint Text"
108
+ element_no_hint = {"text": "Button Text"}
109
+ assert get_element_text(element_no_hint) == "Button Text"
110
+ assert get_element_text(element_no_hint, hint_text=True) is None
111
+
112
+ empty_element = {}
113
+ assert get_element_text(empty_element) is None
114
+ assert get_element_text(empty_element, hint_text=True) is None
115
+
116
+
117
+ def test_get_bounds_for_element():
118
+ element_with_bounds = {"bounds": {"x": 10, "y": 20, "width": 100, "height": 50}}
119
+ bounds = get_bounds_for_element(element_with_bounds)
120
+ assert bounds is not None
121
+ assert isinstance(bounds, ElementBounds)
122
+ assert bounds.x == 10
123
+ assert bounds.y == 20
124
+ assert bounds.width == 100
125
+ assert bounds.height == 50
126
+
127
+ element_no_bounds = {"text": "Button"}
128
+ bounds = get_bounds_for_element(element_no_bounds)
129
+ assert bounds is None
130
+
131
+ # Suppress logger output for the invalid bounds test case
132
+ with patch("minitap.mobile_use.utils.ui_hierarchy.logger.error"):
133
+ element_invalid_bounds = {
134
+ "bounds": {
135
+ "x": "invalid", # Should be int
136
+ "y": 20,
137
+ "width": 100,
138
+ "height": 50,
139
+ }
140
+ }
141
+ bounds = get_bounds_for_element(element_invalid_bounds)
142
+ assert bounds is None
143
+
144
+
145
+ def test_element_bounds():
146
+ bounds = ElementBounds(x=10, y=20, width=100, height=50)
147
+
148
+ center = bounds.get_center()
149
+ assert isinstance(center, Point)
150
+ assert center.x == 60
151
+ assert center.y == 45
152
+
153
+ center_point = bounds.get_relative_point(0.5, 0.5)
154
+ assert isinstance(center_point, Point)
155
+ assert center_point.x == 60
156
+ assert center_point.y == 45
157
+
158
+ top_left = bounds.get_relative_point(0.0, 0.0)
159
+ assert top_left.x == 10
160
+ assert top_left.y == 20
161
+
162
+ bottom_right = bounds.get_relative_point(1.0, 1.0)
163
+ assert bottom_right.x == 110
164
+ assert bottom_right.y == 70
165
+ custom_point = bounds.get_relative_point(0.95, 0.95)
166
+ assert custom_point.x == 105
167
+ assert custom_point.y == 67
168
+
169
+
170
+ if __name__ == "__main__":
171
+ test_text_input_is_empty()
172
+ test_find_element_by_resource_id()
173
+ test_find_element_by_resource_id_rich_hierarchy()
174
+ test_is_element_focused()
175
+ test_get_element_text()
176
+ test_get_bounds_for_element()
177
+ test_element_bounds()
178
+ print("All tests passed")
@@ -109,8 +109,8 @@ class ElementBounds(BaseModel):
109
109
  <------>
110
110
  """
111
111
  return Point(
112
- x=int((self.x + self.width) * x_percent),
113
- y=int((self.y + self.height) * y_percent),
112
+ x=int(self.x + self.width * x_percent),
113
+ y=int(self.y + self.height * y_percent),
114
114
  )
115
115
 
116
116
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: minitap-mobile-use
3
- Version: 2.1.0
3
+ Version: 2.3.0
4
4
  Summary: AI-powered multi-agent system that automates real Android and iOS devices through low-level control using LangGraph.
5
5
  Author: Pierre-Louis Favreau, Jean-Pierre Lo, Nicolas Dehandschoewercker
6
6
  License: MIT License
@@ -24,11 +24,11 @@ License: MIT License
24
24
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
25
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
26
  SOFTWARE.
27
- Requires-Dist: langgraph==0.5.0
27
+ Requires-Dist: langgraph>=0.6.6
28
28
  Requires-Dist: adbutils==2.9.3
29
- Requires-Dist: langchain-google-genai==2.1.5
30
- Requires-Dist: langchain==0.3.26
31
- Requires-Dist: langchain-core==0.3.66
29
+ Requires-Dist: langchain-google-genai>=2.1.10
30
+ Requires-Dist: langchain>=0.3.27
31
+ Requires-Dist: langchain-core>=0.3.75
32
32
  Requires-Dist: jinja2==3.1.6
33
33
  Requires-Dist: python-dotenv==1.1.1
34
34
  Requires-Dist: pydantic-settings==2.10.1
@@ -42,6 +42,7 @@ Requires-Dist: fastapi==0.111.0
42
42
  Requires-Dist: uvicorn[standard]==0.30.1
43
43
  Requires-Dist: colorama>=0.4.6
44
44
  Requires-Dist: psutil>=5.9.0
45
+ Requires-Dist: langchain-google-vertexai>=2.0.28
45
46
  Requires-Dist: ruff==0.5.3 ; extra == 'dev'
46
47
  Requires-Dist: pytest==8.4.1 ; extra == 'dev'
47
48
  Requires-Dist: pytest-cov==5.0.0 ; extra == 'dev'
@@ -55,7 +56,7 @@ Description-Content-Type: text/markdown
55
56
 
56
57
  <div align="center">
57
58
 
58
- ![mobile-use in Action](./doc/linkedin-demo-with-text.gif)
59
+ ![mobile-use in Action](./doc/banner-v2.png)
59
60
 
60
61
  </div>
61
62
 
@@ -69,6 +70,10 @@ Description-Content-Type: text/markdown
69
70
  <a href="https://x.com/minitap_ai?t=iRWtI497UhRGLeCKYQekig&s=09"><b>Twitter / X</b></a>
70
71
  </p>
71
72
 
73
+ [![PyPI version](https://img.shields.io/pypi/v/minitap-mobile-use.svg?color=blue)](https://pypi.org/project/minitap-mobile-use/)
74
+ [![Python Version](https://img.shields.io/badge/python-3.12%2B-blue)](https://www.python.org/downloads/)
75
+ [![License](https://img.shields.io/badge/license-MIT-blue)](https://github.com/minitap-ai/mobile-use/blob/main/LICENSE)
76
+
72
77
  </div>
73
78
 
74
79
  Mobile-use is a powerful, open-source AI agent that controls your Android or IOS device using natural language. It understands your commands and interacts with the UI to perform tasks, from sending messages to navigating complex apps.
@@ -78,7 +83,7 @@ Mobile-use is a powerful, open-source AI agent that controls your Android or IOS
78
83
  ## ✨ Features
79
84
 
80
85
  - 🗣️ **Natural Language Control**: Interact with your phone using your native language.
81
- - 📱 **UI-Aware Automation**: Intelligently navigates through app interfaces.
86
+ - 📱 **UI-Aware Automation**: Intelligently navigates through app interfaces (note: currently has limited effectiveness with games as they don't provide accessibility tree data).
82
87
  - 📊 **Data Scraping**: Extract information from any app and structure it into your desired format (e.g., JSON) using a natural language description.
83
88
  - 🔧 **Extensible & Customizable**: Easily configure different LLMs to power the agents that power mobile-use.
84
89
 
@@ -107,11 +112,26 @@ Ready to automate your mobile experience? Follow these steps to get mobile-use u
107
112
 
108
113
  2. **(Optional) Customize LLM Configuration:**
109
114
  To use different models or providers, create your own LLM configuration file.
115
+
110
116
  ```bash
111
117
  cp llm-config.override.template.jsonc llm-config.override.jsonc
112
118
  ```
119
+
113
120
  Then, edit `llm-config.override.jsonc` to fit your needs.
114
121
 
122
+ You can also use local LLMs or any other openai-api compatible providers :
123
+
124
+ 1. Set `OPENAI_BASE_URL` and `OPENAI_API_KEY` in your `.env`
125
+ 2. In your `llm-config.override.jsonc`, set `openai` as the provider for the agent nodes you want, and choose a model supported by your provider.
126
+
127
+ > [!NOTE]
128
+ > If you want to use Google Vertex AI, you must either:
129
+ >
130
+ > - Have credentials configured for your environment (gcloud, workload identity, etc…)
131
+ > - Store the path to a service account JSON file as the GOOGLE_APPLICATION_CREDENTIALS environment variable
132
+ >
133
+ > More information: - [Credential types](https://cloud.google.com/docs/authentication/application-default-credentials#GAC) - [google.auth API reference](https://googleapis.dev/python/google-auth/latest/reference/google.auth.html#module-google.auth)
134
+
115
135
  ### Quick Launch (Docker)
116
136
 
117
137
  > [!NOTE]
@@ -132,7 +152,7 @@ Then run in your terminal:
132
152
 
133
153
  ```bash
134
154
  chmod +x mobile-use.sh
135
- ./mobile-use.sh \
155
+ bash ./mobile-use.sh \
136
156
  "Open Gmail, find first 3 unread emails, and list their sender and subject line" \
137
157
  --output-description "A JSON list of objects, each with 'sender' and 'subject' keys"
138
158
  ```
@@ -1,12 +1,12 @@
1
1
  minitap/mobile_use/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
2
- minitap/mobile_use/agents/contextor/contextor.py,sha256=d7c98771a9173281c1660a2ee965149d4f70ecf7005cf75fa89eb1e9a9f2b660,1673
3
- minitap/mobile_use/agents/cortex/cortex.md,sha256=69358852474f65144486fc60196b17bdc5f99d2891fbb4cae26fd2331260f6ba,5598
4
- minitap/mobile_use/agents/cortex/cortex.py,sha256=232dfe2e2dbbfbc34873875ee32cf5f9d4156f6b9afc9d9d9146addd102be40c,4896
2
+ minitap/mobile_use/agents/contextor/contextor.py,sha256=17f285db6fb21ab414ce7197fff62ca54a94c6359f570e9100a02578f559c714,1704
3
+ minitap/mobile_use/agents/cortex/cortex.md,sha256=6457d09b31e2e36db7a2921a8455e33fa47b6c748a86b6bf0490de95ef5dab08,9878
4
+ minitap/mobile_use/agents/cortex/cortex.py,sha256=de4fa731ab41090529e19e8868cee97c994cecd45e71f140cccf67dc7fefce7d,4858
5
5
  minitap/mobile_use/agents/cortex/types.py,sha256=c33f2277752644d2185d84add03a493adaa530096d046d73366ab9121d99b946,361
6
- minitap/mobile_use/agents/executor/executor.md,sha256=800003af904d346ab0a6b8a205c0332930161a8c997ede584097a40e8f1ac478,2806
7
- minitap/mobile_use/agents/executor/executor.py,sha256=be92742d91296650288c12e83f8065589d8eab7aeaa977a47c34ed25879a9bb6,2771
6
+ minitap/mobile_use/agents/executor/executor.md,sha256=1a813a0b8fcb402c14ce505f3c070aca275599e39d845c4cce151a46f606e879,3124
7
+ minitap/mobile_use/agents/executor/executor.py,sha256=e740b76c9d2dfa832afbca60ac533f691963ae068c64dd97a96b2c58c80c925d,2850
8
8
  minitap/mobile_use/agents/executor/tool_node.py,sha256=2ad729ede393882460ae3d180ac1c0e1ab1688f40b2017220aad1b059f6485c5,3900
9
- minitap/mobile_use/agents/executor/utils.py,sha256=1a387d30047d3be05b5e550433866abe4388222b3f95d1360847870155ef8f12,368
9
+ minitap/mobile_use/agents/executor/utils.py,sha256=74cf2287053cd4fc763835870e5ae029ca36f6cd0ca7d50678ad05d52ab265b7,368
10
10
  minitap/mobile_use/agents/hopper/hopper.md,sha256=2e9333ece8f6b76401ac2cce98ca06a025faa5dba6bacbbc344793ddf42292d0,362
11
11
  minitap/mobile_use/agents/hopper/hopper.py,sha256=1c015cc911f225c9cb26415e0852d5905ded8e715fb928ad2595143870a781e3,1324
12
12
  minitap/mobile_use/agents/orchestrator/human.md,sha256=6559026aa921b7ad7dddcf3dfcd5d9930252edd6484d60ea92ff6ca97ed028fc,229
@@ -15,29 +15,29 @@ minitap/mobile_use/agents/orchestrator/orchestrator.py,sha256=83524eefe8fc1d9639
15
15
  minitap/mobile_use/agents/orchestrator/types.py,sha256=f53dfdc99e8d50888ac1cde5f7f90ba5c87837a8eee8dd8efa31f2640394433c,335
16
16
  minitap/mobile_use/agents/outputter/human.md,sha256=6b9b45c640b163554524b1aec4cd97134c628eeb8557a32e23c8f966d32f642e,771
17
17
  minitap/mobile_use/agents/outputter/outputter.py,sha256=0539cd1bfa307c6e24136488a0481128da17c37f20128e63388b5c4aea5aae50,2750
18
- minitap/mobile_use/agents/outputter/test_outputter.py,sha256=4c52988f8f29159657707a0e11500610f3987cac6390b17edec23f09ddfcc0ff,3334
18
+ minitap/mobile_use/agents/outputter/test_outputter.py,sha256=907b517c486f82a384a364e0bd202c00e8e8082c138461f6eead0e25c2779ba9,5538
19
19
  minitap/mobile_use/agents/planner/human.md,sha256=cb37be2af568918e60238eaa785837178a3ba8f8112de86850d9a62914c18314,222
20
- minitap/mobile_use/agents/planner/planner.md,sha256=41c973c8d34a6c24c81b275f725fc447d58805dcea1900f4285c5980502fc756,3337
21
- minitap/mobile_use/agents/planner/planner.py,sha256=0b8c92857847d390d98efb8d1130762883e46ea4dfc354ea3352e45450913771,2686
20
+ minitap/mobile_use/agents/planner/planner.md,sha256=dc13218df28b38fd2139803c9d013f0ba50899b2ae58545a3b8f3d2fd2aad734,3333
21
+ minitap/mobile_use/agents/planner/planner.py,sha256=cb7fa02cf5ae9e6f95646afc1c41642e5f9e58113dc17d51839f5236a33e67b7,2722
22
22
  minitap/mobile_use/agents/planner/types.py,sha256=da551df70ae4ae574670bd8d79c4da1a82be88c24216034d6841a83d85c0c43c,1392
23
23
  minitap/mobile_use/agents/planner/utils.py,sha256=11731d0382bf88ef77b38aaf75873486f293343cdd048372c57e626c652b4a22,1839
24
24
  minitap/mobile_use/agents/summarizer/summarizer.py,sha256=3e1e92f9259c040487992636786f972dffe0a38d309a8c3758c9ff1aeff2f62c,1070
25
25
  minitap/mobile_use/clients/device_hardware_client.py,sha256=9593380a7a3df32f02aa22717678c25e91367df26b1743abde9e57aec5dc2474,857
26
26
  minitap/mobile_use/clients/ios_client.py,sha256=332bf47ac01bbd5bf6178a59eea7c7a30fed944f30907caea5388178f312d36b,1452
27
27
  minitap/mobile_use/clients/screen_api_client.py,sha256=3615dc65d25c38b4d8dc5512f9adb3bcf69dca7a0298a472a6812f604a275c47,2019
28
- minitap/mobile_use/config.py,sha256=d5bd2bf71f229d57757bf8375b5caf858b4964178507ecb855942bb197646fdd,9399
28
+ minitap/mobile_use/config.py,sha256=9a2435a69c4453275439555d6af721a0c38bf7ca7ef1916598011c54c198c812,9931
29
29
  minitap/mobile_use/constants.py,sha256=3acd9d6ade5bc772e902b3473f3ba12ddd04e7306963ca2bae49d1132d89ba46,95
30
30
  minitap/mobile_use/context.py,sha256=fa4e43fb580db86c2ed707b1464d8363ead57332b40ea5688e0731ad57a40558,1747
31
31
  minitap/mobile_use/controllers/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
32
- minitap/mobile_use/controllers/mobile_command_controller.py,sha256=1ea22f569affae3d82ea74afd37629898cf3d10b3bdf6cb1a7671d1a09f2c000,12206
32
+ minitap/mobile_use/controllers/mobile_command_controller.py,sha256=eb5f31cc6f2a711cbe3908f2561e841abe2214805475f77eeed3bc45731baddc,12217
33
33
  minitap/mobile_use/controllers/platform_specific_commands_controller.py,sha256=8b4fc30108c242da41fd998751dbfd5e6a69e2957a2dbbe5d6fc43d6b55f727e,2705
34
34
  minitap/mobile_use/graph/graph.py,sha256=c7b412e725b096eca8f212d704c3faf91d77eea4131f1fae7af1ee39bc57cdae,4269
35
35
  minitap/mobile_use/graph/state.py,sha256=cfe67d15833efa18b28a86293bc5c713ff8c777778b0552bb6e25fa7070534aa,3371
36
- minitap/mobile_use/main.py,sha256=51a826974071997d7ca1d6913e199c7844633e483db0471f3c294688be028834,3743
36
+ minitap/mobile_use/main.py,sha256=7ac4dc592e3ce72bff602d67ba2f25b9b5e45e07a316e548d7c8e73735abf43d,3725
37
37
  minitap/mobile_use/sdk/__init__.py,sha256=4e5555c0597242b9523827194a2500b9c6d7e5c04b1ccd2056c9b1f4d42a31cd,318
38
- minitap/mobile_use/sdk/agent.py,sha256=43b198cfabdffa28add7f1b77046704ee28da74da92b710dc8bb265c8df16472,20898
38
+ minitap/mobile_use/sdk/agent.py,sha256=1993dfb3b1db7c65ff5d9545090a56c5cd11b2b92092b7cdeba52cb020a4ff44,21384
39
39
  minitap/mobile_use/sdk/builders/__init__.py,sha256=d6c96d39b80900a114698ef205ab5061a541f33bfa99c456d9345e5adb8ff6ff,424
40
- minitap/mobile_use/sdk/builders/agent_config_builder.py,sha256=d963ab932fa78117eef3ea4a2503c34b872f7b865c1a2e25b20e7fa5072e466b,7600
40
+ minitap/mobile_use/sdk/builders/agent_config_builder.py,sha256=c63f452350822daab86d29c44a333909b623fc7ff7bcbf74e5f9104b24630bf5,7582
41
41
  minitap/mobile_use/sdk/builders/index.py,sha256=64336ac3b3dea4673a48e95b8c5ac4196ecd5d2196380377d102593d0a1dc138,442
42
42
  minitap/mobile_use/sdk/builders/task_request_builder.py,sha256=9e6cf7afb68af986d6a81487179bb79d28f63047a068725d92996dbcbe753376,6857
43
43
  minitap/mobile_use/sdk/constants.py,sha256=436ba0700c6cf37ac0c9e3995a5f5a0d54ca87af72686eb9667a2c6a96e30f68,292
@@ -47,36 +47,37 @@ minitap/mobile_use/sdk/examples/simple_photo_organizer.py,sha256=8ad1cebb5281e36
47
47
  minitap/mobile_use/sdk/examples/smart_notification_assistant.py,sha256=1d00658dc30c7bce5ef68369f982cd2d1932f53e2e2da6ded70cea13dc669c72,6362
48
48
  minitap/mobile_use/sdk/types/__init__.py,sha256=5dd148d83bf6261ac8ac60c994e2496b5bf535591d0835807d5fe394fd85a954,1014
49
49
  minitap/mobile_use/sdk/types/agent.py,sha256=390d5c642b3480f4a2203ddd28ec115c785f2576bec81e82e4db3c129399c020,2260
50
- minitap/mobile_use/sdk/types/exceptions.py,sha256=56ac3f749730740951448b1b0f200be21331dc0800916a87587b21e7850120a5,2288
50
+ minitap/mobile_use/sdk/types/exceptions.py,sha256=bc710e6c1a3c8886c4358fd6d2fedd61edc8e70ef1bbde35e6e52c0eda73a7e0,3651
51
51
  minitap/mobile_use/sdk/types/task.py,sha256=74743a398b63af62383528d5906824ae8aaba1e1885c75414b347623d7931f12,5837
52
- minitap/mobile_use/sdk/utils.py,sha256=493c77e43fcb58535eef43416716a3283488577c127060de5c0317d0b737b01f,945
52
+ minitap/mobile_use/sdk/utils.py,sha256=647f1f4a463c3029c3b0eb3c33f7dd778d5f5fd9d293224f5474595a60e1de6f,967
53
53
  minitap/mobile_use/servers/config.py,sha256=8a4a6bce23e2093d047a91e135e2f88627f76ac12177d071f25a3ca739b3afeb,575
54
- minitap/mobile_use/servers/device_hardware_bridge.py,sha256=80b93fe1bd8ea9100ac198a83f0aea2c40565a11e810acff9785bbd3f3b31f37,7174
54
+ minitap/mobile_use/servers/device_hardware_bridge.py,sha256=52839ea009bb303a695a2af1ef8e7bbb6d90788229f3160dffebc8098923f6cb,7180
55
55
  minitap/mobile_use/servers/device_screen_api.py,sha256=63bf866f17cde4ab97631b710080866b8427225d3857b2351ab83db38a9c5107,5064
56
56
  minitap/mobile_use/servers/start_servers.py,sha256=1e86dc0fcbdf6e6570ae68c7097145e754f3c3448ca813d415b3e5ebb74db828,5037
57
57
  minitap/mobile_use/servers/stop_servers.py,sha256=9a3dc2eafb3c13e420248b1844694c80112be32f0d336f54ecc1015cb6f27be9,7127
58
- minitap/mobile_use/servers/utils.py,sha256=db5d26153a169ab141556337db3693adc1bf8522943316656bdeb05dbf95465b,394
58
+ minitap/mobile_use/servers/utils.py,sha256=f3cc85da39f8d60cb840001be418562de7db95462370db9b79e96d884abe5c17,294
59
59
  minitap/mobile_use/services/accessibility.py,sha256=42bcbe81b427ee6f6e82bcfe420fc40630db950bda354e3e433c2dda2e159628,3404
60
- minitap/mobile_use/services/llm.py,sha256=c3e99290431bcdcbf81cbffd08bf3abbd4a3760c20cb0873278c418df0d28b0f,3724
61
- minitap/mobile_use/tools/index.py,sha256=db61053f24beb88952cc34be37336defd8ebf5e1fec0ecf81e2439a76b29bde1,2449
60
+ minitap/mobile_use/services/llm.py,sha256=3706edcb2132709c5cb931fac86ea31908a209347b341ec7b0f1cfbb27959c66,4260
61
+ minitap/mobile_use/tools/index.py,sha256=dbf9cfac4f319718c6f50b19d86a7d3aef0886caeb60db17c34ff4f18e640dc3,2692
62
62
  minitap/mobile_use/tools/mobile/back.py,sha256=cf1053b22c4fbeb1c219578563d6d857425dcdff08af690149c6e52a0e29c195,1792
63
- minitap/mobile_use/tools/mobile/clear_text.py,sha256=28e9af14cbb62be3a8221e7b1e7645e9bc22f40202d84c6047874809137cd927,9316
64
- minitap/mobile_use/tools/mobile/copy_text_from.py,sha256=723d7563e19d05060da0071aedfb620ce36bfb90931fcb815ab8d01be7ed9dd5,2716
63
+ minitap/mobile_use/tools/mobile/clear_text.py,sha256=32de8458e0eb34a10ab239d4925120794e78b24118069a65c08fc9f8daf6b63a,10803
64
+ minitap/mobile_use/tools/mobile/copy_text_from.py,sha256=e58f2812fd2baeec91038eabb817d322fbecc6e9b079b4da725bc6c79ca9b02c,2718
65
65
  minitap/mobile_use/tools/mobile/erase_one_char.py,sha256=e8c0a519a235271fa1cb785fe711e63e9ca14f4d33a61fbb39af04ec9bf18211,1960
66
66
  minitap/mobile_use/tools/mobile/find_packages.py,sha256=78f3051f40307ba75655fbffe6fe3fc3954f158eb8ceb0d270cb81a5e807d81d,2554
67
- minitap/mobile_use/tools/mobile/input_text.py,sha256=6a0b48ac79ad908fd6229a63fe17f7c5f26fb0e7466632700efd5db40393bda5,3199
67
+ minitap/mobile_use/tools/mobile/glimpse_screen.py,sha256=cd41702461f6a0aa5cd3f166af5395bb15e2305edfe60908da134595a35c10bf,2426
68
+ minitap/mobile_use/tools/mobile/input_text.py,sha256=e2d36bcdcc7f07e4d81e6d86a18740d703087e1865e1e1a2fcaa90a0061feed6,6367
68
69
  minitap/mobile_use/tools/mobile/launch_app.py,sha256=e1879333c0eae92b22ec3c147edd26dfe41252bf8049e5954a0b72d5a8b8f650,2027
69
70
  minitap/mobile_use/tools/mobile/long_press_on.py,sha256=b59bf885a10e7468069e5523eb7d23bfa6d41efc7d0521f7622e4dd2260fe879,2194
70
71
  minitap/mobile_use/tools/mobile/open_link.py,sha256=ad363f83b254a8e3e5969b4d8b90ef4e1fc4eceacc9c976e02a3e110e80ad23f,1875
71
- minitap/mobile_use/tools/mobile/paste_text.py,sha256=dc126297f174cdcdfc6f6d148fdb6a96ecb7813926e441ce0631e963b196b448,2101
72
+ minitap/mobile_use/tools/mobile/paste_text.py,sha256=76a21937395730bd2a6cba9aa0f4aa96463cd320bac8281517c878a9096748d3,3038
72
73
  minitap/mobile_use/tools/mobile/press_key.py,sha256=a22d416279c33f2e843aaf28e4466a7eeae59aa690312c8866b62a3f84b57d5b,1939
73
74
  minitap/mobile_use/tools/mobile/stop_app.py,sha256=8fc1cf5682232d670270a7e909f365a795150643eac5310f042d792b79e7c0c0,2062
74
- minitap/mobile_use/tools/mobile/swipe.py,sha256=4d0da8c0db0995598a9a74ebfc5e7fdc176abc8e5277fd8d5f588de864947dda,1878
75
- minitap/mobile_use/tools/mobile/take_screenshot.py,sha256=8762be82e0fb55549f1271a8e4c7b25040f906d21ed19f52121a616e70eb9bb0,2271
75
+ minitap/mobile_use/tools/mobile/swipe.py,sha256=23c31022bef827afbfe90c7f6a7d195e5bef57eb3972cd32b0d2aa054b4c6d26,5754
76
76
  minitap/mobile_use/tools/mobile/tap.py,sha256=d7a3de2ddb78b051b22d7886553d75bab13562abfc8562957c15fb16dd484a0a,2297
77
77
  minitap/mobile_use/tools/mobile/wait_for_animation_to_end.py,sha256=967d0df11dfb073dde6308761e9795e02c93ee2b0cbe17caf6edbe4a8beea28a,2493
78
- minitap/mobile_use/tools/tool_wrapper.py,sha256=166d9c4b7950e66407eb397a81d88354779ee3056a8dc7ad1bf160a3aa54580c,334
79
- minitap/mobile_use/tools/utils.py,sha256=bf6924e3d9e5338c2e04d88fd0ad9ed03a0c02058b62373025fa4b3a805712ae,2694
78
+ minitap/mobile_use/tools/test_utils.py,sha256=efd16bd82030d782b7fa0227ed211a2a8ad616a1819252edbb64c58c340adb63,13241
79
+ minitap/mobile_use/tools/tool_wrapper.py,sha256=f0f27beaae25a1bcfd9b72bf994de84b2e5fba9e242d8ad18a8d1a97cd7619e4,454
80
+ minitap/mobile_use/tools/utils.py,sha256=d056e5baf268e19e9463bf0c1e923ed81eb0f699ed071d904a3585fb16924a7d,6717
80
81
  minitap/mobile_use/utils/cli_helpers.py,sha256=1c53b6ea6cd2ba861302b182944c6a3a31dac27e316bca2c65cd6a3ca3256e81,1720
81
82
  minitap/mobile_use/utils/cli_selection.py,sha256=62e949bf075e984b5d23b4a9880ff2bccf8f9e0f7ccb48120030a6a82075352b,4788
82
83
  minitap/mobile_use/utils/conversations.py,sha256=8f1d924300ec3f6f7c71510c21e3011b75caca5b1fff06fdaccb377c3cde24ec,914
@@ -85,12 +86,13 @@ minitap/mobile_use/utils/errors.py,sha256=6c5566484cff48ce1eb168c3cbe93d6e536545
85
86
  minitap/mobile_use/utils/file.py,sha256=1ca968613452a273b23e4f58460ab39f87255b02cdb6fb8ca04f4e628b346070,315
86
87
  minitap/mobile_use/utils/logger.py,sha256=011fe08c39b111997ec685b9f0b378761607e35ac049234b5e86c2b58f29bbe3,5633
87
88
  minitap/mobile_use/utils/media.py,sha256=29fa7f009a0f2bd60de2a9eba4a90e6eecc91cc67c2736b753506d48ab2bf5eb,2228
88
- minitap/mobile_use/utils/recorder.py,sha256=83dcb953b9caf00bf3e4853c3eee447166e1279e7ceefbbeb25d93e932ec698d,1937
89
+ minitap/mobile_use/utils/recorder.py,sha256=f90c511a182553684fc4c51195dec6859c7867b83b66bd56dd13f0cdcab2b3ae,1724
89
90
  minitap/mobile_use/utils/requests_utils.py,sha256=5c3a2e2aff7c521cd6a43b74c084e2244e1ff55065a5b722e6e251c6419861fd,1168
90
91
  minitap/mobile_use/utils/shell_utils.py,sha256=b35ae7f863379adb86c9ba0f9b3b9d4954118d12aef1ffed0bc260b32d73d857,650
92
+ minitap/mobile_use/utils/test_ui_hierarchy.py,sha256=96c1549c05b4f7254a22d57dbd40aea860756f1e0b9d8cc24319383643448422,5911
91
93
  minitap/mobile_use/utils/time.py,sha256=41bfaabb3751de11443ccb4a3f1f53d5ebacc7744c72e32695fdcc3d23f17d49,160
92
- minitap/mobile_use/utils/ui_hierarchy.py,sha256=b52acd081ac18169dab94b7187c6ffed4db72d4e4b7f56aeca9ef5b81166c4e0,3630
93
- minitap_mobile_use-2.1.0.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
94
- minitap_mobile_use-2.1.0.dist-info/entry_points.txt,sha256=663a29cfd551a4eaa0f27335f0bd7e4a732a4e39c76b68ef5c8dc444d4a285fa,60
95
- minitap_mobile_use-2.1.0.dist-info/METADATA,sha256=95abc6db29ea323284374508c8faba3fd6cf83db998a2a45b82585af354b8ab2,10574
96
- minitap_mobile_use-2.1.0.dist-info/RECORD,,
94
+ minitap/mobile_use/utils/ui_hierarchy.py,sha256=69bff27bcb29087ebab4946f52c72d833414bd7e8819d3610beb61cc39c9023d,3626
95
+ minitap_mobile_use-2.3.0.dist-info/WHEEL,sha256=ab6157bc637547491fb4567cd7ddf26b04d63382916ca16c29a5c8e94c9c9ef7,79
96
+ minitap_mobile_use-2.3.0.dist-info/entry_points.txt,sha256=663a29cfd551a4eaa0f27335f0bd7e4a732a4e39c76b68ef5c8dc444d4a285fa,60
97
+ minitap_mobile_use-2.3.0.dist-info/METADATA,sha256=0fc22ec4cc7d885577bf44a33f469ce7229b43045a8fa8be45fdfd54495e6be9,11917
98
+ minitap_mobile_use-2.3.0.dist-info/RECORD,,