hud-python 0.6.2__py3-none-any.whl → 0.6.3__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.
hud/cli/eval.py CHANGED
@@ -5,6 +5,7 @@ Config Override Order: CLI arguments > .hud_eval.toml > defaults
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ import ast
8
9
  import asyncio
9
10
  import logging
10
11
  import os
@@ -665,13 +666,46 @@ def _build_agent(cfg: EvalConfig) -> Any:
665
666
  return cast("Any", cfg.agent_type.cls)(config=config)
666
667
 
667
668
 
669
+ def _python_defines_environment(path: Path) -> bool:
670
+ """Return True when ``path`` constructs a v6 :class:`~hud.environment.Environment`."""
671
+ try:
672
+ tree = ast.parse(path.read_text(encoding="utf-8"))
673
+ except (OSError, SyntaxError):
674
+ return False
675
+ for node in ast.walk(tree):
676
+ if not isinstance(node, ast.Call):
677
+ continue
678
+ callee = node.func
679
+ callee_name = (
680
+ callee.id
681
+ if isinstance(callee, ast.Name)
682
+ else callee.attr
683
+ if isinstance(callee, ast.Attribute)
684
+ else None
685
+ )
686
+ if callee_name == "Environment":
687
+ return True
688
+ return False
689
+
690
+
668
691
  def _spawn_target(source: Path) -> Path:
669
- """The path the ``LocalRuntime`` provider serves: the source itself for ``.py``
670
- files and directories, the surrounding directory for JSON/JSONL data files
671
- (the env's ``.py`` source lives next to the tasks file)."""
692
+ """The path the ``LocalRuntime`` provider serves.
693
+
694
+ Directories and env-defining ``.py`` files are served as-is. Task-only
695
+ sources (``tasks.py`` importing from ``env.py``) resolve to a sibling
696
+ ``env.py`` or the containing directory. JSON/JSONL data files use the
697
+ surrounding directory (the env source lives next to the tasks file).
698
+ """
672
699
  resolved = source.resolve()
673
- if resolved.is_dir() or resolved.suffix == ".py":
700
+ if resolved.is_dir():
701
+ return resolved
702
+ if resolved.suffix != ".py":
703
+ return resolved.parent
704
+ if _python_defines_environment(resolved):
674
705
  return resolved
706
+ env_py = resolved.parent / "env.py"
707
+ if env_py.is_file():
708
+ return env_py
675
709
  return resolved.parent
676
710
 
677
711
 
hud/cli/init.py CHANGED
@@ -76,8 +76,8 @@ def init_command(
76
76
  None,
77
77
  "--preset",
78
78
  "-p",
79
- help="Starter preset to download from GitHub (e.g. blank, coding, browser, "
80
- "deepresearch, rubrics, remote-browser). Omit for an interactive picker; in a "
79
+ help="Starter preset to download from GitHub (e.g. blank, browser, "
80
+ "deepresearch, cua, autonomous-businesses, verilog). Omit for an interactive picker; in a "
81
81
  "non-interactive shell, omitting it writes the minimal local scaffold.",
82
82
  ),
83
83
  ) -> None:
@@ -89,7 +89,7 @@ def init_command(
89
89
 
90
90
  Examples:
91
91
  hud init my-env # interactive picker (or local scaffold)
92
- hud init my-env --preset coding # download the coding starter
92
+ hud init my-env --preset browser # download the browser starter
93
93
  hud init my-env --dir envs # create ./envs/my-env[/not dim]
94
94
  """
95
95
  hud_console = HUDConsole()
hud/cli/templates.py CHANGED
@@ -13,7 +13,7 @@ COPY . .
13
13
 
14
14
  # Serve the Environment's control channel (tcp JSON-RPC) on 8765.
15
15
  EXPOSE 8765
16
- CMD ["uv", "run", "python", "-m", "hud", "dev", "env:env", "--host", "0.0.0.0", "--port", "8765"]
16
+ CMD ["uv", "run", "hud", "serve", "env:env", "--host", "0.0.0.0", "--port", "8765"]
17
17
  """
18
18
 
19
19
  # fmt: off
@@ -78,7 +78,7 @@ async def count(sentence: str, letter: str):
78
78
 
79
79
 
80
80
  # =============================================================================
81
- # TEST - run with: python env.py
81
+ # TEST - run with: uv run python env.py
82
82
  # =============================================================================
83
83
 
84
84
  async def test():
@@ -136,7 +136,6 @@ version = "0.1.0"
136
136
  requires-python = ">=3.11"
137
137
  dependencies = ["hud-python"]
138
138
 
139
- [build-system]
140
- requires = ["hatchling"]
141
- build-backend = "hatchling.build"
139
+ [tool.uv]
140
+ package = false
142
141
  """
@@ -48,7 +48,7 @@ class TestResolveEnvironmentName:
48
48
 
49
49
  def test_entrypoint_disambiguates_subagent(self, tmp_path: Path) -> None:
50
50
  (tmp_path / "Dockerfile").write_text(
51
- 'CMD ["hud", "dev", "env:env", "--port", "8765"]\n', encoding="utf-8"
51
+ 'CMD ["hud", "serve", "env:env", "--port", "8765"]\n', encoding="utf-8"
52
52
  )
53
53
  (tmp_path / "env.py").write_text('env = Environment("trace-explorer")\n', encoding="utf-8")
54
54
  (tmp_path / "verify.py").write_text(
@@ -237,3 +237,32 @@ def test_eval_max_steps_lands_in_agent_config() -> None:
237
237
  )
238
238
  agent = eval_mod._build_agent(cfg)
239
239
  assert agent.config.max_steps == 17
240
+
241
+
242
+ def test_spawn_target_serves_single_file_env(tmp_path: Path) -> None:
243
+ env_py = tmp_path / "tasks.py"
244
+ env_py.write_text(
245
+ 'from hud import Environment\nenv = Environment(name="demo")\n',
246
+ encoding="utf-8",
247
+ )
248
+ assert eval_mod._spawn_target(env_py) == env_py.resolve()
249
+
250
+
251
+ def test_spawn_target_resolves_split_tasks_layout(tmp_path: Path) -> None:
252
+ (tmp_path / "env.py").write_text(
253
+ 'from hud.environment import Environment\nenv = Environment(name="demo")\n',
254
+ encoding="utf-8",
255
+ )
256
+ tasks_py = tmp_path / "tasks.py"
257
+ tasks_py.write_text("from env import env\n\ntasks = []\n", encoding="utf-8")
258
+ assert eval_mod._spawn_target(tasks_py) == (tmp_path / "env.py").resolve()
259
+
260
+
261
+ def test_spawn_target_json_uses_parent_directory(tmp_path: Path) -> None:
262
+ tasks_json = tmp_path / "tasks.json"
263
+ tasks_json.write_text("[]", encoding="utf-8")
264
+ assert eval_mod._spawn_target(tasks_json) == tmp_path.resolve()
265
+
266
+
267
+ def test_spawn_target_directory_is_served_as_is(tmp_path: Path) -> None:
268
+ assert eval_mod._spawn_target(tmp_path) == tmp_path.resolve()
@@ -29,6 +29,14 @@ def test_init_scaffolds_a_runnable_package(tmp_path: Path) -> None:
29
29
  assert (target / "tasks.py").read_text().startswith('"""')
30
30
  assert 'name = "my-cool-env"' in (target / "pyproject.toml").read_text()
31
31
 
32
+ pyproject = (target / "pyproject.toml").read_text()
33
+ assert "package = false" in pyproject
34
+ assert "[build-system]" not in pyproject
35
+
36
+ dockerfile = (target / "Dockerfile.hud").read_text()
37
+ assert 'CMD ["uv", "run", "hud", "serve"' in dockerfile
38
+ assert '"dev"' not in dockerfile
39
+
32
40
 
33
41
  def test_init_refuses_to_clobber_nonempty_directory(tmp_path: Path) -> None:
34
42
  target = tmp_path / "taken"
hud/eval/job.py CHANGED
@@ -38,17 +38,20 @@ class Job:
38
38
  name: str
39
39
  runs: list[Run] = field(default_factory=list)
40
40
  group: int = 1
41
+ #: Platform taskset id this job runs, when it's a synced taskset
42
+ #: (``Taskset.from_api``). Links the job to that taskset on the platform.
43
+ taskset_id: str | None = None
41
44
 
42
45
  @classmethod
43
- async def start(cls, name: str, *, group: int = 1) -> Job:
46
+ async def start(cls, name: str, *, group: int = 1, taskset_id: str | None = None) -> Job:
44
47
  """Open a job spanning multiple scheduler calls.
45
48
 
46
49
  A scheduler call mints its own job by default; pass a started job as
47
50
  ``job=`` to ``Task.run`` / ``Taskset.run`` to accumulate every run of a
48
51
  longer arc — a training session, a chat conversation — under one id.
49
52
  """
50
- job = cls(id=uuid.uuid4().hex, name=name, group=group)
51
- await job_enter(job.id, name=name, group=group)
53
+ job = cls(id=uuid.uuid4().hex, name=name, group=group, taskset_id=taskset_id)
54
+ await job_enter(job.id, name=name, group=group, taskset_id=taskset_id)
52
55
  return job
53
56
 
54
57
  @property
@@ -79,21 +82,42 @@ def _reporting_enabled() -> bool:
79
82
  return bool(settings.telemetry_enabled and settings.api_key)
80
83
 
81
84
 
82
- async def job_enter(job_id: str, *, name: str, group: int) -> None:
83
- """Register a batch job with the platform."""
85
+ async def job_enter(job_id: str, *, name: str, group: int, taskset_id: str | None = None) -> None:
86
+ """Register a batch job with the platform.
87
+
88
+ ``taskset_id`` links the job to a synced taskset (set when running
89
+ ``Taskset.from_api``); ``None`` for ad-hoc/local tasksets. The platform
90
+ creates no taskset on its own — remote rollouts carry the scenario inline.
91
+ """
84
92
  if not _reporting_enabled():
85
93
  return
86
- await _report(f"/trace/job/{job_id}/enter", {"name": name, "group": group})
94
+ await _report(
95
+ f"/trace/job/{job_id}/enter",
96
+ {"name": name, "group": group, "taskset_id": taskset_id},
97
+ )
87
98
  from hud.settings import settings
88
99
 
89
100
  logger.info("job: %s/jobs/%s", settings.hud_web_url, job_id)
90
101
 
91
102
 
92
- async def trace_enter(trace_id: str, *, job_id: str | None, group_id: str | None) -> None:
93
- """Report that one rollout started."""
103
+ async def trace_enter(
104
+ trace_id: str,
105
+ *,
106
+ job_id: str | None,
107
+ group_id: str | None,
108
+ model: str | None = None,
109
+ ) -> None:
110
+ """Report that one rollout started.
111
+
112
+ ``model`` is the model string the agent will sample (when known); the
113
+ platform resolves it and attributes the trace immediately on enter.
114
+ """
94
115
  if not _reporting_enabled():
95
116
  return
96
- await _report(f"/trace/{trace_id}/enter", {"job_id": job_id, "group_id": group_id})
117
+ await _report(
118
+ f"/trace/{trace_id}/enter",
119
+ {"job_id": job_id, "group_id": group_id, "model": model},
120
+ )
97
121
 
98
122
 
99
123
  async def trace_exit(run: Run) -> None:
hud/eval/run.py CHANGED
@@ -295,8 +295,15 @@ async def rollout(
295
295
  job_id = uuid.uuid4().hex
296
296
  await job_enter(job_id, name=task.id, group=1)
297
297
  trace_id = trace_id or uuid.uuid4().hex
298
+ # Report the model the agent will sample so the platform attributes the
299
+ # trace to it on enter. Only LLM tool agents carry an inference-model slug
300
+ # (``config.model``); robot/other agents have none. Local import avoids an
301
+ # eval<->agents import cycle.
302
+ from hud.agents.tool_agent import ToolAgent
303
+
304
+ agent_model = agent.config.model if isinstance(agent, ToolAgent) else None
298
305
  with set_trace_context(trace_id):
299
- await trace_enter(trace_id, job_id=job_id, group_id=group_id)
306
+ await trace_enter(trace_id, job_id=job_id, group_id=group_id, model=agent_model)
300
307
  run: Run | None = None
301
308
  _phase = "provisioning"
302
309
 
hud/eval/taskset.py CHANGED
@@ -59,6 +59,17 @@ class Taskset:
59
59
  self.origin = origin
60
60
  self.tasks: dict[str, Task] = self._index_by_slug(list(tasks))
61
61
 
62
+ @property
63
+ def api_id(self) -> str | None:
64
+ """The platform taskset id when loaded via :meth:`from_api`, else None.
65
+
66
+ Threaded into the job so a remote run of a synced taskset links to it;
67
+ ad-hoc/file/module tasksets have none and create no taskset.
68
+ """
69
+ if self.origin and self.origin.startswith("api:"):
70
+ return self.origin[len("api:") :]
71
+ return None
72
+
62
73
  @classmethod
63
74
  def from_file(cls, path: str | Path) -> Taskset:
64
75
  """Load a taskset from ``.py`` source, a directory, or JSON/JSONL data.
@@ -242,8 +253,13 @@ class Taskset:
242
253
  expanded.extend((task, group_id) for _ in range(group))
243
254
 
244
255
  if job is None:
245
- job = Job(id=uuid.uuid4().hex, name=_job_name(self.name, task_list, group), group=group)
246
- await job_enter(job.id, name=job.name, group=group)
256
+ job = Job(
257
+ id=uuid.uuid4().hex,
258
+ name=_job_name(self.name, task_list, group),
259
+ group=group,
260
+ taskset_id=self.api_id,
261
+ )
262
+ await job_enter(job.id, name=job.name, group=group, taskset_id=self.api_id)
247
263
  job_id = job.id
248
264
 
249
265
  # Placement is chosen once for the batch: HostedRuntime delegates the
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.6.2"
7
+ __version__ = "0.6.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.6.2
3
+ Version: 0.6.3
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
@@ -5,7 +5,7 @@ hud/conftest.py,sha256=HKbHvmFXLPX6KFSJgPFUAM22auclNNdFmHGwilNzg98,1012
5
5
  hud/server.py,sha256=NtSHIjBFr9lYvryfXrCa-VhwqnwkRy7n5fp_OuNhNOI,1235
6
6
  hud/settings.py,sha256=crfeQArM_8JnwmMdx0fcwL5xCvJMjeofGrGbpn0nW3c,6393
7
7
  hud/types.py,sha256=yOBFED8Ii7KA-8EzvmE3CU16LCXVigPnNjjl3kB8aRo,15326
8
- hud/version.py,sha256=oJ08yq_IrzFrsTHVgSPsBzDrwos8KumqvTVB-J2A0aM,104
8
+ hud/version.py,sha256=Fp9FcgGRmYznsb5parYeGGuY6b_pSnDj5Yz7XEFRzDU,104
9
9
  hud/agents/__init__.py,sha256=ISruomRkEw1-cWCncyCgqKeeueYZFeBvFJ62RBIBQI8,4866
10
10
  hud/agents/base.py,sha256=WgEOWUmMioXTxYe6cOvbqnbM4n989Z9kFEZIN6xJ3pU,659
11
11
  hud/agents/tool_agent.py,sha256=a0xsh2d8IwvmiPGMs9LCzghi61FHt4vMK_9sW8eNFbA,12557
@@ -94,23 +94,23 @@ hud/cli/__main__.py,sha256=fDH7XITyuDITwSDIVwRso06aouADO0CzTHKqp5TOwJE,143
94
94
  hud/cli/cancel.py,sha256=MHRdZ6IoFy3iac9NtTT_c91IB_iQbYISsCb7ph7u298,3785
95
95
  hud/cli/client.py,sha256=cC23TUTo7w4S63jtk8SWkFWzG9h8Z2AKwYEqaefBWqg,2946
96
96
  hud/cli/deploy.py,sha256=QytQKmGY60YKNnQnhv0gXjMl9BVdwsvMRq0yZypVgpY,26082
97
- hud/cli/eval.py,sha256=GKvncjJ1AhMiBwsCn8jndAP_IdOe14HYC5AMnsAg3PE,33801
98
- hud/cli/init.py,sha256=6k3svrqeX19VuQ9cRuTTIojq5L5yRS51YscnXRuayRc,6464
97
+ hud/cli/eval.py,sha256=mgXRftSef-6aAr8EkmYumQePGS0djcsUeR2TIDZIKQg,34812
98
+ hud/cli/init.py,sha256=LfxVnuw5rnPCIvCnKWYIkAt6cg2Wxk-DSOM16lbuOvQ,6470
99
99
  hud/cli/login.py,sha256=3DhM_FfvfjP-cdfCj596kPo0bE9L3eQdz520X0oWqbc,7961
100
100
  hud/cli/models.py,sha256=NInyi2I5x-GFBpcTdjvfTI3f3eWC_U-E-SgWJUxbQz8,8770
101
101
  hud/cli/presets.py,sha256=qZmc_GKwdnRNJqxRqrg-MDUhN1Vh1JcDB4nJ94_AXLw,4523
102
102
  hud/cli/serve.py,sha256=074y6dGh1yPxr6m8MScKpYPXo2SX38zWbq2uZUrXl9k,3757
103
103
  hud/cli/sync.py,sha256=rvbcAM7ZfXOrlxRT3Zpp25Y-UkFbPqTuOzrcHAH1tK4,16927
104
104
  hud/cli/task.py,sha256=eYByPZHCqSy1GFiyZOVHNNqDFxvHaSLUGNQZ7o9kdz4,8111
105
- hud/cli/templates.py,sha256=HpJevrLJ5YQvbNyoDkQfCezT-KFGcdC8wB5OCoT4G-o,4746
105
+ hud/cli/templates.py,sha256=bOu31T9e3IueWvmwU-PFJz869V2EZbZL9ECApfdj-Dk,4691
106
106
  hud/cli/tests/__init__.py,sha256=ZrGVkmH7DHXGqOvjOSNGZeMYaFIRB2K8c6hwr8FPJ-8,68
107
107
  hud/cli/tests/test_cli_init.py,sha256=e4pHfw4jLt2TY5n_fSTfA7XRcMsu1hKxOK7PNfVRO7U,3002
108
108
  hud/cli/tests/test_cli_main.py,sha256=0wMho9p9NcGjp0jLiUtCQh_FYdbMaCJtSY3sBbSgPwA,697
109
109
  hud/cli/tests/test_cli_more_wrappers.py,sha256=EEFrqTMg3yknQdmb8hWcHJAbinGAOGyqx3CGdiVX1b8,115
110
- hud/cli/tests/test_deploy.py,sha256=1b_2iviob4b_RFVun01cwCl3i4FmO2MaCrFs7PfzOSI,13983
110
+ hud/cli/tests/test_deploy.py,sha256=atjacSnfZGf2DVG82Hf1vWswweqDKl6OBxb_Gmddma0,13985
111
111
  hud/cli/tests/test_eval_bedrock.py,sha256=UBGakgIV4kzXUj0Jtbr3t05xBss66YPqruKsovUYyoo,1900
112
- hud/cli/tests/test_eval_config.py,sha256=Cl4kHc6qykaFt_lmsjyzKZRjsoTdomQBgZ5pYKQLMLQ,7932
113
- hud/cli/tests/test_init.py,sha256=s8ipywnOztV_E4WHuBAqeGGEzcbW2jbIM1RUvEF-yr8,1479
112
+ hud/cli/tests/test_eval_config.py,sha256=A4ViJOap-taGwYckb3CJqc-gSLFCxHt-86tPx8nv_dE,9034
113
+ hud/cli/tests/test_init.py,sha256=KjBMyfbu9N46v8Fv1OUIC5kQTgkB3WLXNkOYUV4p_io,1778
114
114
  hud/cli/tests/test_main_module.py,sha256=PyfuSdqI-4Zt-kd16FMj2XHEHrw7SQ75YLJbQPdcIco,1223
115
115
  hud/cli/tests/test_sync_export.py,sha256=wd4ICZlNr_7XMw8MfNJuC8v0-lhywsjG7DnZE1zpJek,735
116
116
  hud/cli/utils/__init__.py,sha256=L6s0oNzY2LugGp9faodCPnjzM-ZUorUH05-HmYOq5hY,35
@@ -162,12 +162,12 @@ hud/environment/tests/test_tunnel.py,sha256=CDUO3wudYwxRTXhJCFsz3KsSxe10k9tesPd7
162
162
  hud/eval/__init__.py,sha256=keLJ4nozyM5soYcqPb1_t821u-xrp0QH0iQo_HS8gr0,2109
163
163
  hud/eval/chat.py,sha256=Gu6aDv1UkDAZ8qs41TXLUrFlcX4cav4HHSa7Yyovifw,5853
164
164
  hud/eval/file_tracking.py,sha256=MqLNl_lYfp74KCr4ZbwW9yGHmIyJ6GeOgAN9NMhELgs,4278
165
- hud/eval/job.py,sha256=oBfYHEJtiILd2QV3XZ9_35QSKo9WdgavYXIYkZ9yNhw,4794
166
- hud/eval/run.py,sha256=P-R4wnMA3YetqVhKBiQDyYIsBCdmzcer5bkoDXVOAbM,16861
165
+ hud/eval/job.py,sha256=QMck-M_0HWtEd56hvfdYaNnStLlIOuNOGBStdcLr2vI,5606
166
+ hud/eval/run.py,sha256=oyuFkT9W47KixTX8cmQMoO65R0QTxgd6sk9_eL02d9k,17276
167
167
  hud/eval/runtime.py,sha256=q71caY2XuWYvnKJ3zxB3bBawLU970bg_HwxcbdSD_Ko,40738
168
168
  hud/eval/sync.py,sha256=i7kxOoLyX5t6Jf9AoT9IRiDVhAfvY2bPIuYyDdqtc-Y,6469
169
169
  hud/eval/task.py,sha256=9xQ_x4AjY26M-sVRH6HhDZpKeofBw1hd8LZ0csBy53k,4617
170
- hud/eval/taskset.py,sha256=VgAP3xPorTxUnR76D7FRXhuKnOovsCFFMdaJKJgn1eY,11542
170
+ hud/eval/taskset.py,sha256=9KVYxoeMnMHa2syR4fRGh9r1IuKoDVyMe7WEUFvaGxQ,12086
171
171
  hud/eval/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  hud/eval/tests/test_chat.py,sha256=yQt_dM1UJu-Cw8JS8di102h06ee7QI9CqNA27U66_Qg,4310
173
173
  hud/eval/tests/test_docker_provider.py,sha256=1W1xyOzjHti6jfV2eiVnNd5CxKEMAKq8NBgBy-m5ftA,23741
@@ -221,8 +221,8 @@ hud/utils/tests/test_platform.py,sha256=mwhyFkUBvgmHRc43vQ_JgAAW2N9fIaxkQhVo-GB4
221
221
  hud/utils/tests/test_requests.py,sha256=ENK6P5xLTuSgWDcCau4zCj_5zPV_EooGwU4P8YYl5Gw,9109
222
222
  hud/utils/tests/test_serialization.py,sha256=GY4NiFUJtwLSYQWA0n1zme-Ul4DnBLByHCOOkxn2kLM,819
223
223
  hud/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
224
- hud_python-0.6.2.dist-info/METADATA,sha256=3vYSE1DBNZV7N4pIXSiZzbJejgOR196u8V40EpkvX2g,12304
225
- hud_python-0.6.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
226
- hud_python-0.6.2.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
227
- hud_python-0.6.2.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
228
- hud_python-0.6.2.dist-info/RECORD,,
224
+ hud_python-0.6.3.dist-info/METADATA,sha256=SI8xLaheCjc74TPSLvbYoHFDWOlgMzb8b4sdlfQ8fEY,12304
225
+ hud_python-0.6.3.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
226
+ hud_python-0.6.3.dist-info/entry_points.txt,sha256=jJbodNFg1m0-CDofe5AHvB4zKBq7sSdP97-ohaQ3ae4,63
227
+ hud_python-0.6.3.dist-info/licenses/LICENSE,sha256=yIzBheVUf86FC1bztAcr7RYWWNxyd3B-UJQ3uddg1HA,1078
228
+ hud_python-0.6.3.dist-info/RECORD,,