hud-python 0.4.55__tar.gz → 0.4.57__tar.gz

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 (304) hide show
  1. {hud_python-0.4.55 → hud_python-0.4.57}/PKG-INFO +1 -1
  2. hud_python-0.4.57/environments/rubrics/README.md +182 -0
  3. hud_python-0.4.57/environments/rubrics/environment/pyproject.toml +18 -0
  4. hud_python-0.4.57/environments/rubrics/pyproject.toml +19 -0
  5. hud_python-0.4.57/environments/rubrics/server/pyproject.toml +19 -0
  6. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/__init__.py +1 -1
  7. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/dev.py +24 -4
  8. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/flows/dev.py +6 -17
  9. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/init.py +3 -1
  10. hud_python-0.4.57/hud/cli/tests/test_convert.py +367 -0
  11. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/version_check.py +7 -6
  12. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/base.py +28 -2
  13. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/fastmcp.py +2 -2
  14. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/mcp_use.py +2 -2
  15. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/tests/test_protocol.py +9 -3
  16. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/server.py +59 -0
  17. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_version.py +1 -1
  18. {hud_python-0.4.55 → hud_python-0.4.57}/hud/version.py +1 -1
  19. {hud_python-0.4.55 → hud_python-0.4.57}/pyproject.toml +1 -1
  20. {hud_python-0.4.55 → hud_python-0.4.57}/.gitignore +0 -0
  21. {hud_python-0.4.55 → hud_python-0.4.57}/LICENSE +0 -0
  22. {hud_python-0.4.55 → hud_python-0.4.57}/README.md +0 -0
  23. {hud_python-0.4.55 → hud_python-0.4.57}/environments/README.md +0 -0
  24. {hud_python-0.4.55 → hud_python-0.4.57}/environments/blank/README.md +0 -0
  25. {hud_python-0.4.55 → hud_python-0.4.57}/environments/blank/environment/README.md +0 -0
  26. {hud_python-0.4.55 → hud_python-0.4.57}/environments/blank/environment/pyproject.toml +0 -0
  27. {hud_python-0.4.55 → hud_python-0.4.57}/environments/blank/server/README.md +0 -0
  28. {hud_python-0.4.55 → hud_python-0.4.57}/environments/blank/server/pyproject.toml +0 -0
  29. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/README.md +0 -0
  30. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/2048/README.md +0 -0
  31. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/2048/backend/pyproject.toml +0 -0
  32. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/README.md +0 -0
  33. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/pyproject.toml +0 -0
  34. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/todo/README.md +0 -0
  35. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/environment/todo/backend/pyproject.toml +0 -0
  36. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/pyproject.toml +0 -0
  37. {hud_python-0.4.55 → hud_python-0.4.57}/environments/browser/server/pyproject.toml +0 -0
  38. {hud_python-0.4.55 → hud_python-0.4.57}/environments/deepresearch/README.md +0 -0
  39. {hud_python-0.4.55 → hud_python-0.4.57}/environments/deepresearch/environment/pyproject.toml +0 -0
  40. {hud_python-0.4.55 → hud_python-0.4.57}/environments/deepresearch/pyproject.toml +0 -0
  41. {hud_python-0.4.55 → hud_python-0.4.57}/environments/deepresearch/server/pyproject.toml +0 -0
  42. {hud_python-0.4.55 → hud_python-0.4.57}/environments/remote_browser/README.md +0 -0
  43. {hud_python-0.4.55 → hud_python-0.4.57}/environments/remote_browser/pyproject.toml +0 -0
  44. {hud_python-0.4.55 → hud_python-0.4.57}/environments/remote_browser/src/hud_controller/providers/README.md +0 -0
  45. {hud_python-0.4.55 → hud_python-0.4.57}/environments/text_2048/README.md +0 -0
  46. {hud_python-0.4.55 → hud_python-0.4.57}/environments/text_2048/pyproject.toml +0 -0
  47. {hud_python-0.4.55 → hud_python-0.4.57}/examples/README.md +0 -0
  48. {hud_python-0.4.55 → hud_python-0.4.57}/hud/__init__.py +0 -0
  49. {hud_python-0.4.55 → hud_python-0.4.57}/hud/__main__.py +0 -0
  50. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/__init__.py +0 -0
  51. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/base.py +0 -0
  52. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/claude.py +0 -0
  53. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/grounded_openai.py +0 -0
  54. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/langchain.py +0 -0
  55. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/lite_llm.py +0 -0
  56. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/misc/__init__.py +0 -0
  57. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/misc/integration_test_agent.py +0 -0
  58. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/misc/response_agent.py +0 -0
  59. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/openai.py +0 -0
  60. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/openai_chat_generic.py +0 -0
  61. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/__init__.py +0 -0
  62. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_base.py +0 -0
  63. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_base_runtime.py +0 -0
  64. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_claude.py +0 -0
  65. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_client.py +0 -0
  66. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_grounded_openai_agent.py +0 -0
  67. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/tests/test_openai.py +0 -0
  68. {hud_python-0.4.55 → hud_python-0.4.57}/hud/agents/utils.py +0 -0
  69. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/__main__.py +0 -0
  70. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/analyze.py +0 -0
  71. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/build.py +0 -0
  72. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/clone.py +0 -0
  73. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/debug.py +0 -0
  74. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/eval.py +0 -0
  75. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/flows/__init__.py +0 -0
  76. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/flows/tasks.py +0 -0
  77. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/get.py +0 -0
  78. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/list_func.py +0 -0
  79. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/pull.py +0 -0
  80. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/push.py +0 -0
  81. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/remove.py +0 -0
  82. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/__init__.py +0 -0
  83. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/celebrate.py +0 -0
  84. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/config.py +0 -0
  85. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/display.py +0 -0
  86. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/gpu.py +0 -0
  87. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/gpu_utils.py +0 -0
  88. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/local_runner.py +0 -0
  89. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/presets.py +0 -0
  90. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/remote_runner.py +0 -0
  91. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/rl_api.py +0 -0
  92. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/viewer.py +0 -0
  93. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/vllm.py +0 -0
  94. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/rl/wait_utils.py +0 -0
  95. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/__init__.py +0 -0
  96. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_analyze.py +0 -0
  97. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_analyze_metadata.py +0 -0
  98. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_analyze_module.py +0 -0
  99. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_build.py +0 -0
  100. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_build_failure.py +0 -0
  101. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_build_module.py +0 -0
  102. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_cli_init.py +0 -0
  103. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_cli_main.py +0 -0
  104. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_cli_more_wrappers.py +0 -0
  105. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_cli_root.py +0 -0
  106. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_clone.py +0 -0
  107. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_cursor.py +0 -0
  108. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_debug.py +0 -0
  109. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_eval.py +0 -0
  110. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_list_func.py +0 -0
  111. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_main_module.py +0 -0
  112. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_mcp_server.py +0 -0
  113. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_pull.py +0 -0
  114. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_push.py +0 -0
  115. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_push_happy.py +0 -0
  116. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_push_wrapper.py +0 -0
  117. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_registry.py +0 -0
  118. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/tests/test_utils.py +0 -0
  119. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/__init__.py +0 -0
  120. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/config.py +0 -0
  121. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/cursor.py +0 -0
  122. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/docker.py +0 -0
  123. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/env_check.py +0 -0
  124. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/environment.py +0 -0
  125. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/interactive.py +0 -0
  126. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/local_runner.py +0 -0
  127. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/logging.py +0 -0
  128. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/metadata.py +0 -0
  129. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/package_runner.py +0 -0
  130. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/registry.py +0 -0
  131. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/remote_runner.py +0 -0
  132. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/runner.py +0 -0
  133. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/server.py +0 -0
  134. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/source_hash.py +0 -0
  135. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tasks.py +0 -0
  136. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/__init__.py +0 -0
  137. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_config.py +0 -0
  138. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_docker.py +0 -0
  139. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_docker_hints.py +0 -0
  140. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_env_check.py +0 -0
  141. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_environment.py +0 -0
  142. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_interactive_module.py +0 -0
  143. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_local_runner.py +0 -0
  144. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_logging_utils.py +0 -0
  145. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_metadata.py +0 -0
  146. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_package_runner.py +0 -0
  147. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_registry_utils.py +0 -0
  148. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_remote_runner.py +0 -0
  149. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_runner_modules.py +0 -0
  150. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_source_hash.py +0 -0
  151. {hud_python-0.4.55 → hud_python-0.4.57}/hud/cli/utils/tests/test_tasks.py +0 -0
  152. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/README.md +0 -0
  153. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/__init__.py +0 -0
  154. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/tests/__init__.py +0 -0
  155. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/tests/test_client_integration.py +0 -0
  156. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/tests/test_fastmcp.py +0 -0
  157. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/tests/test_mcp_use_retry.py +0 -0
  158. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/utils/__init__.py +0 -0
  159. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/utils/mcp_use_retry.py +0 -0
  160. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/utils/retry.py +0 -0
  161. {hud_python-0.4.55 → hud_python-0.4.57}/hud/clients/utils/retry_transport.py +0 -0
  162. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/__init__.py +0 -0
  163. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/parallel.py +0 -0
  164. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/runner.py +0 -0
  165. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/tests/__init__.py +0 -0
  166. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/tests/test_runner.py +0 -0
  167. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/tests/test_utils.py +0 -0
  168. {hud_python-0.4.55 → hud_python-0.4.57}/hud/datasets/utils.py +0 -0
  169. {hud_python-0.4.55 → hud_python-0.4.57}/hud/misc/__init__.py +0 -0
  170. {hud_python-0.4.55 → hud_python-0.4.57}/hud/misc/claude_plays_pokemon.py +0 -0
  171. {hud_python-0.4.55 → hud_python-0.4.57}/hud/native/__init__.py +0 -0
  172. {hud_python-0.4.55 → hud_python-0.4.57}/hud/native/comparator.py +0 -0
  173. {hud_python-0.4.55 → hud_python-0.4.57}/hud/native/tests/__init__.py +0 -0
  174. {hud_python-0.4.55 → hud_python-0.4.57}/hud/native/tests/test_comparator.py +0 -0
  175. {hud_python-0.4.55 → hud_python-0.4.57}/hud/native/tests/test_native_init.py +0 -0
  176. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/__init__.py +0 -0
  177. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/collector.py +0 -0
  178. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/config.py +0 -0
  179. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/context.py +0 -0
  180. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/exporters.py +0 -0
  181. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/instrumentation.py +0 -0
  182. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/processors.py +0 -0
  183. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/tests/__init__.py +0 -0
  184. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/tests/test_instrumentation.py +0 -0
  185. {hud_python-0.4.55 → hud_python-0.4.57}/hud/otel/tests/test_processors.py +0 -0
  186. {hud_python-0.4.55 → hud_python-0.4.57}/hud/py.typed +0 -0
  187. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/README.md +0 -0
  188. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/__init__.py +0 -0
  189. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/actor.py +0 -0
  190. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/buffer.py +0 -0
  191. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/chat_template.jinja +0 -0
  192. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/config.py +0 -0
  193. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/distributed.py +0 -0
  194. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/learner.py +0 -0
  195. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/tests/__init__.py +0 -0
  196. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/tests/test_learner.py +0 -0
  197. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/train.py +0 -0
  198. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/types.py +0 -0
  199. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/utils/start_vllm_server.sh +0 -0
  200. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/utils.py +0 -0
  201. {hud_python-0.4.55 → hud_python-0.4.57}/hud/rl/vllm_adapter.py +0 -0
  202. {hud_python-0.4.55 → hud_python-0.4.57}/hud/samples/__init__.py +0 -0
  203. {hud_python-0.4.55 → hud_python-0.4.57}/hud/samples/browser.py +0 -0
  204. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/__init__.py +0 -0
  205. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/context.py +0 -0
  206. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/helper/__init__.py +0 -0
  207. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/low_level.py +0 -0
  208. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/router.py +0 -0
  209. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/__init__.py +0 -0
  210. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_add_tool.py +0 -0
  211. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_context.py +0 -0
  212. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_mcp_server_handlers.py +0 -0
  213. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_mcp_server_integration.py +0 -0
  214. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_mcp_server_more.py +0 -0
  215. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_run_wrapper.py +0 -0
  216. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_server_extra.py +0 -0
  217. {hud_python-0.4.55 → hud_python-0.4.57}/hud/server/tests/test_sigterm_runner.py +0 -0
  218. {hud_python-0.4.55 → hud_python-0.4.57}/hud/settings.py +0 -0
  219. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/__init__.py +0 -0
  220. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/exceptions.py +0 -0
  221. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/hints.py +0 -0
  222. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/requests.py +0 -0
  223. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/tests/__init__.py +0 -0
  224. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/tests/test_exceptions.py +0 -0
  225. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/tests/test_hints.py +0 -0
  226. {hud_python-0.4.55 → hud_python-0.4.57}/hud/shared/tests/test_requests.py +0 -0
  227. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/__init__.py +0 -0
  228. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/async_context.py +0 -0
  229. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/instrument.py +0 -0
  230. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/job.py +0 -0
  231. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/replay.py +0 -0
  232. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/__init__.py +0 -0
  233. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/test_async_context.py +0 -0
  234. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/test_instrument.py +0 -0
  235. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/test_job.py +0 -0
  236. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/test_replay.py +0 -0
  237. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/tests/test_trace.py +0 -0
  238. {hud_python-0.4.55 → hud_python-0.4.57}/hud/telemetry/trace.py +0 -0
  239. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/__init__.py +0 -0
  240. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/base.py +0 -0
  241. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/bash.py +0 -0
  242. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/__init__.py +0 -0
  243. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/anthropic.py +0 -0
  244. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/hud.py +0 -0
  245. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/openai.py +0 -0
  246. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/qwen.py +0 -0
  247. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/computer/settings.py +0 -0
  248. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/edit.py +0 -0
  249. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/__init__.py +0 -0
  250. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/base.py +0 -0
  251. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/pyautogui.py +0 -0
  252. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/tests/__init__.py +0 -0
  253. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/tests/test_base_executor.py +0 -0
  254. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/tests/test_pyautogui_executor.py +0 -0
  255. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/executors/xdo.py +0 -0
  256. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/__init__.py +0 -0
  257. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/config.py +0 -0
  258. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/grounded_tool.py +0 -0
  259. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/grounder.py +0 -0
  260. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/tests/__init__.py +0 -0
  261. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/grounding/tests/test_grounded_tool.py +0 -0
  262. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/playwright.py +0 -0
  263. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/response.py +0 -0
  264. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/submit.py +0 -0
  265. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/__init__.py +0 -0
  266. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_base.py +0 -0
  267. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_bash.py +0 -0
  268. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_bash_extended.py +0 -0
  269. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_computer.py +0 -0
  270. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_computer_actions.py +0 -0
  271. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_edit.py +0 -0
  272. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_init.py +0 -0
  273. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_playwright_tool.py +0 -0
  274. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_response.py +0 -0
  275. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_submit.py +0 -0
  276. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_tools.py +0 -0
  277. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_tools_init.py +0 -0
  278. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_types.py +0 -0
  279. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/tests/test_utils.py +0 -0
  280. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/types.py +0 -0
  281. {hud_python-0.4.55 → hud_python-0.4.57}/hud/tools/utils.py +0 -0
  282. {hud_python-0.4.55 → hud_python-0.4.57}/hud/types.py +0 -0
  283. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/__init__.py +0 -0
  284. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/agent_factories.py +0 -0
  285. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/async_utils.py +0 -0
  286. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/group_eval.py +0 -0
  287. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/hud_console.py +0 -0
  288. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/mcp.py +0 -0
  289. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/pretty_errors.py +0 -0
  290. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/progress.py +0 -0
  291. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/task_tracking.py +0 -0
  292. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tasks.py +0 -0
  293. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/telemetry.py +0 -0
  294. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/__init__.py +0 -0
  295. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_agent_factories.py +0 -0
  296. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_async_utils.py +0 -0
  297. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_init.py +0 -0
  298. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_mcp.py +0 -0
  299. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_pretty_errors.py +0 -0
  300. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_progress.py +0 -0
  301. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_tasks.py +0 -0
  302. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_telemetry.py +0 -0
  303. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tests/test_tool_shorthand.py +0 -0
  304. {hud_python-0.4.55 → hud_python-0.4.57}/hud/utils/tool_shorthand.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.4.55
3
+ Version: 0.4.57
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
@@ -0,0 +1,182 @@
1
+ # Rubrics Environment
2
+
3
+ Web research environment powered by Exa API for searching and fetching content, with rubric-based evaluation for structured grading.
4
+ See [docs](https://docs.hud.so/build-environments) for the complete environment design workflow.
5
+
6
+ ## Architecture
7
+
8
+ **`environment/`** - Manages Exa API integration and state
9
+ - Holds the Exa API key server-side
10
+ - Exposes HTTP endpoints `/search`, `/fetch`, `/answer`, `/evaluate` for research workflows
11
+ - Implements exponential backoff for rate limiting
12
+
13
+ **`server/`** - Wraps data in MCP tools
14
+ - Provides `search()`, `fetch()`, `answer()`, `evaluate()` tools for agents
15
+ - Agents and tasks interact only with these tools
16
+
17
+ **Why separate?** Edit tools for the agent or tasks without restarting the environment backend.
18
+
19
+ ## Tools
20
+
21
+ - **`search(query: str)`** - Search the web using Exa API, returns list of results with titles and URLs
22
+ - **`fetch(url: str)`** - Fetch full content from a URL, returns summary, highlights, and text
23
+ - **`answer(final_answer: str)`** - Submit the final research answer
24
+ - **`evaluate(rubric: list[dict])`** - Evaluate submitted answer using a structured rubric with weighted requirements
25
+
26
+ ### Rubric-Based Evaluation
27
+
28
+ The `evaluate` tool uses The LLM Data Company's [rubric](https://github.com/The-LLM-Data-Company/rubric/) package to grade answers against structured criteria with autograders.
29
+
30
+ ## Setup
31
+
32
+ ### Requirements
33
+ - Exa API key (get one at [exa.ai](https://exa.ai))
34
+
35
+ ### Environment Variables
36
+ ```bash
37
+ export EXA_API_KEY="your_exa_api_key_here"
38
+ ```
39
+
40
+ ## Development
41
+
42
+ ```bash
43
+ # Terminal 1 - Environment backend
44
+ cd environment
45
+ export EXA_API_KEY="your_key"
46
+ uv run uvicorn server:app --reload
47
+
48
+ # Terminal 2 - MCP server
49
+ cd server
50
+ uv run hud dev
51
+ ```
52
+
53
+ The environment includes exponential backoff for rate limiting, so API calls will automatically retry on 429 errors.
54
+
55
+ In general, we recommend starting work on the environment backend first, then developing the MCP server to expose the right things to the agent.
56
+
57
+ For complex environments that require many dependencies, we recommend running `hud dev` in the environment root:
58
+ ```bash
59
+ cd ..
60
+ export EXA_API_KEY="your_key"
61
+ hud dev
62
+ ```
63
+
64
+ ## Tasks & Evaluation
65
+
66
+ ```bash
67
+ # Build first in the global folder with the Dockerfile (creates rubrics:0.1.0)
68
+ hud build
69
+ ```
70
+
71
+ Your `tasks.json` uses `docker run` to launch the environment:
72
+
73
+ ```json
74
+ {
75
+ "prompt": "Research and answer: What is the capital of France?",
76
+ "mcp_config": {
77
+ "local": {
78
+ "command": "docker",
79
+ "args": ["run", "--rm", "-i", "-e", "EXA_API_KEY", "rubrics:latest"]
80
+ }
81
+ },
82
+ "evaluate_tool": {
83
+ "name": "evaluate",
84
+ "arguments": {
85
+ "rubric": [
86
+ {
87
+ "requirement": "Correctly identifies Paris as the capital of France",
88
+ "weight": 5
89
+ },
90
+ {
91
+ "requirement": "Provides additional context about Paris (population, history, or geography)",
92
+ "weight": 10
93
+ }
94
+ ]
95
+ }
96
+ }
97
+ }
98
+ ```
99
+
100
+ **Note:** The `-e EXA_API_KEY` flag passes your local API key to the container.
101
+
102
+ **Commands:**
103
+ ```bash
104
+ # Build first
105
+ hud build
106
+
107
+ # Test task locally
108
+ export EXA_API_KEY="your_key"
109
+ hud eval tasks.json
110
+
111
+ # Push environment for remote running
112
+ hud push
113
+
114
+ # Production RL training
115
+ hud rl tasks.json # Auto-converts docker→remote, builds & pushes if needed
116
+ ```
117
+
118
+ ## Publishing Your Environment
119
+
120
+ Once your environment is ready, you can share it with the community:
121
+
122
+ ### 1. Push to Registry
123
+ ```bash
124
+ # Build and push your environment (requires docker hub login and hud api key)
125
+ hud build
126
+ hud push
127
+ ```
128
+
129
+ ### 2. Create a Dataset
130
+
131
+ Create a dataset on HuggingFace with your tasks:
132
+
133
+ **Option A: Upload manually**
134
+ 1. Upload your `tasks.json` to HuggingFace
135
+ 2. Make sure it's **public** to appear on leaderboards
136
+
137
+ **Option B: Use the SDK**
138
+ ```python
139
+ from hud.datasets import save_tasks
140
+ import json
141
+
142
+ # Load your tasks
143
+ with open("tasks.json") as f:
144
+ tasks = json.load(f)
145
+
146
+ # Push to HuggingFace
147
+ save_tasks(tasks, repo_id="your-org/your-dataset")
148
+ ```
149
+
150
+ ### 3. Run and Track Performance
151
+
152
+ ```bash
153
+ # Run Claude on your benchmark
154
+ hud eval "your-org/your-dataset" --agent claude
155
+
156
+ # View results at:
157
+ # hud.so/leaderboards/your-org/your-dataset
158
+ ```
159
+
160
+ **Note**: Only public HuggingFace datasets appear as leaderboards!
161
+
162
+ 📚 Learn more: [Creating Benchmarks](https://docs.hud.so/evaluate-agents/create-benchmarks) | [Leaderboards](https://docs.hud.so/evaluate-agents/leaderboards)
163
+
164
+ ## Example Research Workflow
165
+
166
+ ```python
167
+ # Agent searches for information
168
+ results = search("latest AI developments 2024")
169
+
170
+ # Agent fetches detailed content from top result
171
+ content = fetch(results[0]["url"])
172
+
173
+ # Agent submits final answer
174
+ answer("Based on research, AI developments in 2024 include...")
175
+
176
+ # Evaluate answer using rubric
177
+ result = evaluate(rubric=[
178
+ {"requirement": "Mentions at least 3 specific AI developments", "weight": 15},
179
+ {"requirement": "Includes dates or timeframes for developments", "weight": 5},
180
+ ])
181
+ # Returns: {"reward": float, "info": {"report": [...]}, "done": True}
182
+ ```
@@ -0,0 +1,18 @@
1
+ [project]
2
+ name = "rubrics-environment"
3
+ version = "0.1.0"
4
+ description = "Backend service for Rubrics environment"
5
+ requires-python = ">=3.11"
6
+ dependencies = [
7
+ "fastapi>=0.104.1",
8
+ "uvicorn[standard]>=0.24.0",
9
+ "httpx>=0.24.0",
10
+ "rubric>=1.1.7",
11
+ ]
12
+
13
+ [build-system]
14
+ requires = ["hatchling"]
15
+ build-backend = "hatchling.build"
16
+
17
+ [tool.hatch.build.targets.wheel]
18
+ packages = ["environment"]
@@ -0,0 +1,19 @@
1
+ [project]
2
+ name = "rubrics"
3
+ version = "0.1.0"
4
+ description = "Rubrics HUD environment with HTTP backend (EXA on server)"
5
+ requires-python = ">=3.11"
6
+ dependencies = [ "hud-python==0.4.42", "fastapi>=0.104.1", "uvicorn[standard]>=0.24.0", "httpx>=0.24.0",]
7
+
8
+ [build-system]
9
+ requires = [ "hatchling",]
10
+ build-backend = "hatchling.build"
11
+
12
+ [tool.hud]
13
+ image = "rubrics:dev"
14
+
15
+ [tool.hatch.metadata]
16
+ allow-direct-references = true
17
+
18
+ [tool.hatch.build.targets.wheel]
19
+ packages = [ "controller", "environment",]
@@ -0,0 +1,19 @@
1
+ [project]
2
+ name = "rubrics-mcp"
3
+ version = "0.1.0"
4
+ description = "MCP server for Rubrics environment"
5
+ requires-python = ">=3.11"
6
+ dependencies = [
7
+ "hud-python>=0.4.54",
8
+ "httpx>=0.24.0",
9
+ ]
10
+
11
+ [build-system]
12
+ requires = ["hatchling"]
13
+ build-backend = "hatchling.build"
14
+
15
+ [tool.hatch.metadata]
16
+ allow-direct-references = true
17
+
18
+ [tool.hatch.build.targets.wheel]
19
+ packages = ["mcp"]
@@ -746,7 +746,7 @@ def init(
746
746
  None,
747
747
  "--preset",
748
748
  "-p",
749
- help="Preset to use: blank, deep-research, browser. If omitted, you'll choose interactively.", # noqa: E501
749
+ help="Preset to use: blank, deep-research, browser, rubrics. If omitted, you'll choose interactively.", # noqa: E501
750
750
  ),
751
751
  directory: str = typer.Option(".", "--dir", "-d", help="Target directory"),
752
752
  force: bool = typer.Option(False, "--force", "-f", help="Overwrite existing files"),
@@ -237,7 +237,7 @@ async def run_mcp_module(
237
237
 
238
238
  from hud.cli.flows.dev import create_dynamic_trace
239
239
 
240
- live_trace_url = await create_dynamic_trace(
240
+ _, live_trace_url = await create_dynamic_trace(
241
241
  mcp_config=local_mcp_config,
242
242
  build_status=False,
243
243
  environment_name=mcp_server.name or "mcp-server",
@@ -608,7 +608,7 @@ def run_docker_dev_server(
608
608
  "headers": {},
609
609
  }
610
610
  }
611
- live_trace_url = _asy.run(
611
+ _, live_trace_url = _asy.run(
612
612
  create_dynamic_trace(
613
613
  mcp_config=local_mcp_config,
614
614
  build_status=True,
@@ -661,13 +661,33 @@ def run_docker_dev_server(
661
661
  # Create and run proxy with HUD helpers
662
662
  async def run_proxy() -> None:
663
663
  from fastmcp import FastMCP
664
+ from fastmcp.server.proxy import ProxyClient
664
665
 
665
- # Create FastMCP proxy to Docker stdio
666
- fastmcp_proxy = FastMCP.as_proxy(mcp_config, name="HUD Docker Dev Proxy")
666
+ # Create ProxyClient without custom log handler since we capture Docker logs directly
667
+ proxy_client = ProxyClient(mcp_config, name="HUD Docker Dev Proxy")
668
+
669
+ # Extract container name from docker args and store for logs endpoint
670
+ docker_cmd = mcp_config["docker"]["args"]
671
+ container_name = None
672
+ for i, arg in enumerate(docker_cmd):
673
+ if arg == "--name" and i + 1 < len(docker_cmd):
674
+ container_name = docker_cmd[i + 1]
675
+ break
676
+
677
+ if container_name:
678
+ # Store container name for logs endpoint to use
679
+ os.environ["_HUD_DEV_DOCKER_CONTAINER"] = container_name
680
+ hud_console.debug(f"Docker container: {container_name}")
681
+
682
+ # Create FastMCP proxy using the ProxyClient
683
+ fastmcp_proxy = FastMCP.as_proxy(proxy_client)
667
684
 
668
685
  # Wrap in MCPServer to get /docs and REST wrappers
669
686
  proxy = MCPServer(name="HUD Docker Dev Proxy")
670
687
 
688
+ # Enable logs endpoint on HTTP server
689
+ os.environ["_HUD_DEV_LOGS_PROVIDER"] = "enabled"
690
+
671
691
  # Import all tools from the FastMCP proxy
672
692
  await proxy.import_server(fastmcp_proxy)
673
693
 
@@ -18,7 +18,7 @@ async def create_dynamic_trace(
18
18
  mcp_config: dict[str, dict[str, Any]],
19
19
  build_status: bool,
20
20
  environment_name: str,
21
- ) -> str | None:
21
+ ) -> tuple[str | None, str | None]:
22
22
  """
23
23
  Create a dynamic trace for HUD dev sessions when running in HTTP mode.
24
24
 
@@ -43,27 +43,16 @@ async def create_dynamic_trace(
43
43
  api_key = settings.api_key
44
44
  if not api_key:
45
45
  logger.warning("Skipping dynamic trace creation; missing HUD_API_KEY")
46
- return None
46
+ return None, None
47
47
 
48
48
  try:
49
49
  resp = await make_request("POST", url=url, json=payload, api_key=api_key)
50
50
  # New API returns an id; construct the URL as https://hud.so/trace/{id}
51
- trace_id = None
52
- if isinstance(resp, dict):
53
- trace_id = resp.get("id")
54
- if trace_id is None:
55
- data = resp.get("data", {}) or {}
56
- if isinstance(data, dict):
57
- trace_id = data.get("id")
58
- # Backcompat: if url is provided directly
59
- if not trace_id:
60
- direct_url = resp.get("url") or (resp.get("data", {}) or {}).get("url")
61
- if isinstance(direct_url, str) and direct_url:
62
- return direct_url
51
+ trace_id = resp.get("id")
63
52
 
64
53
  if isinstance(trace_id, str) and trace_id:
65
- return f"https://hud.so/trace/{trace_id}"
66
- return None
54
+ return trace_id, f"https://hud.so/trace/{trace_id}"
55
+ return None, None
67
56
  except Exception as e:
68
57
  # Do not interrupt dev flow
69
58
  try:
@@ -71,7 +60,7 @@ async def create_dynamic_trace(
71
60
  logger.warning("Failed to create dynamic dev trace: %s | payload=%s", e, preview)
72
61
  except Exception:
73
62
  logger.warning("Failed to create dynamic dev trace: %s", e)
74
- return None
63
+ return None, None
75
64
 
76
65
 
77
66
  def show_dev_ui(
@@ -23,6 +23,7 @@ PRESET_MAP: dict[str, str | None] = {
23
23
  "blank": "blank",
24
24
  "deep-research": "deepresearch",
25
25
  "browser": "browser",
26
+ "rubrics": "rubrics",
26
27
  }
27
28
 
28
29
  SKIP_DIR_NAMES = {"node_modules", "__pycache__", "dist", "build", ".next", ".git"}
@@ -91,6 +92,7 @@ def _prompt_for_preset() -> str:
91
92
  {"name": "blank", "message": "blank"},
92
93
  {"name": "deep-research", "message": "deep-research"},
93
94
  {"name": "browser", "message": "browser"},
95
+ {"name": "rubrics", "message": "rubrics"},
94
96
  ]
95
97
  display_choices = [c["message"] for c in choices]
96
98
  selected = questionary.select(
@@ -194,7 +196,7 @@ def create_environment(
194
196
  if preset_normalized not in PRESET_MAP:
195
197
  hud_console.warning(
196
198
  f"Unknown preset '{preset_normalized}', defaulting to 'blank' "
197
- "(available: blank, deep-research, browser)"
199
+ "(available: blank, deep-research, browser, rubrics)"
198
200
  )
199
201
  preset_normalized = "blank"
200
202