hud-python 0.3.5__py3-none-any.whl → 0.4.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 hud-python might be problematic. Click here for more details.

Files changed (192) hide show
  1. hud/__init__.py +22 -89
  2. hud/agents/__init__.py +17 -0
  3. hud/agents/art.py +101 -0
  4. hud/agents/base.py +599 -0
  5. hud/{mcp → agents}/claude.py +373 -321
  6. hud/{mcp → agents}/langchain.py +250 -250
  7. hud/agents/misc/__init__.py +7 -0
  8. hud/{agent → agents}/misc/response_agent.py +80 -80
  9. hud/{mcp → agents}/openai.py +352 -334
  10. hud/agents/openai_chat_generic.py +154 -0
  11. hud/{mcp → agents}/tests/__init__.py +1 -1
  12. hud/agents/tests/test_base.py +742 -0
  13. hud/agents/tests/test_claude.py +324 -0
  14. hud/{mcp → agents}/tests/test_client.py +363 -324
  15. hud/{mcp → agents}/tests/test_openai.py +237 -238
  16. hud/cli/__init__.py +617 -0
  17. hud/cli/__main__.py +8 -0
  18. hud/cli/analyze.py +371 -0
  19. hud/cli/analyze_metadata.py +230 -0
  20. hud/cli/build.py +427 -0
  21. hud/cli/clone.py +185 -0
  22. hud/cli/cursor.py +92 -0
  23. hud/cli/debug.py +392 -0
  24. hud/cli/docker_utils.py +83 -0
  25. hud/cli/init.py +281 -0
  26. hud/cli/interactive.py +353 -0
  27. hud/cli/mcp_server.py +756 -0
  28. hud/cli/pull.py +336 -0
  29. hud/cli/push.py +379 -0
  30. hud/cli/remote_runner.py +311 -0
  31. hud/cli/runner.py +160 -0
  32. hud/cli/tests/__init__.py +3 -0
  33. hud/cli/tests/test_analyze.py +284 -0
  34. hud/cli/tests/test_cli_init.py +265 -0
  35. hud/cli/tests/test_cli_main.py +27 -0
  36. hud/cli/tests/test_clone.py +142 -0
  37. hud/cli/tests/test_cursor.py +253 -0
  38. hud/cli/tests/test_debug.py +453 -0
  39. hud/cli/tests/test_mcp_server.py +139 -0
  40. hud/cli/tests/test_utils.py +388 -0
  41. hud/cli/utils.py +263 -0
  42. hud/clients/README.md +143 -0
  43. hud/clients/__init__.py +16 -0
  44. hud/clients/base.py +354 -0
  45. hud/clients/fastmcp.py +202 -0
  46. hud/clients/mcp_use.py +278 -0
  47. hud/clients/tests/__init__.py +1 -0
  48. hud/clients/tests/test_client_integration.py +111 -0
  49. hud/clients/tests/test_fastmcp.py +342 -0
  50. hud/clients/tests/test_protocol.py +188 -0
  51. hud/clients/utils/__init__.py +1 -0
  52. hud/clients/utils/retry_transport.py +160 -0
  53. hud/datasets.py +322 -192
  54. hud/misc/__init__.py +1 -0
  55. hud/{agent → misc}/claude_plays_pokemon.py +292 -283
  56. hud/otel/__init__.py +35 -0
  57. hud/otel/collector.py +142 -0
  58. hud/otel/config.py +164 -0
  59. hud/otel/context.py +536 -0
  60. hud/otel/exporters.py +366 -0
  61. hud/otel/instrumentation.py +97 -0
  62. hud/otel/processors.py +118 -0
  63. hud/otel/tests/__init__.py +1 -0
  64. hud/otel/tests/test_processors.py +197 -0
  65. hud/server/__init__.py +5 -5
  66. hud/server/context.py +114 -0
  67. hud/server/helper/__init__.py +5 -0
  68. hud/server/low_level.py +132 -0
  69. hud/server/server.py +166 -0
  70. hud/server/tests/__init__.py +3 -0
  71. hud/settings.py +73 -79
  72. hud/shared/__init__.py +5 -0
  73. hud/{exceptions.py → shared/exceptions.py} +180 -180
  74. hud/{server → shared}/requests.py +264 -264
  75. hud/shared/tests/test_exceptions.py +157 -0
  76. hud/{server → shared}/tests/test_requests.py +275 -275
  77. hud/telemetry/__init__.py +25 -30
  78. hud/telemetry/instrument.py +379 -0
  79. hud/telemetry/job.py +309 -141
  80. hud/telemetry/replay.py +74 -0
  81. hud/telemetry/trace.py +83 -0
  82. hud/tools/__init__.py +33 -34
  83. hud/tools/base.py +365 -65
  84. hud/tools/bash.py +161 -137
  85. hud/tools/computer/__init__.py +15 -13
  86. hud/tools/computer/anthropic.py +437 -420
  87. hud/tools/computer/hud.py +376 -334
  88. hud/tools/computer/openai.py +295 -292
  89. hud/tools/computer/settings.py +82 -0
  90. hud/tools/edit.py +314 -290
  91. hud/tools/executors/__init__.py +30 -30
  92. hud/tools/executors/base.py +539 -532
  93. hud/tools/executors/pyautogui.py +621 -619
  94. hud/tools/executors/tests/__init__.py +1 -1
  95. hud/tools/executors/tests/test_base_executor.py +338 -338
  96. hud/tools/executors/tests/test_pyautogui_executor.py +165 -165
  97. hud/tools/executors/xdo.py +511 -503
  98. hud/tools/{playwright_tool.py → playwright.py} +412 -379
  99. hud/tools/tests/__init__.py +3 -3
  100. hud/tools/tests/test_base.py +282 -0
  101. hud/tools/tests/test_bash.py +158 -152
  102. hud/tools/tests/test_bash_extended.py +197 -0
  103. hud/tools/tests/test_computer.py +425 -52
  104. hud/tools/tests/test_computer_actions.py +34 -34
  105. hud/tools/tests/test_edit.py +259 -240
  106. hud/tools/tests/test_init.py +27 -27
  107. hud/tools/tests/test_playwright_tool.py +183 -183
  108. hud/tools/tests/test_tools.py +145 -157
  109. hud/tools/tests/test_utils.py +156 -156
  110. hud/tools/types.py +72 -0
  111. hud/tools/utils.py +50 -50
  112. hud/types.py +136 -89
  113. hud/utils/__init__.py +10 -16
  114. hud/utils/async_utils.py +65 -0
  115. hud/utils/design.py +168 -0
  116. hud/utils/mcp.py +55 -0
  117. hud/utils/progress.py +149 -149
  118. hud/utils/telemetry.py +66 -66
  119. hud/utils/tests/test_async_utils.py +173 -0
  120. hud/utils/tests/test_init.py +17 -21
  121. hud/utils/tests/test_progress.py +261 -225
  122. hud/utils/tests/test_telemetry.py +82 -37
  123. hud/utils/tests/test_version.py +8 -8
  124. hud/version.py +7 -7
  125. hud_python-0.4.0.dist-info/METADATA +474 -0
  126. hud_python-0.4.0.dist-info/RECORD +132 -0
  127. hud_python-0.4.0.dist-info/entry_points.txt +3 -0
  128. {hud_python-0.3.5.dist-info → hud_python-0.4.0.dist-info}/licenses/LICENSE +21 -21
  129. hud/adapters/__init__.py +0 -8
  130. hud/adapters/claude/__init__.py +0 -5
  131. hud/adapters/claude/adapter.py +0 -180
  132. hud/adapters/claude/tests/__init__.py +0 -1
  133. hud/adapters/claude/tests/test_adapter.py +0 -519
  134. hud/adapters/common/__init__.py +0 -6
  135. hud/adapters/common/adapter.py +0 -178
  136. hud/adapters/common/tests/test_adapter.py +0 -289
  137. hud/adapters/common/types.py +0 -446
  138. hud/adapters/operator/__init__.py +0 -5
  139. hud/adapters/operator/adapter.py +0 -108
  140. hud/adapters/operator/tests/__init__.py +0 -1
  141. hud/adapters/operator/tests/test_adapter.py +0 -370
  142. hud/agent/__init__.py +0 -19
  143. hud/agent/base.py +0 -126
  144. hud/agent/claude.py +0 -271
  145. hud/agent/langchain.py +0 -215
  146. hud/agent/misc/__init__.py +0 -3
  147. hud/agent/operator.py +0 -268
  148. hud/agent/tests/__init__.py +0 -1
  149. hud/agent/tests/test_base.py +0 -202
  150. hud/env/__init__.py +0 -11
  151. hud/env/client.py +0 -35
  152. hud/env/docker_client.py +0 -349
  153. hud/env/environment.py +0 -446
  154. hud/env/local_docker_client.py +0 -358
  155. hud/env/remote_client.py +0 -212
  156. hud/env/remote_docker_client.py +0 -292
  157. hud/gym.py +0 -130
  158. hud/job.py +0 -773
  159. hud/mcp/__init__.py +0 -17
  160. hud/mcp/base.py +0 -631
  161. hud/mcp/client.py +0 -312
  162. hud/mcp/tests/test_base.py +0 -512
  163. hud/mcp/tests/test_claude.py +0 -294
  164. hud/task.py +0 -149
  165. hud/taskset.py +0 -237
  166. hud/telemetry/_trace.py +0 -347
  167. hud/telemetry/context.py +0 -230
  168. hud/telemetry/exporter.py +0 -575
  169. hud/telemetry/instrumentation/__init__.py +0 -3
  170. hud/telemetry/instrumentation/mcp.py +0 -259
  171. hud/telemetry/instrumentation/registry.py +0 -59
  172. hud/telemetry/mcp_models.py +0 -270
  173. hud/telemetry/tests/__init__.py +0 -1
  174. hud/telemetry/tests/test_context.py +0 -210
  175. hud/telemetry/tests/test_trace.py +0 -312
  176. hud/tools/helper/README.md +0 -56
  177. hud/tools/helper/__init__.py +0 -9
  178. hud/tools/helper/mcp_server.py +0 -78
  179. hud/tools/helper/server_initialization.py +0 -115
  180. hud/tools/helper/utils.py +0 -58
  181. hud/trajectory.py +0 -94
  182. hud/utils/agent.py +0 -37
  183. hud/utils/common.py +0 -256
  184. hud/utils/config.py +0 -120
  185. hud/utils/deprecation.py +0 -115
  186. hud/utils/misc.py +0 -53
  187. hud/utils/tests/test_common.py +0 -277
  188. hud/utils/tests/test_config.py +0 -129
  189. hud_python-0.3.5.dist-info/METADATA +0 -284
  190. hud_python-0.3.5.dist-info/RECORD +0 -120
  191. /hud/{adapters/common → shared}/tests/__init__.py +0 -0
  192. {hud_python-0.3.5.dist-info → hud_python-0.4.0.dist-info}/WHEEL +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Human Union Data, Inc
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Human Union Data, Inc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
hud/adapters/__init__.py DELETED
@@ -1,8 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from .claude import ClaudeAdapter
4
- from .common import CLA, Adapter
5
- from .common.types import ResponseAction
6
- from .operator import OperatorAdapter
7
-
8
- __all__ = ["CLA", "Adapter", "ClaudeAdapter", "OperatorAdapter", "ResponseAction"]
@@ -1,5 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from .adapter import ClaudeAdapter
4
-
5
- __all__ = ["ClaudeAdapter"]
@@ -1,180 +0,0 @@
1
- # ruff: noqa: S101
2
-
3
- from __future__ import annotations
4
-
5
- from typing import Any, ClassVar
6
-
7
- from hud.adapters.common import CLA, Adapter
8
- from hud.adapters.common.types import (
9
- CLAKey,
10
- ClickAction,
11
- DragAction,
12
- MoveAction,
13
- Point,
14
- PositionFetch,
15
- PressAction,
16
- ResponseAction,
17
- ScreenshotFetch,
18
- ScrollAction,
19
- TypeAction,
20
- WaitAction,
21
- )
22
-
23
-
24
- class ClaudeAdapter(Adapter):
25
- KEY_MAP: ClassVar[dict[str, CLAKey]] = {
26
- "return": "enter",
27
- "super": "win",
28
- "super_l": "win",
29
- "super_r": "win",
30
- "right shift": "shift",
31
- "left shift": "shift",
32
- "down shift": "shift",
33
- "windows": "win",
34
- "page_down": "pagedown",
35
- "page_up": "pageup",
36
- }
37
-
38
- def __init__(self, width: int = 1024, height: int = 768) -> None:
39
- super().__init__()
40
- self.agent_width = width # Claude's preferred width
41
- self.agent_height = height # Claude's preferred height
42
-
43
- def _map_key(self, key: str) -> CLAKey:
44
- """Map a key to its standardized form."""
45
- return self.KEY_MAP.get(key.lower(), key.lower()) # type: ignore
46
-
47
- def convert(self, data: Any) -> CLA:
48
- try:
49
- # Validate input data
50
- if not isinstance(data, dict):
51
- raise ValueError(f"Invalid action: {data}")
52
-
53
- action_type = data.get("action")
54
-
55
- if action_type == "key":
56
- assert "text" in data
57
- if "+" in data["text"]:
58
- keys: list[CLAKey] = [self._map_key(k) for k in (data["text"].split("+"))]
59
- assert len(keys) > 0
60
- converted_action = PressAction(keys=keys)
61
- else:
62
- converted_action = PressAction(keys=[self._map_key(data["text"])])
63
-
64
- elif action_type == "type":
65
- assert "text" in data
66
- converted_action = TypeAction(
67
- text=data["text"],
68
- enter_after=False,
69
- )
70
-
71
- elif action_type == "mouse_move":
72
- # 'coordinate' should be provided as an array [x, y].
73
- assert "coordinate" in data
74
- coord = data["coordinate"]
75
- assert isinstance(coord, list)
76
- assert len(coord) == 2
77
- converted_action = MoveAction(point=Point(x=coord[0], y=coord[1]))
78
-
79
- elif action_type == "left_click":
80
- assert "coordinate" in data
81
- coord = data["coordinate"]
82
- assert isinstance(coord, list)
83
- assert len(coord) == 2
84
- converted_action = ClickAction(point=Point(x=coord[0], y=coord[1]), button="left")
85
-
86
- elif action_type == "left_click_drag":
87
- assert "coordinate" in data
88
- coord = data["coordinate"]
89
- assert isinstance(coord, list)
90
- assert len(coord) == 2
91
- if (
92
- len(self.memory) == 0
93
- or (
94
- not isinstance(self.memory[-1], MoveAction)
95
- and not isinstance(self.memory[-1], ClickAction)
96
- )
97
- or self.memory[-1].point is None
98
- ):
99
- raise ValueError("Left click drag must be preceded by a move or click action")
100
- else:
101
- converted_action = DragAction(
102
- path=[self.memory[-1].point, Point(x=coord[0], y=coord[1])]
103
- )
104
-
105
- elif action_type == "right_click":
106
- assert "coordinate" in data
107
- coord = data["coordinate"]
108
- assert isinstance(coord, list)
109
- assert len(coord) == 2
110
- converted_action = ClickAction(point=Point(x=coord[0], y=coord[1]), button="right")
111
-
112
- elif action_type == "middle_click":
113
- assert "coordinate" in data
114
- coord = data["coordinate"]
115
- assert isinstance(coord, list)
116
- assert len(coord) == 2
117
- converted_action = ClickAction(point=Point(x=coord[0], y=coord[1]), button="middle")
118
-
119
- elif action_type == "double_click":
120
- assert "coordinate" in data
121
- coord = data["coordinate"]
122
- assert isinstance(coord, list)
123
- assert len(coord) == 2
124
- converted_action = ClickAction(
125
- point=Point(x=coord[0], y=coord[1]), button="left", pattern=[100]
126
- )
127
-
128
- elif action_type == "triple_click":
129
- assert "coordinate" in data
130
- coord = data["coordinate"]
131
- assert isinstance(coord, list)
132
- assert len(coord) == 2
133
- converted_action = ClickAction(
134
- point=Point(x=coord[0], y=coord[1]),
135
- button="left",
136
- pattern=[100, 100],
137
- )
138
-
139
- elif action_type == "scroll":
140
- assert "scroll_direction" in data
141
- direction = data["scroll_direction"]
142
-
143
- if direction == "up":
144
- scroll = Point(x=0, y=-data["scroll_amount"])
145
- elif direction == "down":
146
- scroll = Point(x=0, y=data["scroll_amount"])
147
- elif direction == "left":
148
- scroll = Point(x=-data["scroll_amount"], y=0)
149
- elif direction == "right":
150
- scroll = Point(x=data["scroll_amount"], y=0)
151
- else:
152
- raise ValueError(f"Unsupported scroll direction: {direction}")
153
-
154
- converted_action = ScrollAction(
155
- point=Point(x=data["coordinate"][0], y=data["coordinate"][1]),
156
- scroll=scroll,
157
- )
158
-
159
- elif action_type == "screenshot":
160
- converted_action = ScreenshotFetch()
161
-
162
- elif action_type == "cursor_position":
163
- converted_action = PositionFetch()
164
-
165
- elif action_type == "wait":
166
- assert "duration" in data
167
- converted_action = WaitAction(time=data["duration"])
168
-
169
- elif action_type == "response":
170
- converted_action = ResponseAction(text=data.get("text", ""))
171
-
172
- else:
173
- raise ValueError(f"Unsupported action type: {action_type}")
174
-
175
- converted_action.reasoning = data.get("reasoning", None)
176
- converted_action.logs = data.get("logs", None)
177
-
178
- return converted_action
179
- except AssertionError:
180
- raise ValueError(f"Invalid action: {data}") from None
@@ -1 +0,0 @@
1
- # Tests for hud.adapters.claude module