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

hud/server/server.py CHANGED
@@ -13,6 +13,7 @@ from typing import TYPE_CHECKING, Any
13
13
 
14
14
  import anyio
15
15
  from fastmcp.server.server import FastMCP, Transport
16
+ from starlette.responses import JSONResponse, Response
16
17
 
17
18
  from hud.server.low_level import LowLevelServerWithInit
18
19
 
@@ -20,6 +21,7 @@ if TYPE_CHECKING:
20
21
  from collections.abc import AsyncGenerator, Callable
21
22
 
22
23
  from mcp.shared.context import RequestContext
24
+ from starlette.requests import Request
23
25
 
24
26
  __all__ = ["MCPServer"]
25
27
 
@@ -163,7 +165,15 @@ class MCPServer(FastMCP):
163
165
  # Redirect stdout to stderr during initialization to prevent
164
166
  # any library prints from corrupting the MCP protocol
165
167
  with contextlib.redirect_stdout(sys.stderr):
166
- return self._initializer_fn(ctx)
168
+ # Check if function accepts ctx parameter
169
+ import inspect
170
+
171
+ sig = inspect.signature(self._initializer_fn)
172
+ if "ctx" in sig.parameters:
173
+ return self._initializer_fn(ctx)
174
+ else:
175
+ # Call without ctx for simpler usage
176
+ return self._initializer_fn()
167
177
  return None
168
178
 
169
179
  # Save the old server's handlers before replacing it
@@ -233,6 +243,23 @@ class MCPServer(FastMCP):
233
243
 
234
244
  _run_with_sigterm(_bootstrap)
235
245
 
246
+ async def run_async(
247
+ self,
248
+ transport: Transport | None = None,
249
+ show_banner: bool = True,
250
+ **transport_kwargs: Any,
251
+ ) -> None:
252
+ """Run the server with HUD enhancements."""
253
+ if transport is None:
254
+ transport = "stdio"
255
+
256
+ # Register HTTP helpers for HTTP transport
257
+ if transport in ("http", "sse"):
258
+ self._register_hud_helpers()
259
+ logger.info("Registered HUD helper endpoints at /hud/*")
260
+
261
+ await super().run_async(transport=transport, show_banner=show_banner, **transport_kwargs)
262
+
236
263
  # Tool registration helper -- appends BaseTool to FastMCP
237
264
  def add_tool(self, obj: Any, **kwargs: Any) -> None:
238
265
  from hud.tools.base import BaseTool
@@ -242,3 +269,132 @@ class MCPServer(FastMCP):
242
269
  return
243
270
 
244
271
  super().add_tool(obj, **kwargs)
272
+
273
+ # Override to keep original callables when used as a decorator
274
+ def tool(self, name_or_fn: Any = None, **kwargs: Any) -> Any: # type: ignore[override]
275
+ """Register a tool but return the original function in decorator form.
276
+
277
+ - Decorator usage (@mcp.tool, @mcp.tool("name"), @mcp.tool(name="name"))
278
+ registers with FastMCP and returns the original function for composition.
279
+ - Call-form (mcp.tool(fn, ...)) behaves the same but returns fn.
280
+ """
281
+ # Accept BaseTool / FastMCP Tool instances or callables in call-form
282
+ if name_or_fn is not None and not isinstance(name_or_fn, str):
283
+ try:
284
+ from hud.tools.base import BaseTool # lazy import
285
+ except Exception:
286
+ BaseTool = tuple() # type: ignore[assignment]
287
+ try:
288
+ from fastmcp.tools.tool import Tool as _FastMcpTool
289
+ except Exception:
290
+ _FastMcpTool = tuple() # type: ignore[assignment]
291
+
292
+ # BaseTool instance → add underlying FunctionTool
293
+ if isinstance(name_or_fn, BaseTool):
294
+ super().add_tool(name_or_fn.mcp, **kwargs)
295
+ return name_or_fn
296
+ # FastMCP Tool/FunctionTool instance → add directly
297
+ if isinstance(name_or_fn, _FastMcpTool):
298
+ super().add_tool(name_or_fn, **kwargs)
299
+ return name_or_fn
300
+ # Callable function → register via FastMCP.tool and return original fn
301
+ if callable(name_or_fn):
302
+ super().tool(name_or_fn, **kwargs)
303
+ return name_or_fn
304
+
305
+ # Decorator form: get FastMCP's decorator, register, then return original fn
306
+ base_decorator = super().tool(name_or_fn, **kwargs)
307
+
308
+ def _wrapper(fn: Any) -> Any:
309
+ base_decorator(fn)
310
+ return fn
311
+
312
+ return _wrapper
313
+
314
+ def _register_hud_helpers(self) -> None:
315
+ """Register HUD helper HTTP routes.
316
+
317
+ This adds:
318
+ - GET /hud - Overview of available endpoints
319
+ - GET /hud/tools - List all registered tools with their schemas
320
+ - GET /hud/resources - List all registered resources
321
+ - GET /hud/prompts - List all registered prompts
322
+ """
323
+
324
+ @self.custom_route("/hud/tools", methods=["GET"])
325
+ async def list_tools(request: Request) -> Response:
326
+ """List all registered tools with their names, descriptions, and schemas."""
327
+ tools = []
328
+ # _tools is a mapping of tool_name -> FunctionTool/Tool instance
329
+ for tool_key, tool in self._tool_manager._tools.items():
330
+ tool_data = {"name": tool_key}
331
+ try:
332
+ # Prefer converting to MCP model for consistent fields
333
+ mcp_tool = tool.to_mcp_tool()
334
+ tool_data["description"] = getattr(mcp_tool, "description", "")
335
+ if hasattr(mcp_tool, "inputSchema") and mcp_tool.inputSchema:
336
+ tool_data["input_schema"] = mcp_tool.inputSchema # type: ignore[assignment]
337
+ if hasattr(mcp_tool, "outputSchema") and mcp_tool.outputSchema:
338
+ tool_data["output_schema"] = mcp_tool.outputSchema # type: ignore[assignment]
339
+ except Exception:
340
+ # Fallback to direct attributes on FunctionTool
341
+ tool_data["description"] = getattr(tool, "description", "")
342
+ params = getattr(tool, "parameters", None)
343
+ if params:
344
+ tool_data["input_schema"] = params
345
+ tools.append(tool_data)
346
+
347
+ return JSONResponse({"server": self.name, "tools": tools, "count": len(tools)})
348
+
349
+ @self.custom_route("/hud/resources", methods=["GET"])
350
+ async def list_resources(request: Request) -> Response:
351
+ """List all registered resources."""
352
+ resources = []
353
+ for resource_key, resource in self._resource_manager._resources.items():
354
+ resource_data = {
355
+ "uri": resource_key,
356
+ "name": resource.name,
357
+ "description": resource.description,
358
+ "mimeType": resource.mime_type,
359
+ }
360
+ resources.append(resource_data)
361
+
362
+ return JSONResponse(
363
+ {"server": self.name, "resources": resources, "count": len(resources)}
364
+ )
365
+
366
+ @self.custom_route("/hud/prompts", methods=["GET"])
367
+ async def list_prompts(request: Request) -> Response:
368
+ """List all registered prompts."""
369
+ prompts = []
370
+ for prompt_key, prompt in self._prompt_manager._prompts.items():
371
+ prompt_data = {
372
+ "name": prompt_key,
373
+ "description": prompt.description,
374
+ }
375
+ # Check if it has arguments
376
+ if hasattr(prompt, "arguments") and prompt.arguments:
377
+ prompt_data["arguments"] = [
378
+ {"name": arg.name, "description": arg.description, "required": arg.required}
379
+ for arg in prompt.arguments
380
+ ]
381
+ prompts.append(prompt_data)
382
+
383
+ return JSONResponse({"server": self.name, "prompts": prompts, "count": len(prompts)})
384
+
385
+ @self.custom_route("/hud", methods=["GET"])
386
+ async def hud_info(request: Request) -> Response:
387
+ """Show available HUD helper endpoints."""
388
+ base_url = str(request.base_url).rstrip("/")
389
+ return JSONResponse(
390
+ {
391
+ "name": "HUD MCP Development Helpers",
392
+ "server": self.name,
393
+ "endpoints": {
394
+ "tools": f"{base_url}/hud/tools",
395
+ "resources": f"{base_url}/hud/resources",
396
+ "prompts": f"{base_url}/hud/prompts",
397
+ },
398
+ "description": "These endpoints help you inspect your MCP server during development.", # noqa: E501
399
+ }
400
+ )
hud/settings.py CHANGED
@@ -1,7 +1,10 @@
1
1
  from __future__ import annotations
2
2
 
3
+ from pathlib import Path
4
+
3
5
  from pydantic import Field
4
6
  from pydantic_settings import BaseSettings, SettingsConfigDict
7
+ from pydantic_settings.sources import DotEnvSettingsSource, PydanticBaseSettingsSource
5
8
 
6
9
 
7
10
  class Settings(BaseSettings):
@@ -14,6 +17,41 @@ class Settings(BaseSettings):
14
17
 
15
18
  model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="allow")
16
19
 
20
+ @classmethod
21
+ def settings_customise_sources(
22
+ cls,
23
+ settings_cls: type[BaseSettings],
24
+ init_settings: PydanticBaseSettingsSource,
25
+ env_settings: PydanticBaseSettingsSource,
26
+ dotenv_settings: PydanticBaseSettingsSource,
27
+ file_secret_settings: PydanticBaseSettingsSource,
28
+ ) -> tuple[PydanticBaseSettingsSource, ...]:
29
+ """
30
+ Customize settings source precedence to include a user-level env file.
31
+
32
+ Precedence (highest to lowest):
33
+ - init_settings (explicit kwargs)
34
+ - env_settings (process environment)
35
+ - dotenv_settings (project .env)
36
+ - user_dotenv_settings (~/.hud/.env) ← added
37
+ - file_secret_settings
38
+ """
39
+
40
+ user_env_path = Path.home() / ".hud" / ".env"
41
+ user_dotenv_settings = DotEnvSettingsSource(
42
+ settings_cls,
43
+ env_file=user_env_path,
44
+ env_file_encoding="utf-8",
45
+ )
46
+
47
+ return (
48
+ init_settings,
49
+ env_settings,
50
+ dotenv_settings,
51
+ user_dotenv_settings,
52
+ file_secret_settings,
53
+ )
54
+
17
55
  hud_telemetry_url: str = Field(
18
56
  default="https://telemetry.hud.so/v3/api",
19
57
  description="Base URL for the HUD API",
hud/shared/hints.py CHANGED
@@ -37,7 +37,7 @@ HUD_API_KEY_MISSING = Hint(
37
37
  title="HUD API key required",
38
38
  message="Missing or invalid HUD_API_KEY.",
39
39
  tips=[
40
- "Set HUD_API_KEY environment variable",
40
+ "Set HUD_API_KEY in your environment or run: hud set HUD_API_KEY=your-key-here",
41
41
  "Get a key at https://app.hud.so",
42
42
  "Check for whitespace or truncation",
43
43
  ],
@@ -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.34"
8
+ assert hud.__version__ == "0.4.36"
@@ -10,7 +10,8 @@ def _is_call_like(obj: Any) -> bool:
10
10
  return True
11
11
  if len(obj) == 1:
12
12
  _, v = next(iter(obj.items()))
13
- return isinstance(v, dict)
13
+ if isinstance(v, dict):
14
+ return "name" in v or (len(v) == 1 and isinstance(next(iter(v.values())), dict))
14
15
  return False
15
16
 
16
17
 
@@ -19,9 +20,9 @@ def _to_call_dict(obj: Any) -> Any:
19
20
 
20
21
  Rules:
21
22
  - If obj is a dict with {name, arguments}: return {name, arguments: recurse(arguments)}
22
- - Else if obj is a single-key dict {k: v}: return {name: k, arguments: recurse(v)}
23
+ - Else if obj is a single-key dict {k: v} where v looks call-like: return {name: k, arguments: recurse(v)}
23
24
  - Else: return obj unchanged (leaf arguments/value)
24
- """
25
+ """ # noqa: E501
25
26
  if isinstance(obj, dict):
26
27
  if "name" in obj and "arguments" in obj:
27
28
  args = obj.get("arguments")
@@ -31,8 +32,10 @@ def _to_call_dict(obj: Any) -> Any:
31
32
  return {"name": obj.get("name"), "arguments": args}
32
33
  if len(obj) == 1:
33
34
  k, v = next(iter(obj.items()))
34
- if isinstance(v, dict):
35
+ # Only convert single-key dicts if the value looks like it could be a call
36
+ if isinstance(v, dict) and _is_call_like(v):
35
37
  return {"name": k, "arguments": _to_call_dict(v)}
38
+ # Otherwise, leave it as-is (this is the innermost arguments dict)
36
39
  return obj
37
40
  return obj
38
41
 
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.34"
7
+ __version__ = "0.4.36"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.4.34
3
+ Version: 0.4.36
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
@@ -40,7 +40,7 @@ Requires-Dist: datasets>=2.14.0
40
40
  Requires-Dist: httpx<1,>=0.23.0
41
41
  Requires-Dist: hud-fastmcp-python-sdk>=0.1.2
42
42
  Requires-Dist: hud-mcp-python-sdk>=3.13.2
43
- Requires-Dist: hud-mcp-use-python-sdk>=2.3.16
43
+ Requires-Dist: hud-mcp-use-python-sdk==2.3.19
44
44
  Requires-Dist: numpy>=1.24.0
45
45
  Requires-Dist: openai
46
46
  Requires-Dist: opentelemetry-api>=1.34.1
@@ -50,8 +50,8 @@ Requires-Dist: opentelemetry-sdk>=1.34.1
50
50
  Requires-Dist: pathspec>=0.12.1
51
51
  Requires-Dist: pillow>=11.1.0
52
52
  Requires-Dist: prompt-toolkit==3.0.51
53
- Requires-Dist: pydantic-settings<3,>=2
54
- Requires-Dist: pydantic<3,>=2
53
+ Requires-Dist: pydantic-settings<3,>=2.2
54
+ Requires-Dist: pydantic<3,>=2.6
55
55
  Requires-Dist: questionary==2.1.0
56
56
  Requires-Dist: rich>=13.0.0
57
57
  Requires-Dist: toml>=0.10.2
@@ -59,7 +59,9 @@ Requires-Dist: typer>=0.9.0
59
59
  Requires-Dist: watchfiles>=0.21.0
60
60
  Requires-Dist: wrapt>=1.14.0
61
61
  Provides-Extra: agent
62
+ Requires-Dist: aiodocker>=0.24.0; extra == 'agent'
62
63
  Requires-Dist: dotenv>=0.9.9; extra == 'agent'
64
+ Requires-Dist: inspect-ai>=0.3.80; extra == 'agent'
63
65
  Requires-Dist: ipykernel; extra == 'agent'
64
66
  Requires-Dist: ipython<9; extra == 'agent'
65
67
  Requires-Dist: jupyter-client; extra == 'agent'
@@ -67,8 +69,21 @@ Requires-Dist: jupyter-core; extra == 'agent'
67
69
  Requires-Dist: langchain; extra == 'agent'
68
70
  Requires-Dist: langchain-anthropic; extra == 'agent'
69
71
  Requires-Dist: langchain-openai; extra == 'agent'
72
+ Requires-Dist: pillow>=11.1.0; extra == 'agent'
73
+ Requires-Dist: playwright; extra == 'agent'
74
+ Requires-Dist: pyautogui>=0.9.54; extra == 'agent'
75
+ Requires-Dist: pyright==1.1.401; extra == 'agent'
76
+ Requires-Dist: pytest-asyncio; extra == 'agent'
77
+ Requires-Dist: pytest-cov; extra == 'agent'
78
+ Requires-Dist: pytest-mock; extra == 'agent'
79
+ Requires-Dist: pytest<9,>=8.1.1; extra == 'agent'
80
+ Requires-Dist: ruff>=0.11.8; extra == 'agent'
81
+ Requires-Dist: setuptools; extra == 'agent'
82
+ Requires-Dist: textdistance<5,>=4.5.0; extra == 'agent'
70
83
  Provides-Extra: agents
84
+ Requires-Dist: aiodocker>=0.24.0; extra == 'agents'
71
85
  Requires-Dist: dotenv>=0.9.9; extra == 'agents'
86
+ Requires-Dist: inspect-ai>=0.3.80; extra == 'agents'
72
87
  Requires-Dist: ipykernel; extra == 'agents'
73
88
  Requires-Dist: ipython<9; extra == 'agents'
74
89
  Requires-Dist: jupyter-client; extra == 'agents'
@@ -76,6 +91,17 @@ Requires-Dist: jupyter-core; extra == 'agents'
76
91
  Requires-Dist: langchain; extra == 'agents'
77
92
  Requires-Dist: langchain-anthropic; extra == 'agents'
78
93
  Requires-Dist: langchain-openai; extra == 'agents'
94
+ Requires-Dist: pillow>=11.1.0; extra == 'agents'
95
+ Requires-Dist: playwright; extra == 'agents'
96
+ Requires-Dist: pyautogui>=0.9.54; extra == 'agents'
97
+ Requires-Dist: pyright==1.1.401; extra == 'agents'
98
+ Requires-Dist: pytest-asyncio; extra == 'agents'
99
+ Requires-Dist: pytest-cov; extra == 'agents'
100
+ Requires-Dist: pytest-mock; extra == 'agents'
101
+ Requires-Dist: pytest<9,>=8.1.1; extra == 'agents'
102
+ Requires-Dist: ruff>=0.11.8; extra == 'agents'
103
+ Requires-Dist: setuptools; extra == 'agents'
104
+ Requires-Dist: textdistance<5,>=4.5.0; extra == 'agents'
79
105
  Provides-Extra: dev
80
106
  Requires-Dist: aiodocker>=0.24.0; extra == 'dev'
81
107
  Requires-Dist: dotenv>=0.9.9; extra == 'dev'
@@ -100,14 +126,6 @@ Requires-Dist: setuptools; extra == 'dev'
100
126
  Requires-Dist: textdistance<5,>=4.5.0; extra == 'dev'
101
127
  Provides-Extra: rl
102
128
  Requires-Dist: bitsandbytes>=0.41.0; (sys_platform == 'linux') and extra == 'rl'
103
- Requires-Dist: dotenv>=0.9.9; extra == 'rl'
104
- Requires-Dist: ipykernel; extra == 'rl'
105
- Requires-Dist: ipython<9; extra == 'rl'
106
- Requires-Dist: jupyter-client; extra == 'rl'
107
- Requires-Dist: jupyter-core; extra == 'rl'
108
- Requires-Dist: langchain; extra == 'rl'
109
- Requires-Dist: langchain-anthropic; extra == 'rl'
110
- Requires-Dist: langchain-openai; extra == 'rl'
111
129
  Requires-Dist: liger-kernel>=0.5.0; (sys_platform == 'linux') and extra == 'rl'
112
130
  Requires-Dist: peft>=0.17.1; extra == 'rl'
113
131
  Requires-Dist: vllm==0.10.1.1; extra == 'rl'
@@ -1,39 +1,39 @@
1
1
  hud/__init__.py,sha256=JMDFUE1pP0J1Xl_miBdt7ERvoffZmTzSFe8yxz512A8,552
2
2
  hud/__main__.py,sha256=YR8Dq8OhINOsVfQ55PmRXXg4fEK84Rt_-rMtJ5rvhWo,145
3
- hud/settings.py,sha256=sMS31iW1m-5VpWk-Blhi5-obLcUA0fwxWE1GgJz-vqU,2708
3
+ hud/settings.py,sha256=disObWa-DgXzoDcCDp3y1dTPaNsbR0IvoMJL9Eg4zyo,3947
4
4
  hud/types.py,sha256=RtNM2fPU1NAujTmZLOydQIU-ybk3gVRCoJ2TM2hJOlw,10752
5
- hud/version.py,sha256=yDsOrKQyUBp8e8KHUcrT2U56qKvsk4D-58XSWaUqJMU,105
5
+ hud/version.py,sha256=QvD3Kxp6mTnvL6PRc-jWAfX1KqPy6dGRkOd3_bXmXhI,105
6
6
  hud/agents/__init__.py,sha256=UoIkljWdbq4bM0LD-mSaw6w826EqdEjOk7r6glNYwYQ,286
7
7
  hud/agents/base.py,sha256=_u1zR3gXzZ1RlTCUYdMcvgHqdJBC4-AB1lZt0yBx8lg,35406
8
- hud/agents/claude.py,sha256=wHiw8iAnjnRmZyKRKcOhagCDQMhz9Z6rlSBWqH1X--M,15781
8
+ hud/agents/claude.py,sha256=TGhm5gE2ltINDAdEsDxKuT9iGMQ5G87R6kmabU3KPt8,16101
9
9
  hud/agents/grounded_openai.py,sha256=U-FHjB2Nh1_o0gmlxY5F17lWJ3oHsNRIB2a7z-IKB64,11231
10
10
  hud/agents/langchain.py,sha256=1EgCy8jfjunsWxlPC5XfvfLS6_XZVrIF1ZjtHcrvhYw,9584
11
- hud/agents/openai.py,sha256=ovARRWNuHqKkZ2Q_OCYSVCIZckrh8XY2jUB2p2x1m88,14259
11
+ hud/agents/openai.py,sha256=O1xV1h1l-W8lmnmXqTYr5CwnmnaniMqOxAZbl2CTTng,14576
12
12
  hud/agents/openai_chat_generic.py,sha256=7n7timn3fvNRnL2xzWyOTeNTchej2r9cAL1mU6YnFdY,11605
13
13
  hud/agents/misc/__init__.py,sha256=BYi4Ytp9b_vycpZFXnr5Oyw6ncKLNNGml8Jrb7bWUb4,136
14
14
  hud/agents/misc/response_agent.py,sha256=uMuRDkz5QgaMQliNzBRepond5sb7KyqIiKm3LstjVnw,3753
15
15
  hud/agents/tests/__init__.py,sha256=W-O-_4i34d9TTyEHV-O_q1Ai1gLhzwDaaPo02_TWQIY,34
16
16
  hud/agents/tests/test_base.py,sha256=bDznxQDv2ickRkw98joH9zfuZT6ItHbmWvQ67iboa4g,28733
17
- hud/agents/tests/test_claude.py,sha256=wqEKlzEvx8obz1sSm4NY0j-Zyt1qWNfDOmRqYIuAEd0,13069
17
+ hud/agents/tests/test_claude.py,sha256=0nZnfsbGoECvsLPdmaRnc9jVmrehVvc3kxeyiCQI2Cc,13807
18
18
  hud/agents/tests/test_client.py,sha256=uikgh6yhjPPX2RBU4XJQMz1mNox9uXjuwsP8t93id18,13337
19
19
  hud/agents/tests/test_grounded_openai_agent.py,sha256=VK8lUvHIjWicMX00VKPE-FZyjiJqTEhb80MuRRa9fVc,5437
20
- hud/agents/tests/test_openai.py,sha256=1S5IZuc3O3moSp70gqVGjc6m-_b49dCfz2fgX5IGvl4,7036
21
- hud/cli/__init__.py,sha256=xL1l5MfdWubd9AWe-cpW64WFS1SVsTgI8fdNdTZhIvs,40259
20
+ hud/agents/tests/test_openai.py,sha256=Npbdr0acgLExGLbrleXze-k3w9LHfmqzQjPk9TnjN68,7620
21
+ hud/cli/__init__.py,sha256=_bJymobNdf_fHqAjhoC1J5t7lJwo6WDj969SJIIXElo,44908
22
22
  hud/cli/__main__.py,sha256=fDH7XITyuDITwSDIVwRso06aouADO0CzTHKqp5TOwJE,143
23
23
  hud/cli/analyze.py,sha256=4u5oYfJMquOjT9PzzRTYVcTZDxDi0ilNP_g532_hpOU,14716
24
- hud/cli/build.py,sha256=X8ykInqvDpsBU0rOU_x_sbp27YwCd160hplZLcwZFEg,18479
24
+ hud/cli/build.py,sha256=Zpe9LxQJ3MhmWxpbyQaheEc16kjX87UApyvwG8yxZ00,18781
25
25
  hud/cli/clone.py,sha256=AwVDIuhr8mHb1oT2Af2HrD25SiTdwATpE6zd93vzLgA,6099
26
26
  hud/cli/debug.py,sha256=jtFW8J5F_3rhq1Hf1_SkJ7aLS3wjnyIs_LsC8k5cnzc,14200
27
- hud/cli/dev.py,sha256=56vQdH9oe_XGnOcRcFbNIsLEoBnpCl1eANlRFUeddHQ,31734
28
- hud/cli/eval.py,sha256=W_eY4uoIQwHcSCvxNaQeRfWC10uQA1UhBWiNQzQPuXM,22694
27
+ hud/cli/dev.py,sha256=VXNFDQjdsn6SLNYyNM3SsQH_vJ9QdfZo3COugmGvuJk,30670
28
+ hud/cli/eval.py,sha256=Gyk-mJKRGeDBA_77hszsyHXcZDbDrWhW8pJZHwA3uQM,22795
29
29
  hud/cli/get.py,sha256=sksKrdzBGZa7ZuSoQkc0haj-CvOGVSSikoVXeaUd3N4,6274
30
- hud/cli/init.py,sha256=McZwpxZMXD-It_PXINCUy-SwUaPiQ7jdpSU5-F-caO8,19671
30
+ hud/cli/init.py,sha256=xReks9TF77kjjQKFs2l7iJ3AHUqmhbRkFJokyPitzSY,9795
31
31
  hud/cli/list_func.py,sha256=EVi2Vc3Lb3glBNJxFx4MPnZknZ4xmuJz1OFg_dc8a_E,7177
32
- hud/cli/pull.py,sha256=Vd1l1-IwskyACzhtC8Df1SYINUZEYmFxrLl0s9cNN6c,12151
33
- hud/cli/push.py,sha256=dmjF-hGlMfq73tquDxsTuM9t50zrkE9PFJqW5vRmYSw,18380
32
+ hud/cli/pull.py,sha256=XGEZ8n60tbzLQP_8d9h7XYmzyCW0e2-Rkr3_tLG7jvw,12449
33
+ hud/cli/push.py,sha256=0CXTGq0A4sQvWabd_EIPstqrlX7h6NxxjMNlktFoSwY,18486
34
34
  hud/cli/remove.py,sha256=8vGQyXDqgtjz85_vtusoIG8zurH4RHz6z8UMevQRYM4,6861
35
35
  hud/cli/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- hud/cli/flows/tasks.py,sha256=R_zeIx0pvaN4CYYuNlIaemMegaT123FGAvDUjDDfFGo,8924
36
+ hud/cli/flows/tasks.py,sha256=1WICQwHc1b3x7IcQZaC42f5ko6F6SsQ9F8-WslAaAh8,9021
37
37
  hud/cli/rl/__init__.py,sha256=BeqXdmzPwVBptz4j796XJRxSC5B_9tQta5aKd0jDMvo,5000
38
38
  hud/cli/rl/config.py,sha256=iNhCxotM33OEiP9gqPvn8A_AxrBVe6fcFCQTvc13xzA,2884
39
39
  hud/cli/rl/display.py,sha256=hqJVGmO9csYinladhZwjF-GMvppYWngxDHajTyIJ_gM,5214
@@ -41,13 +41,13 @@ hud/cli/rl/gpu.py,sha256=peXS-NdUF5RyuSs0aZoCzGLboneBUpCy8f9f99WMrG0,2009
41
41
  hud/cli/rl/gpu_utils.py,sha256=H5ckPwgj5EVP3yJ5eVihR5R7Y6Gp6pt8ZUfWCCwcLG4,11072
42
42
  hud/cli/rl/local_runner.py,sha256=GssmDgCxGfFsi31aFj22vwCiwa9ELllEwQjbActxSXY,21514
43
43
  hud/cli/rl/presets.py,sha256=DzOO82xL5QyzdVtlX-Do1CODMvDz9ILMPapjU92jcZg,3051
44
- hud/cli/rl/remote_runner.py,sha256=JvLOf3X-a6svz_aoOKuuaWzoei6Nrp1ShHeg2KxYk7U,13725
44
+ hud/cli/rl/remote_runner.py,sha256=C2RrM4tgg-C1eNlW8QuRXWQ8bARIDFdWU1tGGJ4981E,13772
45
45
  hud/cli/rl/rl_api.py,sha256=INJobvSa50ccR037u_GPsDa_9WboWyNwqEaoh9hcXj0,4306
46
46
  hud/cli/rl/vllm.py,sha256=Gq_M6KsQArGz7FNIdemuM5mk16mu3xe8abpO2GCCuOE,6093
47
47
  hud/cli/tests/__init__.py,sha256=ZrGVkmH7DHXGqOvjOSNGZeMYaFIRB2K8c6hwr8FPJ-8,68
48
48
  hud/cli/tests/test_analyze.py,sha256=inbRvi7KJKoMYrcqXU6RSayoh7mAOGVrRknm6BLQFes,11055
49
49
  hud/cli/tests/test_analyze_metadata.py,sha256=RtJ5PiOWu-AyOijLyZZwNfYazqwSMvtDS0krMMw0mak,9943
50
- hud/cli/tests/test_build.py,sha256=9B_-jkCDMsNNn087SWbPEJVsbD_D1u5Mv1gBIySPuhU,14409
50
+ hud/cli/tests/test_build.py,sha256=YbI8ICGgV7sYwkoE_sUpcf-ItTAB-i6vYAqziML68Mg,13552
51
51
  hud/cli/tests/test_cli_init.py,sha256=_H0bAn5_skJ91Zj8P5P_wtZoPWvrN7jMhPZvmnnf0n8,11289
52
52
  hud/cli/tests/test_cli_main.py,sha256=0wMho9p9NcGjp0jLiUtCQh_FYdbMaCJtSY3sBbSgPwA,697
53
53
  hud/cli/tests/test_clone.py,sha256=oC2mf-41QQVc7ODJkjrWbVPNMB2fDW3nZ6jY6w93gvQ,4458
@@ -55,20 +55,23 @@ hud/cli/tests/test_cursor.py,sha256=ZfxAFKJesJ3UV1JBoASSRlv6BXbpvVEk_pjxUg1jnf4,
55
55
  hud/cli/tests/test_debug.py,sha256=bQ76d_0HJfthHBSECmGNv499ZE57CIOKsanMlNfNHGk,18036
56
56
  hud/cli/tests/test_list_func.py,sha256=pkG4TtJJBMi9Xk8KBNFBlGcam7kwz01IRsjfQBL2PxM,10700
57
57
  hud/cli/tests/test_main_module.py,sha256=6RhwCcdRSN2uQV6-adti40ZcLd3u-mPR1ai6wL64c6Y,1105
58
- hud/cli/tests/test_mcp_server.py,sha256=wLFkDOR22FuBe3kIdYeLG7H81HHiorKB8kXRubftLpU,4316
58
+ hud/cli/tests/test_mcp_server.py,sha256=37rlL4aTDl1rFmDJOaHerIiK2NfiDktWsqgzkD1ZXnQ,3921
59
59
  hud/cli/tests/test_pull.py,sha256=ToSJrlfn13pYnrWWt3W_S7qFFjwvoZC2UisrZVrxujo,13155
60
60
  hud/cli/tests/test_push.py,sha256=V71KP5gEDo7Z9ccFpjidBjYliFg_KCfnZoZYbBXjguE,12875
61
61
  hud/cli/tests/test_registry.py,sha256=-o9MvQTcBElteqrg0XW8Bg59KrHCt88ZyPqeaAlyyTg,9539
62
62
  hud/cli/tests/test_utils.py,sha256=_oa2lTvgqJxXe0Mtovxb8x-Sug-f6oJJKvG67r5pFtA,13474
63
63
  hud/cli/utils/__init__.py,sha256=L6s0oNzY2LugGp9faodCPnjzM-ZUorUH05-HmYOq5hY,35
64
+ hud/cli/utils/config.py,sha256=AnsN6FEa8V3jg3EWaqUJN38-UuYC6tVZxPfBb_5LFBs,2652
64
65
  hud/cli/utils/cursor.py,sha256=fy850p0rVp5k_1wwOCI7rK1SggbselJrywFInSQ2gio,3009
65
- hud/cli/utils/docker.py,sha256=-nAj7wRRIilbezG0-pCHA2-tleoqUJN9sDXHxvMWilU,7331
66
- hud/cli/utils/environment.py,sha256=y_c0ohxWrM054ZKid0KOQPzs2M2vh985AsumPG2wTPc,4282
67
- hud/cli/utils/interactive.py,sha256=tcwp9HkAyr2_GiM3Raba4h0P_OgCksQKram80BucPo4,16546
66
+ hud/cli/utils/docker.py,sha256=oGVzPfp0Rn89o9d6tgSEziKy9GXFrYaWn_mjBmGRHe4,6326
67
+ hud/cli/utils/environment.py,sha256=EfATQyAz8Jybj4N9QNaaADUrpiZ2JMp2elQYnAG9gU8,4371
68
+ hud/cli/utils/interactive.py,sha256=sHhTjaImxlwlZ5_DTXb23Jwrjy5oJ7diB-8duhHbImU,16647
69
+ hud/cli/utils/local_runner.py,sha256=jnPFoJu3sCq65LSUapKCkakdlEuz__96oJU_FfOYtEg,6542
68
70
  hud/cli/utils/logging.py,sha256=DyOWuzZUg6HeKCqfs6ufb703XS3bW4G2pzaXVAvDqvA,9018
69
- hud/cli/utils/metadata.py,sha256=G9UvP9zclnu-oVvYg3yc4Sr0TH88jx4XV1Ai8f5CG6g,7870
71
+ hud/cli/utils/metadata.py,sha256=niAS6gcVel0j4ceL3L3IBuDpyNcNKGTwzW6320usToQ,7937
72
+ hud/cli/utils/package_runner.py,sha256=1TE_iahDFjPZ4GydhpD8K-bV8bHSzL4iY3uE42Cv7nQ,10149
70
73
  hud/cli/utils/registry.py,sha256=p6IaWmhUbf0Yh6aGa3jIPoSFT2uJPTOVBLS0jpKDUqc,4376
71
- hud/cli/utils/remote_runner.py,sha256=50Fqp7LG9dwiDyNM-LspNiKrSHmEo00C_Iuu5jg9mXU,9407
74
+ hud/cli/utils/remote_runner.py,sha256=OOSJ6wU_gS_hJaURDfxZcyekjIIwPQKGN_Pq64tin3E,9505
72
75
  hud/cli/utils/runner.py,sha256=7HxVGa6OTflQnO0FSuRs273wnAmbm7cFRU9RTGL3-Wo,4390
73
76
  hud/cli/utils/server.py,sha256=EE5DJ0RAmXCEjMcZycpAsAxxCj6sOdIsXqPh38kK2ew,7416
74
77
  hud/cli/utils/tasks.py,sha256=bpH2mQkfgKUpgh1J0NtVxMxcM1jDZk2GAAPQMcqAUz4,826
@@ -76,7 +79,7 @@ hud/clients/README.md,sha256=XNE3mch95ozDgVqfwCGcrhlHY9CwT1GKfNANNboowto,3826
76
79
  hud/clients/__init__.py,sha256=N5M_gZv4nP7dLRwpAiaqqaxyaLieGW6397FszeG7JGw,364
77
80
  hud/clients/base.py,sha256=Q4iJ78wxDYj_RTnj000ILetvhxZpGX2mubcfGzp3JYw,14207
78
81
  hud/clients/fastmcp.py,sha256=KJGi8bmds0Q6rHnkTXb_Hw9ZqWmSo0OfjW05SSuyEJU,9182
79
- hud/clients/mcp_use.py,sha256=DgQ5q868jutH5aiDu3NVNePPqlOI_0iTWKmIuqCEJQ0,13559
82
+ hud/clients/mcp_use.py,sha256=WE_99LxilPnfYo2yXsxQOl3Rt8eNyYuvvIycVzpUzk0,14627
80
83
  hud/clients/tests/__init__.py,sha256=sKOtJFFa4mDIXh1U6O8ZUHjigE8CiRMQ2PzJTIBZuVE,33
81
84
  hud/clients/tests/test_client_integration.py,sha256=kohU6jfCNfwSnAushHeB1_CmDlRfQc7VBL0GEdJYSeI,4198
82
85
  hud/clients/tests/test_fastmcp.py,sha256=4q3TzDjuieTZa89taiNJIrzbUncNkYOG4MaubypA21k,13030
@@ -87,8 +90,8 @@ hud/clients/utils/mcp_use_retry.py,sha256=knsgOTR3YFXshmPFfPQE6K6C5GpR1ZBJe2J7oz
87
90
  hud/clients/utils/retry.py,sha256=mMs2T_mAlb8AYhSqMR4AmCw7838gqCC4mdG3zjMAYM4,5744
88
91
  hud/clients/utils/retry_transport.py,sha256=Rsq25eiKKt_pM1bas78QEZvO0illK97X_3opmaS3A3w,6809
89
92
  hud/datasets/__init__.py,sha256=-g05iDy76CU4JiRHjKBBhgh3STtiIjmWhUfPqgf5hJE,697
90
- hud/datasets/parallel.py,sha256=m7_z2QwjaRuM9gJFYyiPIJUwrlTxZSvFMAd9L2IDZEo,25772
91
- hud/datasets/runner.py,sha256=2KhGEDzYW_qrSCaNJmsKqiAYZE_-h5VaQ7kv8rSe7Fw,4687
93
+ hud/datasets/parallel.py,sha256=j-Zk3-aqGHxiqqvt7zQBma9jrG-prd72iVMQ_aZgRvk,25908
94
+ hud/datasets/runner.py,sha256=1ajF7u7lGepIwvm4x0DwozJ2703KxYM52rAfH0oNB00,4884
92
95
  hud/datasets/utils.py,sha256=hdZfjWH5l3FVJaWBSHEEpjujAG7DqEam_vHgslL8MLs,4279
93
96
  hud/misc/__init__.py,sha256=m_pprQQ-G-Y0Sd0NEiR8MtAMbElnuFZ2OWT8TXrw7c4,43
94
97
  hud/misc/claude_plays_pokemon.py,sha256=IthAkjDVr2Q-GNvX-QLJyMzN7-0pHqqJbagGNv2m7yo,10453
@@ -100,7 +103,7 @@ hud/native/tests/test_native_init.py,sha256=Z-2dinbQYEkrbCcfBrBOLGdpXtWWOtkfPzp7
100
103
  hud/otel/__init__.py,sha256=ii17ayoWiS5vAhA7UAmZ8TkmP52gs2pWyHsD46-uYbE,1003
101
104
  hud/otel/collector.py,sha256=jLZymZ8r7xt2VDuWexfbnT7PY1-0aiyLMgjBy8KDY1M,4497
102
105
  hud/otel/config.py,sha256=mricuAmtFd1yIfOYKw2aHI-u4piku0GXHWv6hjsWQLM,6806
103
- hud/otel/context.py,sha256=C9MvO99cRSNNDEDC7ehO3eoTPnb6J7AemUYvEp57yEU,17774
106
+ hud/otel/context.py,sha256=q7YIBb95UDMJvir8ds--YLpjW5dpAilntCtwsMJdZro,19124
104
107
  hud/otel/exporters.py,sha256=RLAjWa8b2DJEU21740Idq4fmeIuabLEqGGUspcFDcH4,14331
105
108
  hud/otel/instrumentation.py,sha256=fsFG9W89RdewFDxWKN9Ft4GUb7WbIKpfucTc16WxaZU,5093
106
109
  hud/otel/processors.py,sha256=-gGRbwifplcExDQBLfx_9tqWreDImULJNcENgO9q7VU,4700
@@ -109,7 +112,7 @@ hud/otel/tests/test_processors.py,sha256=np0R4ssd9j6LJSJykJ5bNjl0POwNYNhgb7BqOZH
109
112
  hud/rl/README.md,sha256=uFRpNFaEY8paq9k1C4miF7AGnbqHTGAsPmpcf9JIEeA,1189
110
113
  hud/rl/__init__.py,sha256=yYL7U1WV6L3mr3Hig48-4lhnryTaWj4nCXm4lG5vrYI,25
111
114
  hud/rl/actor.py,sha256=n2f2BI9IOK__x7Seirq6EQI0yyicMBYd5BjPsc4T9rQ,6946
112
- hud/rl/buffer.py,sha256=FWGivdJ0YEYZZPK0bUyvjiKparaUgiBE9GzQLZj8kcA,15372
115
+ hud/rl/buffer.py,sha256=z47HOjOBJx3umUzzUfdtq_N4ZoJ8FMBPkX8YQKBtd3A,15457
113
116
  hud/rl/chat_template.jinja,sha256=XTdzI8oFGEcSA-exKxyHaprwRDmX5Am1KEb0VxvUc6U,4965
114
117
  hud/rl/config.py,sha256=PAKYPCsKl8yg_j3gJSE5SJUgLM7j0lFy0K_Vt4-otDM,5384
115
118
  hud/rl/distributed.py,sha256=8avhrb0lHYkhW22Z7MfkqSnlczWj5jMrUMEtkcoCf74,2473
@@ -119,19 +122,19 @@ hud/rl/types.py,sha256=lrLKo7iaqodYth2EyeuOQfLiuzXfYM2eJjPmpObrD7c,3965
119
122
  hud/rl/utils.py,sha256=IsgVUUibxnUzb32a4mu1sYrgJC1CwoG9E-Dd5y5VDOA,19115
120
123
  hud/rl/vllm_adapter.py,sha256=O2_TdTGIyNr9zRGhCw18XWjOKYzEM3049wvlyL2x0sc,4751
121
124
  hud/rl/tests/__init__.py,sha256=PXmD3Gs6xOAwaYKb4HnwZERDjX05N1QF-aU6ya0dBtE,27
122
- hud/rl/tests/test_learner.py,sha256=_xSr1UjH6rnvSA4MP232AYxrju9V1lHTBn7Z_Gi824o,6818
125
+ hud/rl/tests/test_learner.py,sha256=LfTwB626gWurYfZv91wk8ASETBNqrLh9i_GCMP4CB3E,6834
123
126
  hud/rl/utils/start_vllm_server.sh,sha256=ThPokrLK_Qm_uh916fHXXBfMlw1TC97P57-AEI5MuOc,910
124
127
  hud/samples/__init__.py,sha256=wgcN1IOLHhR4C1fFKqyvA7Yl9lJhJFf34zfKs-UMSus,128
125
128
  hud/samples/browser.py,sha256=7LkzGx2G5dA8RogZwORnxxpVsxMV2gF18D_hGJIEow8,973
126
129
  hud/server/__init__.py,sha256=8LUwgsXO8xiViWP7uImDwcOsWLu01r5F4r8U8qH3rSY,91
127
130
  hud/server/context.py,sha256=6bCdSzv1FGyItu9472HbbYef279H7QuMGJDR8EtYg5Y,3210
128
131
  hud/server/low_level.py,sha256=XYs2pOJ9kN4OcJ6ahDmXM5mWkzq5wJLpKFInUYrWEok,4701
129
- hud/server/server.py,sha256=w32-A0iRu4TIaHpWm2lBx7kIf8CcpaMbBKRrEn6GyKk,10026
132
+ hud/server/server.py,sha256=oX6jPYhJecbCcAINb_VAcWDG3wVShfbqA0FlEKZXV0o,17187
130
133
  hud/server/helper/__init__.py,sha256=ZxO8VP3RZEBBp-q65VixuhzQgqEPSVzW0hEY9J9QqDA,116
131
134
  hud/server/tests/__init__.py,sha256=eEYYkxX5Hz9woXVOBJ2H2_CQoEih0vH6nRt3sH2Z8v8,49
132
135
  hud/shared/__init__.py,sha256=IPxPCqtPLguryN-nBq78Sakypw2bRiE2iHv3SXG8YRk,139
133
136
  hud/shared/exceptions.py,sha256=dhmt5KMciQ2fmV-yqXtTNO868k-WzuZae6w7dOk3M44,12144
134
- hud/shared/hints.py,sha256=XD-Ck9Utz0gZ6lZ3-eB4AROgbc4llSoyNe1ZbmPCTx0,5049
137
+ hud/shared/hints.py,sha256=ToKC9Xb9f_tX3lEmb_4NsgXyYFX2agY8fy1ZekckOyY,5090
135
138
  hud/shared/requests.py,sha256=HWrPp7nBSK4jhv9wqZdFiNrVaaxV0vWS8fcgGtoztBc,9479
136
139
  hud/shared/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
140
  hud/shared/tests/test_exceptions.py,sha256=bCKGqw2RwBmlGIMNpddzyfnWAOQwSIYB76r6iaBE2is,15761
@@ -194,17 +197,17 @@ hud/utils/pretty_errors.py,sha256=WGeL4CTHtlA6KgPuV_JSX5l6H4-xbuTp6Y6tw1bkiFg,24
194
197
  hud/utils/progress.py,sha256=suikwFM8sdSfkV10nAOEaInDhG4XKgOSvFePg4jSj1A,5927
195
198
  hud/utils/tasks.py,sha256=JwFIq0cpPMpMYnICUmx_G4CF6uy9MtiCmmmN7eA6FsA,4682
196
199
  hud/utils/telemetry.py,sha256=hrVIx2rUjSGyy9IVxTZ_3Jii83PiHjyFRd5ls2whimM,1863
197
- hud/utils/tool_shorthand.py,sha256=nWo-Z7D4w8qF1lWKP7TkXMHZiU3vj4jAwfcBXkwrpnE,1833
200
+ hud/utils/tool_shorthand.py,sha256=_haLgK3yazLR2Y0jlEHUUQjw9uZCxi9yTipAwdOAJ70,2148
198
201
  hud/utils/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
202
  hud/utils/tests/test_async_utils.py,sha256=RkdSnYErRV3Jn7dfg6CPlcE1RSUL__2B627oIqAyy1s,5945
200
203
  hud/utils/tests/test_init.py,sha256=2QLQSGgyP9wJhOvPCusm_zjJad0qApOZi1BXpxcdHXQ,383
201
204
  hud/utils/tests/test_mcp.py,sha256=0pUa16mL-bqbZDXp5NHBnt1gO5o10BOg7zTMHZ1DNPM,4023
202
205
  hud/utils/tests/test_progress.py,sha256=QSF7Kpi03Ff_l3mAeqW9qs1nhK50j9vBiSobZq7T4f4,7394
203
206
  hud/utils/tests/test_telemetry.py,sha256=5jl7bEx8C8b-FfFUko5pf4UY-mPOR-9HaeL98dGtVHM,2781
204
- hud/utils/tests/test_version.py,sha256=YmDs3a476rPIo4rLodsx3zqGeIIeDCXLjenmKK4-rkE,160
207
+ hud/utils/tests/test_version.py,sha256=zcyyaHUOoWsGplxJebBOV8TNKFX35RThsdSv-hSq8M0,160
205
208
  hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
- hud_python-0.4.34.dist-info/METADATA,sha256=8ju6prkWIMJ5ChDPU-evkWqWucKZ1QyU3XTM2717RYA,20861
207
- hud_python-0.4.34.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
208
- hud_python-0.4.34.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
209
- hud_python-0.4.34.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
210
- hud_python-0.4.34.dist-info/RECORD,,
209
+ hud_python-0.4.36.dist-info/METADATA,sha256=OO8BzYshkq20xZDLCfeSAtftxClBSOtjRIv0_o2O9GA,21787
210
+ hud_python-0.4.36.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
211
+ hud_python-0.4.36.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
212
+ hud_python-0.4.36.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
213
+ hud_python-0.4.36.dist-info/RECORD,,