hud-python 0.3.4__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 -414
  87. hud/tools/computer/hud.py +376 -328
  88. hud/tools/computer/openai.py +295 -286
  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.4.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.4.dist-info/METADATA +0 -284
  190. hud_python-0.3.4.dist-info/RECORD +0 -120
  191. /hud/{adapters/common → shared}/tests/__init__.py +0 -0
  192. {hud_python-0.3.4.dist-info → hud_python-0.4.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,157 @@
1
+ """Tests for server exceptions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from unittest.mock import MagicMock
6
+
7
+ import httpx
8
+
9
+ from hud.shared.exceptions import (
10
+ GymMakeException,
11
+ HudAuthenticationError,
12
+ HudException,
13
+ HudNetworkError,
14
+ HudRequestError,
15
+ HudTimeoutError,
16
+ )
17
+
18
+
19
+ class TestHudRequestError:
20
+ """Test HudRequestError exception."""
21
+
22
+ def test_from_httpx_error_with_json_detail(self):
23
+ """Test creating from httpx error with JSON detail."""
24
+ response = MagicMock()
25
+ response.status_code = 400
26
+ response.json.return_value = {"detail": "Bad request details"}
27
+
28
+ error = httpx.HTTPStatusError("Test", request=MagicMock(), response=response)
29
+
30
+ hud_error = HudRequestError.from_httpx_error(error, context="Test context")
31
+
32
+ assert hud_error.status_code == 400
33
+ assert "Test context" in str(hud_error)
34
+ assert "Bad request details" in str(hud_error)
35
+
36
+ def test_from_httpx_error_with_small_json_no_detail(self):
37
+ """Test creating from httpx error with small JSON but no detail field."""
38
+ response = MagicMock()
39
+ response.status_code = 400
40
+ response.json.return_value = {"error": "test", "code": 123}
41
+
42
+ error = httpx.HTTPStatusError("Test", request=MagicMock(), response=response)
43
+
44
+ hud_error = HudRequestError.from_httpx_error(error)
45
+
46
+ assert hud_error.status_code == 400
47
+ assert "JSON response:" in str(hud_error)
48
+ # Check for the dictionary representation (not exact JSON string)
49
+ assert "'error': 'test'" in str(hud_error)
50
+ assert "'code': 123" in str(hud_error)
51
+
52
+ def test_from_httpx_error_json_parse_failure(self):
53
+ """Test creating from httpx error when JSON parsing fails."""
54
+ response = MagicMock()
55
+ response.status_code = 500
56
+ response.json.side_effect = ValueError("Invalid JSON")
57
+
58
+ error = httpx.HTTPStatusError("Test", request=MagicMock(), response=response)
59
+
60
+ hud_error = HudRequestError.from_httpx_error(error)
61
+
62
+ assert hud_error.status_code == 500
63
+ assert "Request failed with status 500" in str(hud_error)
64
+
65
+ def test_from_httpx_error_large_json_response(self):
66
+ """Test creating from httpx error with large JSON response."""
67
+ response = MagicMock()
68
+ response.status_code = 400
69
+ # Large JSON object (more than 5 keys)
70
+ response.json.return_value = {
71
+ "field1": "value1",
72
+ "field2": "value2",
73
+ "field3": "value3",
74
+ "field4": "value4",
75
+ "field5": "value5",
76
+ "field6": "value6",
77
+ }
78
+
79
+ error = httpx.HTTPStatusError("Test", request=MagicMock(), response=response)
80
+
81
+ hud_error = HudRequestError.from_httpx_error(error)
82
+
83
+ assert hud_error.status_code == 400
84
+ # Should not include JSON in message since it's large
85
+ assert "JSON response:" not in str(hud_error)
86
+ assert "Request failed with status 400" in str(hud_error)
87
+
88
+ def test_str_method(self):
89
+ """Test string representation of HudRequestError."""
90
+ error = HudRequestError("Test error message", 404, '{"extra": "data"}')
91
+
92
+ error_str = str(error)
93
+ assert "Test error message" in error_str
94
+ assert "404" in error_str
95
+ assert "extra" in error_str
96
+
97
+
98
+ class TestHudNetworkError:
99
+ """Test HudNetworkError exception."""
100
+
101
+ def test_initialization_and_str(self):
102
+ """Test HudNetworkError initialization and string representation."""
103
+ error = HudNetworkError("Network failure: Connection refused")
104
+
105
+ error_str = str(error)
106
+ assert "Network failure" in error_str
107
+ assert "Connection refused" in error_str
108
+
109
+
110
+ class TestHudTimeoutError:
111
+ """Test HudTimeoutError exception."""
112
+
113
+ def test_initialization(self):
114
+ """Test HudTimeoutError initialization."""
115
+ error = HudTimeoutError("Request timed out after 30.0 seconds")
116
+
117
+ error_str = str(error)
118
+ assert "Request timed out" in error_str
119
+ assert "30.0" in error_str
120
+
121
+ def test_str_method(self):
122
+ """Test string representation of HudTimeoutError."""
123
+ error = HudTimeoutError("Timeout occurred after 60.0 seconds")
124
+
125
+ error_str = str(error)
126
+ assert "Timeout occurred" in error_str
127
+ assert "60.0" in error_str
128
+
129
+
130
+ class TestHudAuthenticationError:
131
+ """Test HudAuthenticationError exception."""
132
+
133
+ def test_inheritance(self):
134
+ """Test that HudAuthenticationError inherits from HudException."""
135
+ error = HudAuthenticationError("Auth failed")
136
+
137
+ assert isinstance(error, HudException)
138
+ error_str = str(error)
139
+ assert "Auth failed" in error_str
140
+
141
+
142
+ class TestGymMakeException:
143
+ """Test GymMakeException."""
144
+
145
+ def test_initialization_and_str(self):
146
+ """Test GymMakeException initialization and string representation."""
147
+ data = {"env_id": "test-env", "error": "invalid config"}
148
+ error = GymMakeException("Failed to create environment", data)
149
+
150
+ assert error.data == data
151
+
152
+ error_str = str(error)
153
+ assert "Failed to create environment" in error_str
154
+ assert "Data:" in error_str
155
+ assert "env_id" in error_str
156
+ assert "test-env" in error_str
157
+ assert "invalid config" in error_str