hud-python 0.4.50__py3-none-any.whl → 0.4.52__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.

@@ -0,0 +1,223 @@
1
+ """Task tracking for async telemetry operations.
2
+
3
+ This module provides infrastructure to track async tasks created during
4
+ telemetry operations (status updates, metric logging) to ensure they
5
+ complete before process shutdown, preventing telemetry loss.
6
+
7
+ The task tracker maintains strong references to tasks and explicitly cleans
8
+ them up when they complete via callbacks. This ensures tasks are not garbage
9
+ collected before they finish executing.
10
+
11
+ Thread Safety:
12
+ Uses threading.Lock (not asyncio.Lock) because done callbacks run
13
+ synchronously and need to modify the task set safely.
14
+
15
+ Race Condition Prevention:
16
+ The wait_all() method uses a multi-pass approach to catch tasks that
17
+ are created while waiting for existing tasks to complete.
18
+
19
+ This is an internal module used by async context managers and cleanup
20
+ routines. Users typically don't interact with it directly.
21
+ """
22
+
23
+ import asyncio
24
+ import contextlib
25
+ import logging
26
+ import threading
27
+ from collections.abc import Coroutine
28
+ from typing import Any
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+ # Module exports
33
+ __all__ = ["TaskTracker", "track_task", "wait_all_tasks"]
34
+
35
+ # Global singleton task tracker
36
+ _global_tracker: "TaskTracker | None" = None
37
+
38
+
39
+ class TaskTracker:
40
+ """Tracks async tasks to ensure completion before shutdown.
41
+
42
+ Maintains a set of tasks with thread-safe access for both async code
43
+ and synchronous callbacks. Tasks are automatically removed when they
44
+ complete via done callbacks.
45
+ """
46
+
47
+ def __init__(self) -> None:
48
+ self._tasks: set[asyncio.Task] = set()
49
+ # Use threading.Lock for synchronous access from done callbacks
50
+ self._lock = threading.Lock()
51
+
52
+ def track_task(self, coro: Coroutine[Any, Any, Any], name: str = "task") -> asyncio.Task | None:
53
+ """Create and track an async task.
54
+
55
+ Args:
56
+ coro: The coroutine to run
57
+ name: Descriptive name for debugging and logging
58
+
59
+ Returns:
60
+ The created asyncio.Task, or None if no event loop is available
61
+ """
62
+ try:
63
+ task = asyncio.create_task(coro, name=name)
64
+
65
+ # Add task to tracking set (thread-safe)
66
+ with self._lock:
67
+ self._tasks.add(task)
68
+ task_count = len(self._tasks)
69
+
70
+ # Setup cleanup callback
71
+ def cleanup_callback(completed_task: asyncio.Task) -> None:
72
+ """Remove completed task from tracking set and log failures."""
73
+ with self._lock:
74
+ self._tasks.discard(completed_task)
75
+
76
+ # Log exceptions outside lock to avoid blocking
77
+ with contextlib.suppress(Exception):
78
+ if not completed_task.cancelled():
79
+ with contextlib.suppress(Exception):
80
+ exc = completed_task.exception()
81
+ if exc:
82
+ logger.warning("Task '%s' failed: %s", name, exc)
83
+
84
+ task.add_done_callback(cleanup_callback)
85
+ logger.debug("Tracking task '%s' (total active: %d)", name, task_count)
86
+ return task
87
+
88
+ except RuntimeError as e:
89
+ # No event loop - fall back to fire_and_forget
90
+ logger.warning("Cannot track task '%s': %s", name, e)
91
+ from hud.utils.async_utils import fire_and_forget
92
+
93
+ fire_and_forget(coro, name)
94
+ return None
95
+
96
+ async def wait_all(self, *, timeout_seconds: float = 30.0) -> int:
97
+ """Wait for all tracked tasks to complete.
98
+
99
+ Uses a multi-pass approach to handle race conditions where tasks are
100
+ added while waiting for existing tasks to complete. This ensures that
101
+ status updates created near the end of execution are still waited for.
102
+
103
+ Args:
104
+ timeout_seconds: Maximum time to wait in seconds
105
+
106
+ Returns:
107
+ Number of tasks that completed
108
+ """
109
+ total_completed = 0
110
+ time_remaining = timeout_seconds
111
+ max_passes = 10 # Prevent infinite loops if tasks keep spawning
112
+
113
+ for pass_num in range(max_passes):
114
+ # Get snapshot of pending tasks (thread-safe)
115
+ with self._lock:
116
+ pending = [t for t in self._tasks if not t.done()]
117
+
118
+ if not pending:
119
+ if pass_num == 0:
120
+ logger.debug("No pending tasks to wait for")
121
+ else:
122
+ logger.debug("All tasks completed after %d passes", pass_num)
123
+ break
124
+
125
+ # Log progress
126
+ if pass_num == 0:
127
+ logger.info("Waiting for %d pending tasks...", len(pending))
128
+ else:
129
+ logger.debug("Pass %d: Waiting for %d tasks", pass_num + 1, len(pending))
130
+
131
+ # Wait for this batch (max 5s per pass to check for new tasks)
132
+ batch_timeout = min(time_remaining, 5.0) if time_remaining > 0 else 5.0
133
+ start_time = asyncio.get_event_loop().time()
134
+
135
+ try:
136
+ done, still_pending = await asyncio.wait(
137
+ pending, timeout=batch_timeout, return_when=asyncio.ALL_COMPLETED
138
+ )
139
+ except Exception as e:
140
+ logger.error("Error waiting for tasks: %s", e)
141
+ break
142
+
143
+ # Update timing
144
+ elapsed = asyncio.get_event_loop().time() - start_time
145
+ time_remaining -= elapsed
146
+ total_completed += len(done)
147
+
148
+ # Handle timeout
149
+ if still_pending:
150
+ if time_remaining <= 0:
151
+ logger.warning(
152
+ "%d tasks still pending after %ss timeout - cancelling",
153
+ len(still_pending),
154
+ timeout_seconds,
155
+ )
156
+ for task in still_pending:
157
+ task.cancel()
158
+ break
159
+ # Otherwise continue to next pass
160
+ else:
161
+ # All tasks from this batch completed, check for new ones
162
+ with self._lock:
163
+ new_pending = [t for t in self._tasks if not t.done()]
164
+
165
+ if not new_pending:
166
+ # No new tasks were added - we're done
167
+ break
168
+ # Otherwise loop to wait for the new tasks
169
+
170
+ if total_completed > 0:
171
+ logger.info("Completed %d tasks", total_completed)
172
+
173
+ return total_completed
174
+
175
+ def get_pending_count(self) -> int:
176
+ """Get number of pending tasks (thread-safe)."""
177
+ with self._lock:
178
+ return sum(1 for t in self._tasks if not t.done())
179
+
180
+
181
+ def get_global_tracker() -> TaskTracker:
182
+ """Get or create the global task tracker."""
183
+ global _global_tracker
184
+ if _global_tracker is None:
185
+ _global_tracker = TaskTracker()
186
+ return _global_tracker
187
+
188
+
189
+ def track_task(coro: Coroutine[Any, Any, Any], name: str = "task") -> asyncio.Task | None:
190
+ """Create and track an async task for telemetry operations.
191
+
192
+ This is a convenience function that uses the global tracker to ensure
193
+ the task completes before shutdown. Used internally by async context
194
+ managers for status updates and metric logging.
195
+
196
+ Args:
197
+ coro: The coroutine to track
198
+ name: Descriptive name for debugging
199
+
200
+ Returns:
201
+ The created task, or None if no event loop is available
202
+ """
203
+ tracker = get_global_tracker()
204
+ return tracker.track_task(coro, name)
205
+
206
+
207
+ async def wait_all_tasks(*, timeout_seconds: float = 30.0) -> int:
208
+ """Wait for all tracked telemetry tasks to complete.
209
+
210
+ Ensures that all async telemetry operations (status updates, logs)
211
+ complete before the calling function returns, preventing telemetry loss.
212
+
213
+ Uses a multi-pass approach to handle race conditions where status updates
214
+ are created while waiting for other tasks to complete.
215
+
216
+ Args:
217
+ timeout_seconds: Maximum time to wait for tasks in seconds
218
+
219
+ Returns:
220
+ Number of tasks that completed
221
+ """
222
+ tracker = get_global_tracker()
223
+ return await tracker.wait_all(timeout_seconds=timeout_seconds)
@@ -5,4 +5,4 @@ def test_import():
5
5
  """Test that the package can be imported."""
6
6
  import hud
7
7
 
8
- assert hud.__version__ == "0.4.50"
8
+ assert hud.__version__ == "0.4.52"
hud/version.py CHANGED
@@ -4,4 +4,4 @@ Version information for the HUD SDK.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- __version__ = "0.4.50"
7
+ __version__ = "0.4.52"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.4.50
3
+ Version: 0.4.52
4
4
  Summary: SDK for the HUD platform.
5
5
  Project-URL: Homepage, https://github.com/hud-evals/hud-python
6
6
  Project-URL: Bug Tracker, https://github.com/hud-evals/hud-python/issues
@@ -48,6 +48,7 @@ Requires-Dist: opentelemetry-api>=1.34.1
48
48
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.34.1
49
49
  Requires-Dist: opentelemetry-instrumentation-mcp==0.47.0
50
50
  Requires-Dist: opentelemetry-sdk>=1.34.1
51
+ Requires-Dist: packaging>=21.0
51
52
  Requires-Dist: pathspec>=0.12.1
52
53
  Requires-Dist: pillow>=11.1.0
53
54
  Requires-Dist: prompt-toolkit==3.0.51
@@ -1,33 +1,33 @@
1
- hud/__init__.py,sha256=JMDFUE1pP0J1Xl_miBdt7ERvoffZmTzSFe8yxz512A8,552
1
+ hud/__init__.py,sha256=0LQ9PyuU6yZx7Fxu8YJXKC1i3TTHjg3UrInThh759QE,653
2
2
  hud/__main__.py,sha256=YR8Dq8OhINOsVfQ55PmRXXg4fEK84Rt_-rMtJ5rvhWo,145
3
3
  hud/settings.py,sha256=disObWa-DgXzoDcCDp3y1dTPaNsbR0IvoMJL9Eg4zyo,3947
4
4
  hud/types.py,sha256=KCVrglSG0VK-AUCFgG5CLgDcYqokvYgZG1r2Bsc-tBg,11155
5
- hud/version.py,sha256=n0UAZxOUNvgBT83XVdXaBuxxtW1D_o4cgeK4Myy1HO8,105
5
+ hud/version.py,sha256=6eRuCjDlZn4_gfm4B_A9cRBz531OtlF4KrULLYylQVo,105
6
6
  hud/agents/__init__.py,sha256=UoIkljWdbq4bM0LD-mSaw6w826EqdEjOk7r6glNYwYQ,286
7
- hud/agents/base.py,sha256=5G8Aio50KlDMGi3RjIlzK6fNHlY8YK9y5jhhHTUN5CE,31626
7
+ hud/agents/base.py,sha256=bv2eeBacvluIQDrcrbP6Ydj41i_9AXBA51x1y8mAC_g,31897
8
8
  hud/agents/claude.py,sha256=0zje6de9_H-QlyDf05BnvtwoLPFnYgXhHgQGEAjwktU,16006
9
9
  hud/agents/grounded_openai.py,sha256=UC_Z0BP1fvThB95cCYqvMgaQLYXFYB_8zlawwIphruY,11247
10
10
  hud/agents/langchain.py,sha256=1EgCy8jfjunsWxlPC5XfvfLS6_XZVrIF1ZjtHcrvhYw,9584
11
- hud/agents/lite_llm.py,sha256=_3wbUiYCp7q8Vyu9rhaoJDvmb_bsyUsLYWP3iQJ2bHo,2239
11
+ hud/agents/lite_llm.py,sha256=RW_VcMB-NIsxSfVhiQ2tvXSNQp3rTQg5h5Ax1b56bP0,2238
12
12
  hud/agents/openai.py,sha256=O1xV1h1l-W8lmnmXqTYr5CwnmnaniMqOxAZbl2CTTng,14576
13
13
  hud/agents/openai_chat_generic.py,sha256=_vAID9dZ_UxL0elYwafskRcsdrSsLsxJ4zPrP58oBiw,12151
14
14
  hud/agents/misc/__init__.py,sha256=LbVpHl2bDtheGPixbRRKsEjujwzmrXs7sCS8u1sYfAk,219
15
15
  hud/agents/misc/integration_test_agent.py,sha256=MYHsynQ_fooexxSGU_tN_zcQEUMrVCnlrdr6_KIj_Vw,2093
16
16
  hud/agents/misc/response_agent.py,sha256=uMuRDkz5QgaMQliNzBRepond5sb7KyqIiKm3LstjVnw,3753
17
17
  hud/agents/tests/__init__.py,sha256=W-O-_4i34d9TTyEHV-O_q1Ai1gLhzwDaaPo02_TWQIY,34
18
- hud/agents/tests/test_base.py,sha256=KDgaSlxiiHrNRq64zLjenq_6LcKb75Ln4NZCvci-I8M,28643
18
+ hud/agents/tests/test_base.py,sha256=JBd1C9V8XOVWy2q53aLlwhoIVQKulrawl8SUWbP0VrM,28420
19
19
  hud/agents/tests/test_claude.py,sha256=0nZnfsbGoECvsLPdmaRnc9jVmrehVvc3kxeyiCQI2Cc,13807
20
20
  hud/agents/tests/test_client.py,sha256=uikgh6yhjPPX2RBU4XJQMz1mNox9uXjuwsP8t93id18,13337
21
21
  hud/agents/tests/test_grounded_openai_agent.py,sha256=VK8lUvHIjWicMX00VKPE-FZyjiJqTEhb80MuRRa9fVc,5437
22
22
  hud/agents/tests/test_openai.py,sha256=dnAFAoBKZf-5dtDpj6UC3q7oZv2tdMFcniPU0emfImw,8020
23
- hud/cli/__init__.py,sha256=D32zOZKmp-KDTtXj7H2uYPTh-fOmnwGmIitHAU6eVKs,41422
23
+ hud/cli/__init__.py,sha256=ICDXVcw5QBGbSESBujXjrD2k0muk8HsUozY_SxHkruM,41086
24
24
  hud/cli/__main__.py,sha256=fDH7XITyuDITwSDIVwRso06aouADO0CzTHKqp5TOwJE,143
25
25
  hud/cli/analyze.py,sha256=4u5oYfJMquOjT9PzzRTYVcTZDxDi0ilNP_g532_hpOU,14716
26
26
  hud/cli/build.py,sha256=aFFWGtO1sQeTonvLsuMeDKG62IkakASbsP7FonGYuxc,22381
27
27
  hud/cli/clone.py,sha256=AwVDIuhr8mHb1oT2Af2HrD25SiTdwATpE6zd93vzLgA,6099
28
28
  hud/cli/debug.py,sha256=jtFW8J5F_3rhq1Hf1_SkJ7aLS3wjnyIs_LsC8k5cnzc,14200
29
29
  hud/cli/dev.py,sha256=mZW66fbtnCHplwGf1UWy72qfVYXnjPBUqVFAOD4v9Hg,23012
30
- hud/cli/eval.py,sha256=b91oYXBpODe_R2sRTWItjGceYSzSP5keKVLMkC7uc-Q,26926
30
+ hud/cli/eval.py,sha256=D6BXRNXlEpCHyyryaJTjPKUdHhFgETC-h8kqwYz9vTg,25524
31
31
  hud/cli/get.py,sha256=sksKrdzBGZa7ZuSoQkc0haj-CvOGVSSikoVXeaUd3N4,6274
32
32
  hud/cli/init.py,sha256=Iz0fcE8ao50xChCKwbapTwjAPRY0ZDqV6XHLsvCpRC4,9952
33
33
  hud/cli/list_func.py,sha256=EVi2Vc3Lb3glBNJxFx4MPnZknZ4xmuJz1OFg_dc8a_E,7177
@@ -52,16 +52,16 @@ hud/cli/rl/wait_utils.py,sha256=FyIvqYWLOydANTetukoE5Rp2AOQi67qkiAlIJp4HpL8,2577
52
52
  hud/cli/tests/__init__.py,sha256=ZrGVkmH7DHXGqOvjOSNGZeMYaFIRB2K8c6hwr8FPJ-8,68
53
53
  hud/cli/tests/test_analyze.py,sha256=inbRvi7KJKoMYrcqXU6RSayoh7mAOGVrRknm6BLQFes,11055
54
54
  hud/cli/tests/test_analyze_metadata.py,sha256=TP8rVRDFcdkZrdmKFIR9yUxuxiaAkc-6UmjV4vrJaJM,10025
55
- hud/cli/tests/test_build.py,sha256=YbI8ICGgV7sYwkoE_sUpcf-ItTAB-i6vYAqziML68Mg,13552
55
+ hud/cli/tests/test_build.py,sha256=OZhEHZAMjn1LVyWNzNlawWnyyn8z2gk2VxSNvDZ4f1A,13624
56
56
  hud/cli/tests/test_cli_init.py,sha256=_H0bAn5_skJ91Zj8P5P_wtZoPWvrN7jMhPZvmnnf0n8,11289
57
57
  hud/cli/tests/test_cli_main.py,sha256=0wMho9p9NcGjp0jLiUtCQh_FYdbMaCJtSY3sBbSgPwA,697
58
58
  hud/cli/tests/test_clone.py,sha256=oC2mf-41QQVc7ODJkjrWbVPNMB2fDW3nZ6jY6w93gvQ,4458
59
59
  hud/cli/tests/test_cursor.py,sha256=ZfxAFKJesJ3UV1JBoASSRlv6BXbpvVEk_pjxUg1jnf4,9821
60
60
  hud/cli/tests/test_debug.py,sha256=bQ76d_0HJfthHBSECmGNv499ZE57CIOKsanMlNfNHGk,18036
61
- hud/cli/tests/test_eval.py,sha256=URvNJBlwgbA8MTZhMbuTmGa2TETo4TPRm_G482CSQVM,22021
61
+ hud/cli/tests/test_eval.py,sha256=9tsjHHA43IUiEy5AK3avdURZE3H3AFWTeeb87QW-R98,22329
62
62
  hud/cli/tests/test_list_func.py,sha256=pkG4TtJJBMi9Xk8KBNFBlGcam7kwz01IRsjfQBL2PxM,10700
63
63
  hud/cli/tests/test_main_module.py,sha256=6RhwCcdRSN2uQV6-adti40ZcLd3u-mPR1ai6wL64c6Y,1105
64
- hud/cli/tests/test_mcp_server.py,sha256=2RzAdhHrBOn-FLsMfZ4CJd2z7xJEA-W7Ytd1RTIP_os,890
64
+ hud/cli/tests/test_mcp_server.py,sha256=2VYdxUVNhYq4BTXl1yJZWCZvYy7UZSUhYOcRhP1JccM,904
65
65
  hud/cli/tests/test_pull.py,sha256=ToSJrlfn13pYnrWWt3W_S7qFFjwvoZC2UisrZVrxujo,13155
66
66
  hud/cli/tests/test_push.py,sha256=V71KP5gEDo7Z9ccFpjidBjYliFg_KCfnZoZYbBXjguE,12875
67
67
  hud/cli/tests/test_registry.py,sha256=-o9MvQTcBElteqrg0XW8Bg59KrHCt88ZyPqeaAlyyTg,9539
@@ -82,12 +82,13 @@ hud/cli/utils/remote_runner.py,sha256=OOSJ6wU_gS_hJaURDfxZcyekjIIwPQKGN_Pq64tin3
82
82
  hud/cli/utils/runner.py,sha256=7HxVGa6OTflQnO0FSuRs273wnAmbm7cFRU9RTGL3-Wo,4390
83
83
  hud/cli/utils/server.py,sha256=EE5DJ0RAmXCEjMcZycpAsAxxCj6sOdIsXqPh38kK2ew,7416
84
84
  hud/cli/utils/source_hash.py,sha256=EDD3KC4pLGBVoSL5UTv1GvF2TAs2ThNHNOhP_5Sbub4,2979
85
- hud/cli/utils/tasks.py,sha256=bpH2mQkfgKUpgh1J0NtVxMxcM1jDZk2GAAPQMcqAUz4,826
85
+ hud/cli/utils/tasks.py,sha256=lX9SeM5XekrTBx2HWKMA0BQ7R3Q8jqGgi4G5vIHsnJM,994
86
+ hud/cli/utils/version_check.py,sha256=_e4H5Xxz2f9PVNSG8hAV_cJhS2zCX69RAodMRPTg-24,7279
86
87
  hud/clients/README.md,sha256=XNE3mch95ozDgVqfwCGcrhlHY9CwT1GKfNANNboowto,3826
87
88
  hud/clients/__init__.py,sha256=N5M_gZv4nP7dLRwpAiaqqaxyaLieGW6397FszeG7JGw,364
88
- hud/clients/base.py,sha256=yyQ4ctrXVyPps7Q_JGq2wilr1diNetWZ05wUJ4YCRng,14203
89
+ hud/clients/base.py,sha256=Ywq3CzsWRx1cgwMDUCgSK_N1kxPfFTV7h-8Ah2cxDOw,14215
89
90
  hud/clients/fastmcp.py,sha256=1xaAg7DwMcwt_GRx2n3OsZaX-UMEQCZCaLDK4cr2HhQ,9178
90
- hud/clients/mcp_use.py,sha256=WE_99LxilPnfYo2yXsxQOl3Rt8eNyYuvvIycVzpUzk0,14627
91
+ hud/clients/mcp_use.py,sha256=2Pb8bhAEmD9TJYKb-2JbxmyIsh4ttE_pP-kldrt6AH0,14750
91
92
  hud/clients/tests/__init__.py,sha256=sKOtJFFa4mDIXh1U6O8ZUHjigE8CiRMQ2PzJTIBZuVE,33
92
93
  hud/clients/tests/test_client_integration.py,sha256=kohU6jfCNfwSnAushHeB1_CmDlRfQc7VBL0GEdJYSeI,4198
93
94
  hud/clients/tests/test_fastmcp.py,sha256=4q3TzDjuieTZa89taiNJIrzbUncNkYOG4MaubypA21k,13030
@@ -98,8 +99,8 @@ hud/clients/utils/mcp_use_retry.py,sha256=knsgOTR3YFXshmPFfPQE6K6C5GpR1ZBJe2J7oz
98
99
  hud/clients/utils/retry.py,sha256=mMs2T_mAlb8AYhSqMR4AmCw7838gqCC4mdG3zjMAYM4,5744
99
100
  hud/clients/utils/retry_transport.py,sha256=Rsq25eiKKt_pM1bas78QEZvO0illK97X_3opmaS3A3w,6809
100
101
  hud/datasets/__init__.py,sha256=-g05iDy76CU4JiRHjKBBhgh3STtiIjmWhUfPqgf5hJE,697
101
- hud/datasets/parallel.py,sha256=hB_WSRWxgkfsPhbsiuM98IuR5Kln4B5iYOMxw86Yg8o,25441
102
- hud/datasets/runner.py,sha256=_BmQ4K-md3cyIs1YIiCH0HIjs_3Qwi0MAt4KJ8pLdTU,4625
102
+ hud/datasets/parallel.py,sha256=3V2jCOQxh_JesUYyNv8kPjLpddL5zuvQfMswiVYEUgo,25429
103
+ hud/datasets/runner.py,sha256=fHsblKzi0mEk5PDkpTWnRMjbCFrld4UcwrBCYIR4M1s,7517
103
104
  hud/datasets/utils.py,sha256=hdZfjWH5l3FVJaWBSHEEpjujAG7DqEam_vHgslL8MLs,4279
104
105
  hud/misc/__init__.py,sha256=m_pprQQ-G-Y0Sd0NEiR8MtAMbElnuFZ2OWT8TXrw7c4,43
105
106
  hud/misc/claude_plays_pokemon.py,sha256=IthAkjDVr2Q-GNvX-QLJyMzN7-0pHqqJbagGNv2m7yo,10453
@@ -110,9 +111,9 @@ hud/native/tests/test_comparator.py,sha256=pDch3r3xDi2o5YXF_bkoLfIdHcCjse3foAaqy
110
111
  hud/native/tests/test_native_init.py,sha256=Z-2dinbQYEkrbCcfBrBOLGdpXtWWOtkfPzp7ZKri68Y,2839
111
112
  hud/otel/__init__.py,sha256=ii17ayoWiS5vAhA7UAmZ8TkmP52gs2pWyHsD46-uYbE,1003
112
113
  hud/otel/collector.py,sha256=jLZymZ8r7xt2VDuWexfbnT7PY1-0aiyLMgjBy8KDY1M,4497
113
- hud/otel/config.py,sha256=PzyMOk_WYlJzVgZwQ_-F0DIlBbEy8Xt3ZA2e1QvFDes,6802
114
- hud/otel/context.py,sha256=9kJ_99KWGDvqU2O_DjmTHPXmhNDsMhbk_AHNvcHXR5Q,19116
115
- hud/otel/exporters.py,sha256=RLAjWa8b2DJEU21740Idq4fmeIuabLEqGGUspcFDcH4,14331
114
+ hud/otel/config.py,sha256=rqw4gaQCqJNEFWO_AfyqwgZVia706qJP0UveNSgDVSg,7037
115
+ hud/otel/context.py,sha256=DLP89aGlo-sTO0f4t80EvIXNaXA2FQXdOrlrkWJ6bVU,19102
116
+ hud/otel/exporters.py,sha256=k0yfUppMbcJ3IfNH3cc_u1hdR54qnnkT7lQjxO3I06g,21470
116
117
  hud/otel/instrumentation.py,sha256=fsFG9W89RdewFDxWKN9Ft4GUb7WbIKpfucTc16WxaZU,5093
117
118
  hud/otel/processors.py,sha256=-gGRbwifplcExDQBLfx_9tqWreDImULJNcENgO9q7VU,4700
118
119
  hud/otel/tests/__init__.py,sha256=VNJKBMaxTtbn7trW-1Ph50zCvCok_wTSGcI1HD6GOLA,43
@@ -124,7 +125,7 @@ hud/rl/buffer.py,sha256=z47HOjOBJx3umUzzUfdtq_N4ZoJ8FMBPkX8YQKBtd3A,15457
124
125
  hud/rl/chat_template.jinja,sha256=XTdzI8oFGEcSA-exKxyHaprwRDmX5Am1KEb0VxvUc6U,4965
125
126
  hud/rl/config.py,sha256=sCU56mjtgJpu_C0TXqpT14v1LmZv0ntmUjgNkFamTPA,5713
126
127
  hud/rl/distributed.py,sha256=1k65Qhd9Coh4dyra8TMTExO-tabyRS_wZqh7SO3kuxo,3650
127
- hud/rl/learner.py,sha256=GegoJiKUJSWxw96VYiEvasOJJ4MnVRxW52uwBvo07Zo,27223
128
+ hud/rl/learner.py,sha256=pdS_5_5KItQ8k0EVO4PX7ExDSDkQMoxAZJ5WvI-J7Kw,27239
128
129
  hud/rl/train.py,sha256=d0Ldg_ZXhiMwdpB5yidMK-LY6X__CWBhVqglQ-3EnvU,15589
129
130
  hud/rl/types.py,sha256=lrLKo7iaqodYth2EyeuOQfLiuzXfYM2eJjPmpObrD7c,3965
130
131
  hud/rl/utils.py,sha256=IsgVUUibxnUzb32a4mu1sYrgJC1CwoG9E-Dd5y5VDOA,19115
@@ -137,7 +138,7 @@ hud/samples/browser.py,sha256=7LkzGx2G5dA8RogZwORnxxpVsxMV2gF18D_hGJIEow8,973
137
138
  hud/server/__init__.py,sha256=ZTxwhR7tMtSE14i1sONTz5UaMXURW1AYoFZMbWGBviU,134
138
139
  hud/server/context.py,sha256=6bCdSzv1FGyItu9472HbbYef279H7QuMGJDR8EtYg5Y,3210
139
140
  hud/server/low_level.py,sha256=XYs2pOJ9kN4OcJ6ahDmXM5mWkzq5wJLpKFInUYrWEok,4701
140
- hud/server/router.py,sha256=c1dJ8CXqi_oI03WPDXqHH7jotxBY9BDIQsBQy5EoeSM,5336
141
+ hud/server/router.py,sha256=T9hLe08-W8SGvO14RfwY3j2zfcvB3lKWS5sR9h_4awM,5343
141
142
  hud/server/server.py,sha256=7M2tHH4wHsLfIRhbXgZVJTfJjW1cWGjeMPT_-ysVS_M,27096
142
143
  hud/server/helper/__init__.py,sha256=ZxO8VP3RZEBBp-q65VixuhzQgqEPSVzW0hEY9J9QqDA,116
143
144
  hud/server/tests/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
@@ -150,20 +151,21 @@ hud/server/tests/test_run_wrapper.py,sha256=EdwxMWCIHAp8t-l6VUeMOMhPRLTWjEVfTyys
150
151
  hud/server/tests/test_server_extra.py,sha256=MAmIrFwQWMFAP2AT6h1kbExZGxEvJZLq1bxvS7guQFE,5489
151
152
  hud/server/tests/test_sigterm_runner.py,sha256=HTM_0DAxA2exGYj7LK4udxMGXHZhY9LDZaKkHhQMu_Y,2610
152
153
  hud/shared/__init__.py,sha256=IPxPCqtPLguryN-nBq78Sakypw2bRiE2iHv3SXG8YRk,139
153
- hud/shared/exceptions.py,sha256=dhmt5KMciQ2fmV-yqXtTNO868k-WzuZae6w7dOk3M44,12144
154
+ hud/shared/exceptions.py,sha256=seDNhHX12UptJlQgmNwBFrUHm3sIBXg_-waqyvNgFQk,11856
154
155
  hud/shared/hints.py,sha256=aa1CtBzsxLHRSZBFCXH00uY-1j2_7WLxYFwAy-neibE,5086
155
156
  hud/shared/requests.py,sha256=HWrPp7nBSK4jhv9wqZdFiNrVaaxV0vWS8fcgGtoztBc,9479
156
157
  hud/shared/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
- hud/shared/tests/test_exceptions.py,sha256=bCKGqw2RwBmlGIMNpddzyfnWAOQwSIYB76r6iaBE2is,15761
158
+ hud/shared/tests/test_exceptions.py,sha256=02UiYzqWqEtbrHxazZ1SBrOJL7-IXxWmeaU7n1Zf904,15565
158
159
  hud/shared/tests/test_requests.py,sha256=nKFcSN1sjrOouVU2xik9lE5Wxapy3EWsO8iIXrM_Sts,9114
159
- hud/telemetry/__init__.py,sha256=uWiloBMXgEzPRsRIOpiSBhcTxJDyHfBqTg7qi8kxSTc,683
160
+ hud/telemetry/__init__.py,sha256=oYJ9fiaiwUGzfMH0qBixX74uSpAR_hyhl8Y-REjmNak,1396
161
+ hud/telemetry/async_context.py,sha256=SjL1VNFdXmy_4t_gIbZslQ1Ea5vYC9Ibv9xeqr9elXw,11139
160
162
  hud/telemetry/instrument.py,sha256=m3u6YK02PTk39Jr4L3se7l-cYyKx0maCaqf5Z5JqWNA,14096
161
- hud/telemetry/job.py,sha256=LjspT-mSqQO2DnFL6h0ZkCkeMrrpjAuFVZnTJiOaDek,11585
163
+ hud/telemetry/job.py,sha256=3W9KHLfBR13IYZvll496P9F6a9HUXCthFMY-MJLi7EA,13278
162
164
  hud/telemetry/replay.py,sha256=YW17s314s5Wy6Rl8MXHqg1FU8EF9_XcHBMJI0rrkyS4,2306
163
- hud/telemetry/trace.py,sha256=nUePF9LUtB4ao0832YoRxuakfGl8G1-NrxAyAXssnv4,4837
165
+ hud/telemetry/trace.py,sha256=9zNfLIHM1UwfkUX23LmqUcIGX2hPzfHz_x2_G-DY-NA,5049
164
166
  hud/telemetry/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
167
  hud/telemetry/tests/test_replay.py,sha256=eREc6qgSJDRT1pOPdyhiEoEJ9H2yT1ospaU1RvTKlvg,1328
166
- hud/telemetry/tests/test_trace.py,sha256=0rxR77CjcStat3ILA9QAswieOJ3J_386QmjmNDp34oA,2486
168
+ hud/telemetry/tests/test_trace.py,sha256=EJ5j8gbTTGdVm3NXhrC7r-5dwNSNfW0a-8-wxo-Jow4,2512
167
169
  hud/tools/__init__.py,sha256=i6lE0GxYcPnlLLd-55ryCCHo7o9anC4RfqkuYFXvzMQ,1009
168
170
  hud/tools/base.py,sha256=IxpnEHfxUtgz1k_w-09l65KKpDV3tQu4WdF3nZDsdwU,17854
169
171
  hud/tools/bash.py,sha256=1jl7cpB1ApGXn7Hy8zghJ2fXugEol6UeN0aYUSiM2EQ,5189
@@ -177,10 +179,10 @@ hud/tools/computer/__init__.py,sha256=QCdQG94XmKTCSOVkJI2e7NOP4bfpyAEkgEI9RQ-zbg
177
179
  hud/tools/computer/anthropic.py,sha256=oJfNMnjNFAn9mW1xY1nbWnTY2IqwFqdDR0mWSf8lu-s,17352
178
180
  hud/tools/computer/hud.py,sha256=v2VdLMsc8-3J4_k2vpcZRr_RJzXsxdVNs6IfbCL-WTc,16466
179
181
  hud/tools/computer/openai.py,sha256=QEsF45LWOHftDrAoIOnCFZZT1cL--s-ArSov5aluWb8,11189
180
- hud/tools/computer/qwen.py,sha256=6qtSRfxevkuot0YRZEmElvyexVI_M27vobKIar1b0OU,18475
182
+ hud/tools/computer/qwen.py,sha256=K8FZfy664fQW6DXxeWTr2AorKIGxr9h_AeL-0vEYws8,18578
181
183
  hud/tools/computer/settings.py,sha256=GUvi9y3JtA2u-l1dkGcMH8kHSKOPlxTOnHaG0ocv_gI,3347
182
184
  hud/tools/executors/__init__.py,sha256=jHxfus9SLhkL6YGtebR5RyKYyVAix3yu5EkUp2Q27Kg,732
183
- hud/tools/executors/base.py,sha256=VP2SiIEBSXvklnkasGxVuy-OmDMd9rjuxZh_YuUQH7A,14481
185
+ hud/tools/executors/base.py,sha256=mF_aiVoVkasoUi8hDyEtXMWbHKd4imKeFFJLJmQsjSY,14636
184
186
  hud/tools/executors/pyautogui.py,sha256=Gw3x2yw7x9xJ1uhYLxkOkArPnUQagUN1AZgBZ7YgbWo,22362
185
187
  hud/tools/executors/xdo.py,sha256=UF53DbMX-bRGiHd-O7cCJmCrVaYuP83xiJggER7HcDk,18137
186
188
  hud/tools/executors/tests/__init__.py,sha256=opFpGSH6cEqIZgt9izXd3Yt85pC7xkxiYmOZQTHf4AY,32
@@ -213,6 +215,7 @@ hud/utils/hud_console.py,sha256=ms2lXk3ZhYNmpGb0Dn902SKJBYfqo8Aa9DzkkC-xGSI,2359
213
215
  hud/utils/mcp.py,sha256=pMadd7A0DH6Y_aWywKU8jVYu2pRHGPEndV2ZQFrrj60,2888
214
216
  hud/utils/pretty_errors.py,sha256=WGeL4CTHtlA6KgPuV_JSX5l6H4-xbuTp6Y6tw1bkiFg,2430
215
217
  hud/utils/progress.py,sha256=suikwFM8sdSfkV10nAOEaInDhG4XKgOSvFePg4jSj1A,5927
218
+ hud/utils/task_tracking.py,sha256=QsW8UqVqyjz5tl_qi65SaulOz7Zc-8hQMbafpVESyeU,8113
216
219
  hud/utils/tasks.py,sha256=7i36ck84gz1GZxhn9jryMBvKgMmcvLVu1YH5n3Y23-c,4985
217
220
  hud/utils/telemetry.py,sha256=hrVIx2rUjSGyy9IVxTZ_3Jii83PiHjyFRd5ls2whimM,1863
218
221
  hud/utils/tool_shorthand.py,sha256=_haLgK3yazLR2Y0jlEHUUQjw9uZCxi9yTipAwdOAJ70,2148
@@ -222,10 +225,10 @@ hud/utils/tests/test_init.py,sha256=2QLQSGgyP9wJhOvPCusm_zjJad0qApOZi1BXpxcdHXQ,
222
225
  hud/utils/tests/test_mcp.py,sha256=0pUa16mL-bqbZDXp5NHBnt1gO5o10BOg7zTMHZ1DNPM,4023
223
226
  hud/utils/tests/test_progress.py,sha256=QSF7Kpi03Ff_l3mAeqW9qs1nhK50j9vBiSobZq7T4f4,7394
224
227
  hud/utils/tests/test_telemetry.py,sha256=5jl7bEx8C8b-FfFUko5pf4UY-mPOR-9HaeL98dGtVHM,2781
225
- hud/utils/tests/test_version.py,sha256=uQT6fdCFzf7lllZDCeSWGR5Rn30hErcUg843Zmw0rLs,160
228
+ hud/utils/tests/test_version.py,sha256=xbDp54OYQbjZS-l8yLfDbe9oY3L9FssclDNNznXVU2A,160
226
229
  hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
- hud_python-0.4.50.dist-info/METADATA,sha256=KE0_svesRl5c8jKKIEGoByqyaplSJNkmGj9dk4Jsan0,22275
228
- hud_python-0.4.50.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
229
- hud_python-0.4.50.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
230
- hud_python-0.4.50.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
231
- hud_python-0.4.50.dist-info/RECORD,,
230
+ hud_python-0.4.52.dist-info/METADATA,sha256=AeVDqBO6y829yPVcjpQv86phfPCcuuUTRhbuStw16go,22306
231
+ hud_python-0.4.52.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
232
+ hud_python-0.4.52.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
233
+ hud_python-0.4.52.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
234
+ hud_python-0.4.52.dist-info/RECORD,,