hud-python 0.5.34__tar.gz → 0.5.35__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.
Files changed (358) hide show
  1. {hud_python-0.5.34 → hud_python-0.5.35}/PKG-INFO +1 -1
  2. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/base.py +14 -15
  3. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/claude.py +6 -2
  4. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gemini.py +6 -2
  5. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/openai.py +6 -2
  6. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/__init__.py +7 -0
  7. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/analyze.py +36 -17
  8. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/build.py +226 -462
  9. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/debug.py +5 -3
  10. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/deploy.py +28 -9
  11. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/eval.py +2 -2
  12. hud_python-0.5.35/hud/cli/rl.py +372 -0
  13. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/sync.py +205 -21
  14. hud_python-0.5.35/hud/cli/tests/test_analysis_utils.py +38 -0
  15. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze.py +8 -8
  16. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze_module.py +4 -4
  17. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build.py +70 -27
  18. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build_failure.py +2 -2
  19. hud_python-0.5.35/hud/cli/tests/test_lockfile_utils.py +72 -0
  20. hud_python-0.5.35/hud/cli/tests/test_rl.py +154 -0
  21. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_sync.py +279 -7
  22. hud_python-0.5.34/hud/cli/utils/mcp.py → hud_python-0.5.35/hud/cli/utils/analysis.py +57 -15
  23. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/build_display.py +1 -3
  24. hud_python-0.5.35/hud/cli/utils/collect.py +292 -0
  25. hud_python-0.5.35/hud/cli/utils/lockfile.py +169 -0
  26. hud_python-0.5.34/hud/cli/utils/evalset.py → hud_python-0.5.35/hud/cli/utils/taskset.py +6 -6
  27. hud_python-0.5.35/hud/cli/utils/tests/test_collect.py +283 -0
  28. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/mcp_config.py +51 -8
  29. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_connectors.py +76 -0
  30. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/task.py +10 -1
  31. hud_python-0.5.35/hud/native/__init__.py +36 -0
  32. hud_python-0.5.35/hud/native/graders.py +581 -0
  33. hud_python-0.5.35/hud/native/permissions.py +170 -0
  34. hud_python-0.5.35/hud/native/skills.py +127 -0
  35. hud_python-0.5.35/hud/native/tests/__init__.py +1 -0
  36. hud_python-0.5.35/hud/native/tests/test_graders.py +233 -0
  37. {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/mcp_patches.py +1 -1
  38. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/instrument.py +2 -5
  39. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/base.py +2 -2
  40. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/claude.py +2 -3
  41. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/gemini.py +2 -3
  42. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/session.py +1 -3
  43. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/hud_console.py +85 -0
  44. hud_python-0.5.35/hud/utils/serialization.py +26 -0
  45. hud_python-0.5.35/hud/utils/tests/test_serialization.py +31 -0
  46. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_version.py +1 -1
  47. {hud_python-0.5.34 → hud_python-0.5.35}/hud/version.py +1 -1
  48. {hud_python-0.5.34 → hud_python-0.5.35}/pyproject.toml +1 -1
  49. hud_python-0.5.34/hud/cli/rft.py +0 -350
  50. hud_python-0.5.34/hud/cli/rft_status.py +0 -162
  51. hud_python-0.5.34/hud/cli/utils/collect.py +0 -155
  52. hud_python-0.5.34/hud/cli/utils/lockfile.py +0 -36
  53. hud_python-0.5.34/hud/native/__init__.py +0 -1
  54. {hud_python-0.5.34 → hud_python-0.5.35}/.gitignore +0 -0
  55. {hud_python-0.5.34 → hud_python-0.5.35}/LICENSE +0 -0
  56. {hud_python-0.5.34 → hud_python-0.5.35}/README.md +0 -0
  57. {hud_python-0.5.34 → hud_python-0.5.35}/examples/README.md +0 -0
  58. {hud_python-0.5.34 → hud_python-0.5.35}/hud/__init__.py +0 -0
  59. {hud_python-0.5.34 → hud_python-0.5.35}/hud/__main__.py +0 -0
  60. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/__init__.py +0 -0
  61. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gateway.py +0 -0
  62. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gemini_cua.py +0 -0
  63. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/grounded_openai.py +0 -0
  64. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/__init__.py +0 -0
  65. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/integration_test_agent.py +0 -0
  66. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/response_agent.py +0 -0
  67. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/openai_chat.py +0 -0
  68. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/operator.py +0 -0
  69. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/resolver.py +0 -0
  70. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/__init__.py +0 -0
  71. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/conftest.py +0 -0
  72. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_base.py +0 -0
  73. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_base_runtime.py +0 -0
  74. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_claude.py +0 -0
  75. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_gemini.py +0 -0
  76. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_grounded_openai_agent.py +0 -0
  77. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_integration_test_agent.py +0 -0
  78. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_openai.py +0 -0
  79. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_operator.py +0 -0
  80. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_resolver.py +0 -0
  81. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_run_eval.py +0 -0
  82. {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/types.py +0 -0
  83. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/__main__.py +0 -0
  84. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/cancel.py +0 -0
  85. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/__init__.py +0 -0
  86. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/base.py +0 -0
  87. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/harbor.py +0 -0
  88. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/__init__.py +0 -0
  89. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/conftest.py +0 -0
  90. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/test_harbor.py +0 -0
  91. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/dev.py +0 -0
  92. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/__init__.py +0 -0
  93. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/dev.py +0 -0
  94. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/init.py +0 -0
  95. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tasks.py +0 -0
  96. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/templates.py +0 -0
  97. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tests/__init__.py +0 -0
  98. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tests/test_dev.py +0 -0
  99. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/init.py +0 -0
  100. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/link.py +0 -0
  101. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/models.py +0 -0
  102. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/push.py +0 -0
  103. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/scenario.py +0 -0
  104. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/__init__.py +0 -0
  105. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze_metadata.py +0 -0
  106. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build_module.py +0 -0
  107. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_init.py +0 -0
  108. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_main.py +0 -0
  109. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_more_wrappers.py +0 -0
  110. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_root.py +0 -0
  111. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_convert.py +0 -0
  112. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_debug.py +0 -0
  113. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_debug_directory_mode.py +0 -0
  114. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_deploy.py +0 -0
  115. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_dev.py +0 -0
  116. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_eval.py +0 -0
  117. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_eval_bedrock.py +0 -0
  118. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_init.py +0 -0
  119. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_main_module.py +0 -0
  120. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_mcp_server.py +0 -0
  121. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push.py +0 -0
  122. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push_happy.py +0 -0
  123. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push_wrapper.py +0 -0
  124. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_scenario.py +0 -0
  125. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_utils.py +0 -0
  126. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/__init__.py +0 -0
  127. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/api.py +0 -0
  128. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/args.py +0 -0
  129. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/build_logs.py +0 -0
  130. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/config.py +0 -0
  131. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/context.py +0 -0
  132. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/docker.py +0 -0
  133. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/env_check.py +0 -0
  134. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/environment.py +0 -0
  135. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/git.py +0 -0
  136. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/interactive.py +0 -0
  137. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/logging.py +0 -0
  138. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/metadata.py +0 -0
  139. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/name_check.py +0 -0
  140. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/project_config.py +0 -0
  141. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/server.py +0 -0
  142. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/source_hash.py +0 -0
  143. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tasks.py +0 -0
  144. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/__init__.py +0 -0
  145. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_config.py +0 -0
  146. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_docker.py +0 -0
  147. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_docker_hints.py +0 -0
  148. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_env_check.py +0 -0
  149. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_environment.py +0 -0
  150. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_git.py +0 -0
  151. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_interactive_module.py +0 -0
  152. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_logging_utils.py +0 -0
  153. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_metadata.py +0 -0
  154. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_source_hash.py +0 -0
  155. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_tasks.py +0 -0
  156. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/validation.py +0 -0
  157. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/version_check.py +0 -0
  158. {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/viewer.py +0 -0
  159. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/__init__.py +0 -0
  160. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/loader.py +0 -0
  161. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/runner.py +0 -0
  162. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/__init__.py +0 -0
  163. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/test_loader.py +0 -0
  164. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/test_utils.py +0 -0
  165. {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/utils.py +0 -0
  166. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/__init__.py +0 -0
  167. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connection.py +0 -0
  168. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/__init__.py +0 -0
  169. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/base.py +0 -0
  170. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/local.py +0 -0
  171. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/openai.py +0 -0
  172. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/remote.py +0 -0
  173. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/environment.py +0 -0
  174. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/__init__.py +0 -0
  175. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/adk.py +0 -0
  176. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/anthropic.py +0 -0
  177. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/gemini.py +0 -0
  178. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/langchain.py +0 -0
  179. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/llamaindex.py +0 -0
  180. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/openai.py +0 -0
  181. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/mock.py +0 -0
  182. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/router.py +0 -0
  183. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/scenarios.py +0 -0
  184. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/__init__.py +0 -0
  185. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_connection.py +0 -0
  186. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_environment.py +0 -0
  187. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_integrations.py +0 -0
  188. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_local_connectors.py +0 -0
  189. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_scenarios.py +0 -0
  190. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_session_id.py +0 -0
  191. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_tools.py +0 -0
  192. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/types.py +0 -0
  193. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/__init__.py +0 -0
  194. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/formats.py +0 -0
  195. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/schema.py +0 -0
  196. {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/tool_wrappers.py +0 -0
  197. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/__init__.py +0 -0
  198. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/context.py +0 -0
  199. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/display.py +0 -0
  200. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/instrument.py +0 -0
  201. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/manager.py +0 -0
  202. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/parallel.py +0 -0
  203. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/__init__.py +0 -0
  204. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_context.py +0 -0
  205. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_eval.py +0 -0
  206. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_manager.py +0 -0
  207. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_parallel.py +0 -0
  208. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_task.py +0 -0
  209. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/types.py +0 -0
  210. {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/utils.py +0 -0
  211. {hud_python-0.5.34 → hud_python-0.5.35}/hud/native/chat.py +0 -0
  212. {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/__init__.py +0 -0
  213. {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/warnings.py +0 -0
  214. {hud_python-0.5.34 → hud_python-0.5.35}/hud/py.typed +0 -0
  215. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/__init__.py +0 -0
  216. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/context.py +0 -0
  217. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/helper/__init__.py +0 -0
  218. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/low_level.py +0 -0
  219. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/router.py +0 -0
  220. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/server.py +0 -0
  221. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/__init__.py +0 -0
  222. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_add_tool.py +0 -0
  223. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_context.py +0 -0
  224. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_handlers.py +0 -0
  225. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_integration.py +0 -0
  226. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_more.py +0 -0
  227. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_prefix_naming.py +0 -0
  228. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_run_wrapper.py +0 -0
  229. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_server_extra.py +0 -0
  230. {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_sigterm_runner.py +0 -0
  231. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/__init__.py +0 -0
  232. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/chat.py +0 -0
  233. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/chat_service.py +0 -0
  234. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/reply_metadata.py +0 -0
  235. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/__init__.py +0 -0
  236. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/test_chat.py +0 -0
  237. {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/test_chat_service.py +0 -0
  238. {hud_python-0.5.34 → hud_python-0.5.35}/hud/settings.py +0 -0
  239. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/__init__.py +0 -0
  240. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/exceptions.py +0 -0
  241. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/hints.py +0 -0
  242. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/requests.py +0 -0
  243. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/__init__.py +0 -0
  244. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_exceptions.py +0 -0
  245. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_hints.py +0 -0
  246. {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_requests.py +0 -0
  247. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/__init__.py +0 -0
  248. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/exporter.py +0 -0
  249. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/__init__.py +0 -0
  250. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_eval_telemetry.py +0 -0
  251. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_exporter.py +0 -0
  252. {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_instrument.py +0 -0
  253. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/__init__.py +0 -0
  254. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/agent.py +0 -0
  255. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/base.py +0 -0
  256. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/__init__.py +0 -0
  257. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/apply_patch.py +0 -0
  258. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/bash.py +0 -0
  259. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/edit.py +0 -0
  260. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/gemini_edit.py +0 -0
  261. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/gemini_shell.py +0 -0
  262. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/session.py +0 -0
  263. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/shell.py +0 -0
  264. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/__init__.py +0 -0
  265. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_apply_patch.py +0 -0
  266. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash.py +0 -0
  267. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash_extended.py +0 -0
  268. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash_integration.py +0 -0
  269. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_edit.py +0 -0
  270. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_gemini_tools.py +0 -0
  271. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_shell.py +0 -0
  272. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/utils.py +0 -0
  273. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/__init__.py +0 -0
  274. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/anthropic.py +0 -0
  275. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/gemini.py +0 -0
  276. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/glm.py +0 -0
  277. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/hud.py +0 -0
  278. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/openai.py +0 -0
  279. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/qwen.py +0 -0
  280. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/settings.py +0 -0
  281. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/__init__.py +0 -0
  282. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_compression.py +0 -0
  283. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_computer.py +0 -0
  284. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_computer_actions.py +0 -0
  285. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_glm_computer.py +0 -0
  286. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/elicitation.py +0 -0
  287. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/__init__.py +0 -0
  288. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/base.py +0 -0
  289. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/pyautogui.py +0 -0
  290. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/__init__.py +0 -0
  291. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/test_base_executor.py +0 -0
  292. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/test_pyautogui_executor.py +0 -0
  293. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/xdo.py +0 -0
  294. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/__init__.py +0 -0
  295. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/base.py +0 -0
  296. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/gemini.py +0 -0
  297. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/glob.py +0 -0
  298. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/grep.py +0 -0
  299. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/list.py +0 -0
  300. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/read.py +0 -0
  301. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/__init__.py +0 -0
  302. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_glob.py +0 -0
  303. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_grep.py +0 -0
  304. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_list.py +0 -0
  305. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_read.py +0 -0
  306. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/__init__.py +0 -0
  307. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/config.py +0 -0
  308. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/grounded_tool.py +0 -0
  309. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/grounder.py +0 -0
  310. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/tests/__init__.py +0 -0
  311. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/tests/test_grounded_tool.py +0 -0
  312. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/__init__.py +0 -0
  313. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/base.py +0 -0
  314. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/code_execution.py +0 -0
  315. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/google_search.py +0 -0
  316. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/tool_search.py +0 -0
  317. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/url_context.py +0 -0
  318. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/web_fetch.py +0 -0
  319. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/web_search.py +0 -0
  320. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/jupyter.py +0 -0
  321. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/__init__.py +0 -0
  322. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/__init__.py +0 -0
  323. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_claude.py +0 -0
  324. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_gemini.py +0 -0
  325. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_session.py +0 -0
  326. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/native_types.py +0 -0
  327. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/playwright.py +0 -0
  328. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/response.py +0 -0
  329. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/submit.py +0 -0
  330. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/__init__.py +0 -0
  331. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_agent_tool.py +0 -0
  332. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_base.py +0 -0
  333. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_elicitation.py +0 -0
  334. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_init.py +0 -0
  335. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_jupyter_tool.py +0 -0
  336. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_native_tool_e2e.py +0 -0
  337. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_native_types.py +0 -0
  338. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_playwright_tool.py +0 -0
  339. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_response.py +0 -0
  340. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_submit.py +0 -0
  341. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_tools.py +0 -0
  342. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_tools_init.py +0 -0
  343. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_types.py +0 -0
  344. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_utils.py +0 -0
  345. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/types.py +0 -0
  346. {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/utils.py +0 -0
  347. {hud_python-0.5.34 → hud_python-0.5.35}/hud/types.py +0 -0
  348. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/__init__.py +0 -0
  349. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/env.py +0 -0
  350. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/mcp.py +0 -0
  351. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/pretty_errors.py +0 -0
  352. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/strict_schema.py +0 -0
  353. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/__init__.py +0 -0
  354. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_init.py +0 -0
  355. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_pretty_errors.py +0 -0
  356. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_tool_shorthand.py +0 -0
  357. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tool_shorthand.py +0 -0
  358. {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hud-python
3
- Version: 0.5.34
3
+ Version: 0.5.35
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
@@ -336,12 +336,15 @@ class MCPAgent(ABC):
336
336
  f"Available tools: {sorted(available_tool_names)}"
337
337
  )
338
338
 
339
- self.console.debug(
340
- f"Discovered {len(self._available_tools)} tools from environment: "
341
- f"{', '.join([t.name for t in self._available_tools])}"
339
+ self._categorized_tools = self.categorize_tools()
340
+
341
+ # Show tool discovery table (visible at INFO level)
342
+ self.console.format_tool_discovery(
343
+ tools=self._available_tools,
344
+ native_tools=self._categorized_tools.native + self._categorized_tools.hosted,
345
+ skipped=self._categorized_tools.skipped,
342
346
  )
343
347
 
344
- self._categorized_tools = self.categorize_tools()
345
348
  for tool, reason in self._categorized_tools.skipped:
346
349
  logger.debug("Skipping tool %s: %s", tool.name, reason)
347
350
 
@@ -574,17 +577,13 @@ class MCPAgent(ABC):
574
577
  tool_messages = await self.format_tool_results(tool_calls, tool_results)
575
578
  messages.extend(tool_messages)
576
579
 
577
- # Compact step completion display
578
- step_info = f"\n[bold]Step {step_count}"
579
- if max_steps != -1:
580
- step_info += f"/{max_steps}"
581
- step_info += "[/bold]"
582
-
583
- # Show tool calls and results in compact format
584
- for call, result in zip(tool_calls, tool_results, strict=False):
585
- step_info += f"\n{call}\n{result}"
586
-
587
- self.console.info_log(step_info)
580
+ if logger.isEnabledFor(logging.INFO):
581
+ self.console.format_step(
582
+ step=step_count,
583
+ max_steps=max_steps,
584
+ tool_calls=tool_calls,
585
+ tool_results=tool_results,
586
+ )
588
587
 
589
588
  except Exception as e:
590
589
  self.console.error_log(f"Step failed: {e}")
@@ -145,8 +145,12 @@ class ClaudeAgent(MCPAgent):
145
145
  model_client = AsyncAnthropic(api_key=settings.anthropic_api_key)
146
146
  else:
147
147
  raise ValueError(
148
- "No API key found. Set HUD_API_KEY for HUD gateway, "
149
- "or ANTHROPIC_API_KEY for direct Anthropic access."
148
+ "No API key found for Claude.\n"
149
+ " Set HUD_API_KEY to use HUD Gateway"
150
+ " (add your Anthropic key at"
151
+ " hud.ai/project/secrets for BYOK)\n"
152
+ " • Or set ANTHROPIC_API_KEY for direct"
153
+ " access"
150
154
  )
151
155
 
152
156
  self.anthropic_client: AsyncAnthropic | AsyncAnthropicBedrock = model_client
@@ -94,8 +94,12 @@ class GeminiAgent(MCPAgent):
94
94
  raise ValueError(f"Gemini API key is invalid: {e}") from e
95
95
  else:
96
96
  raise ValueError(
97
- "No API key found. Set HUD_API_KEY for HUD gateway, "
98
- "or GEMINI_API_KEY for direct Gemini access."
97
+ "No API key found for Gemini.\n"
98
+ " Set HUD_API_KEY to use HUD Gateway"
99
+ " (add your Gemini key at"
100
+ " hud.ai/project/secrets for BYOK)\n"
101
+ " • Or set GEMINI_API_KEY for direct"
102
+ " access"
99
103
  )
100
104
 
101
105
  self.gemini_client: genai.Client = model_client
@@ -119,8 +119,12 @@ class OpenAIAgent(MCPAgent):
119
119
  raise ValueError(f"OpenAI API key is invalid: {exc}") from exc
120
120
  else:
121
121
  raise ValueError(
122
- "No API key found. Set HUD_API_KEY for HUD gateway, "
123
- "or OPENAI_API_KEY for direct OpenAI access."
122
+ "No API key found for OpenAI.\n"
123
+ " Set HUD_API_KEY to use HUD Gateway"
124
+ " (add your OpenAI key at"
125
+ " hud.ai/project/secrets for BYOK)\n"
126
+ " • Or set OPENAI_API_KEY for direct"
127
+ " access"
124
128
  )
125
129
 
126
130
  self.openai_client: AsyncOpenAI = model_client
@@ -40,6 +40,7 @@ from .init import init_command # noqa: E402
40
40
  from .link import link_command # noqa: E402
41
41
  from .models import models_command # noqa: E402
42
42
  from .push import push_command # noqa: E402
43
+ from .rl import rl_run_command, rl_status_command # noqa: E402
43
44
  from .scenario import scenario_app # noqa: E402
44
45
  from .sync import sync_app # noqa: E402
45
46
 
@@ -114,6 +115,12 @@ app.add_typer(scenario_app, name="scenario")
114
115
  # Sync subcommand group
115
116
  app.add_typer(sync_app, name="sync")
116
117
 
118
+ # RL subcommand group
119
+ rl_app = typer.Typer(help="🚀 RL training commands\n\nExample: hud rl run my-taskset -m <model-id>")
120
+ rl_app.command("run")(rl_run_command)
121
+ rl_app.command("status")(rl_status_command)
122
+ app.add_typer(rl_app, name="rl")
123
+
117
124
 
118
125
  # ---------------------------------------------------------------------------
119
126
  # Entry point
@@ -4,8 +4,9 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import json
7
+ import time
7
8
  from pathlib import Path # noqa: TC003
8
- from typing import Any
9
+ from typing import TYPE_CHECKING, Any
9
10
 
10
11
  import typer
11
12
  from rich.console import Console
@@ -16,6 +17,9 @@ from rich.tree import Tree
16
17
 
17
18
  from hud.utils.hud_console import HUDConsole
18
19
 
20
+ if TYPE_CHECKING:
21
+ from collections.abc import Mapping
22
+
19
23
  console = Console()
20
24
  hud_console = HUDConsole()
21
25
 
@@ -112,19 +116,26 @@ async def analyze_environment(docker_cmd: list[str], output_format: str, verbose
112
116
 
113
117
  from fastmcp import Client as FastMCPClient
114
118
 
115
- from hud.cli.utils.mcp import analyze_environment as mcp_analyze
119
+ from hud.cli.utils.analysis import analyze_environment as mcp_analyze
116
120
 
117
121
  client = FastMCPClient(transport=mcp_config)
118
122
  # Extract server name for display (first key in mcp_config)
119
123
  server_name = next(iter(mcp_config.keys()), None)
120
124
 
121
125
  try:
126
+ start_time = time.time()
122
127
  await client.__aenter__()
128
+ initialize_ms = int((time.time() - start_time) * 1000)
123
129
  progress.update(task, description="[green]✓ Client initialized[/green]")
124
130
 
125
131
  # Analyze environment
126
132
  progress.update(task, description="Analyzing environment...")
127
- analysis = await mcp_analyze(client, verbose, server_name=server_name)
133
+ analysis = await mcp_analyze(
134
+ client,
135
+ verbose,
136
+ server_name=server_name,
137
+ initialize_ms=initialize_ms,
138
+ )
128
139
  progress.update(task, description="[green]✓ Analysis complete[/green]")
129
140
 
130
141
  except Exception as e:
@@ -154,7 +165,7 @@ async def analyze_environment(docker_cmd: list[str], output_format: str, verbose
154
165
  display_interactive(analysis)
155
166
 
156
167
 
157
- def display_interactive(analysis: dict) -> None:
168
+ def display_interactive(analysis: Mapping[str, Any]) -> None:
158
169
  """Display analysis results in interactive format."""
159
170
  # Server metadata
160
171
  hud_console.section_title("📊 Environment Overview")
@@ -201,13 +212,13 @@ def display_interactive(analysis: dict) -> None:
201
212
  hud_console.section_title("🔧 Available Tools")
202
213
  tools_tree = Tree("[bold bright_white]Tools[/bold bright_white]")
203
214
 
204
- # Check if we have hub_tools info (live analysis) or not (metadata-only)
205
- if "hub_tools" in analysis:
215
+ # Check if we have hubTools info (live analysis) or not (metadata-only)
216
+ if "hubTools" in analysis:
206
217
  # Live analysis format - separate regular and hub tools
207
218
  # Regular tools
208
219
  regular_tools = tools_tree.add("[bright_white]Regular Tools[/bright_white]")
209
220
  for tool in analysis["tools"]:
210
- if tool["name"] not in analysis["hub_tools"]:
221
+ if tool["name"] not in analysis["hubTools"]:
211
222
  tool_node = regular_tools.add(f"[bright_white]{tool['name']}[/bright_white]")
212
223
  if tool["description"]:
213
224
  tool_node.add(f"[bright_black]{tool['description']}[/bright_black]")
@@ -219,9 +230,9 @@ def display_interactive(analysis: dict) -> None:
219
230
  tool_node.add(syntax)
220
231
 
221
232
  # Hub tools
222
- if analysis["hub_tools"]:
233
+ if analysis["hubTools"]:
223
234
  hub_tools = tools_tree.add("[bright_white]Hub Tools[/bright_white]")
224
- for hub_name, functions in analysis["hub_tools"].items():
235
+ for hub_name, functions in analysis["hubTools"].items():
225
236
  hub_node = hub_tools.add(f"[rgb(181,137,0)]{hub_name}[/rgb(181,137,0)]")
226
237
  for func in functions:
227
238
  hub_node.add(f"[bright_white]{func}[/bright_white]")
@@ -314,7 +325,7 @@ def display_interactive(analysis: dict) -> None:
314
325
  console.print(env_table)
315
326
 
316
327
 
317
- def display_markdown(analysis: dict) -> None:
328
+ def display_markdown(analysis: Mapping[str, Any]) -> None:
318
329
  """Display analysis results in markdown format."""
319
330
  md = []
320
331
  md.append("# MCP Environment Analysis\n")
@@ -344,19 +355,19 @@ def display_markdown(analysis: dict) -> None:
344
355
  # Tools
345
356
  md.append("## Available Tools\n")
346
357
 
347
- # Check if we have hub_tools info (live analysis) or not (metadata-only)
348
- if "hub_tools" in analysis:
358
+ # Check if we have hubTools info (live analysis) or not (metadata-only)
359
+ if "hubTools" in analysis:
349
360
  # Regular tools
350
361
  md.append("### Regular Tools")
351
362
  for tool in analysis["tools"]:
352
- if tool["name"] not in analysis["hub_tools"]:
363
+ if tool["name"] not in analysis["hubTools"]:
353
364
  md.extend([f"- **{tool['name']}**: {tool.get('description', 'No description')}"])
354
365
  md.append("")
355
366
 
356
367
  # Hub tools
357
- if analysis["hub_tools"]:
368
+ if analysis["hubTools"]:
358
369
  md.append("### Hub Tools")
359
- for hub_name, functions in analysis["hub_tools"].items():
370
+ for hub_name, functions in analysis["hubTools"].items():
360
371
  md.extend([f"- **{hub_name}**"])
361
372
  for func in functions:
362
373
  md.extend([f" - {func}"])
@@ -469,18 +480,26 @@ async def _analyze_with_config(
469
480
 
470
481
  from fastmcp import Client as FastMCPClient
471
482
 
472
- from hud.cli.utils.mcp import analyze_environment as mcp_analyze
483
+ from hud.cli.utils.analysis import analyze_environment as mcp_analyze
473
484
 
474
485
  config = _prepare_mcp_config(mcp_config)
475
486
  client = FastMCPClient(transport=config)
487
+ server_name = next(iter(config.keys()), None)
476
488
 
477
489
  try:
490
+ start_time = time.time()
478
491
  await client.__aenter__()
492
+ initialize_ms = int((time.time() - start_time) * 1000)
479
493
  progress.update(task, description="[green]✓ Client initialized[/green]")
480
494
 
481
495
  # Analyze environment
482
496
  progress.update(task, description="Analyzing environment...")
483
- analysis = await mcp_analyze(client, verbose)
497
+ analysis = await mcp_analyze(
498
+ client,
499
+ verbose,
500
+ server_name=server_name,
501
+ initialize_ms=initialize_ms,
502
+ )
484
503
  progress.update(task, description="[green]✓ Analysis complete[/green]")
485
504
 
486
505
  except Exception as e: