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.
- {hud_python-0.5.34 → hud_python-0.5.35}/PKG-INFO +1 -1
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/base.py +14 -15
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/claude.py +6 -2
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gemini.py +6 -2
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/openai.py +6 -2
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/__init__.py +7 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/analyze.py +36 -17
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/build.py +226 -462
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/debug.py +5 -3
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/deploy.py +28 -9
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/eval.py +2 -2
- hud_python-0.5.35/hud/cli/rl.py +372 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/sync.py +205 -21
- hud_python-0.5.35/hud/cli/tests/test_analysis_utils.py +38 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze.py +8 -8
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze_module.py +4 -4
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build.py +70 -27
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build_failure.py +2 -2
- hud_python-0.5.35/hud/cli/tests/test_lockfile_utils.py +72 -0
- hud_python-0.5.35/hud/cli/tests/test_rl.py +154 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_sync.py +279 -7
- hud_python-0.5.34/hud/cli/utils/mcp.py → hud_python-0.5.35/hud/cli/utils/analysis.py +57 -15
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/build_display.py +1 -3
- hud_python-0.5.35/hud/cli/utils/collect.py +292 -0
- hud_python-0.5.35/hud/cli/utils/lockfile.py +169 -0
- hud_python-0.5.34/hud/cli/utils/evalset.py → hud_python-0.5.35/hud/cli/utils/taskset.py +6 -6
- hud_python-0.5.35/hud/cli/utils/tests/test_collect.py +283 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/mcp_config.py +51 -8
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_connectors.py +76 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/task.py +10 -1
- hud_python-0.5.35/hud/native/__init__.py +36 -0
- hud_python-0.5.35/hud/native/graders.py +581 -0
- hud_python-0.5.35/hud/native/permissions.py +170 -0
- hud_python-0.5.35/hud/native/skills.py +127 -0
- hud_python-0.5.35/hud/native/tests/__init__.py +1 -0
- hud_python-0.5.35/hud/native/tests/test_graders.py +233 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/mcp_patches.py +1 -1
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/instrument.py +2 -5
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/base.py +2 -2
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/claude.py +2 -3
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/gemini.py +2 -3
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/session.py +1 -3
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/hud_console.py +85 -0
- hud_python-0.5.35/hud/utils/serialization.py +26 -0
- hud_python-0.5.35/hud/utils/tests/test_serialization.py +31 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_version.py +1 -1
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/version.py +1 -1
- {hud_python-0.5.34 → hud_python-0.5.35}/pyproject.toml +1 -1
- hud_python-0.5.34/hud/cli/rft.py +0 -350
- hud_python-0.5.34/hud/cli/rft_status.py +0 -162
- hud_python-0.5.34/hud/cli/utils/collect.py +0 -155
- hud_python-0.5.34/hud/cli/utils/lockfile.py +0 -36
- hud_python-0.5.34/hud/native/__init__.py +0 -1
- {hud_python-0.5.34 → hud_python-0.5.35}/.gitignore +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/LICENSE +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/README.md +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/examples/README.md +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/__main__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gateway.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/gemini_cua.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/grounded_openai.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/integration_test_agent.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/misc/response_agent.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/openai_chat.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/operator.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/resolver.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/conftest.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_base_runtime.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_claude.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_gemini.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_grounded_openai_agent.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_integration_test_agent.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_openai.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_operator.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_resolver.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/tests/test_run_eval.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/agents/types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/__main__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/cancel.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/harbor.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/conftest.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/convert/tests/test_harbor.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/dev.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/dev.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tasks.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/templates.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/flows/tests/test_dev.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/link.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/models.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/push.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/scenario.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_analyze_metadata.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_build_module.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_main.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_more_wrappers.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_cli_root.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_convert.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_debug.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_debug_directory_mode.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_deploy.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_dev.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_eval.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_eval_bedrock.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_main_module.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_mcp_server.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push_happy.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_push_wrapper.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_scenario.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/tests/test_utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/api.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/args.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/build_logs.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/config.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/docker.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/env_check.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/environment.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/git.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/interactive.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/logging.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/metadata.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/name_check.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/project_config.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/server.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/source_hash.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tasks.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_config.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_docker.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_docker_hints.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_env_check.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_environment.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_git.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_interactive_module.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_logging_utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_metadata.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_source_hash.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/tests/test_tasks.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/validation.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/version_check.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/cli/utils/viewer.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/loader.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/runner.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/test_loader.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/tests/test_utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/datasets/utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connection.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/local.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/openai.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/connectors/remote.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/environment.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/adk.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/anthropic.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/gemini.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/langchain.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/llamaindex.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/integrations/openai.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/mock.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/router.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/scenarios.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_connection.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_environment.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_integrations.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_local_connectors.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_scenarios.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_session_id.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/tests/test_tools.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/formats.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/schema.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/environment/utils/tool_wrappers.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/display.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/instrument.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/manager.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/parallel.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_eval.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_manager.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_parallel.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/tests/test_task.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/eval/utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/native/chat.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/patches/warnings.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/py.typed +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/helper/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/low_level.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/router.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/server.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_add_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_handlers.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_integration.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_mcp_server_more.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_prefix_naming.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_run_wrapper.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_server_extra.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/server/tests/test_sigterm_runner.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/chat.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/chat_service.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/reply_metadata.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/test_chat.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/services/tests/test_chat_service.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/settings.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/exceptions.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/hints.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/requests.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_exceptions.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_hints.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/shared/tests/test_requests.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/exporter.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_eval_telemetry.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_exporter.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/telemetry/tests/test_instrument.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/agent.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/apply_patch.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/bash.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/edit.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/gemini_edit.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/gemini_shell.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/session.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/shell.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_apply_patch.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash_extended.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_bash_integration.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_edit.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_gemini_tools.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/tests/test_shell.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/coding/utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/anthropic.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/gemini.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/glm.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/hud.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/openai.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/qwen.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/settings.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_compression.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_computer.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_computer_actions.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/computer/tests/test_glm_computer.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/elicitation.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/pyautogui.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/test_base_executor.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/tests/test_pyautogui_executor.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/executors/xdo.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/gemini.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/glob.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/grep.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/list.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/read.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_glob.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_grep.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_list.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/filesystem/tests/test_read.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/config.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/grounded_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/grounder.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/grounding/tests/test_grounded_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/code_execution.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/google_search.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/tool_search.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/url_context.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/web_fetch.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/hosted/web_search.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/jupyter.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_claude.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_gemini.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/memory/tests/test_session.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/native_types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/playwright.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/response.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/submit.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_agent_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_base.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_elicitation.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_jupyter_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_native_tool_e2e.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_native_types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_playwright_tool.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_response.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_submit.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_tools.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_tools_init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/tests/test_utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/tools/utils.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/types.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/env.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/mcp.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/pretty_errors.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/strict_schema.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/__init__.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_init.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_pretty_errors.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tests/test_tool_shorthand.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/tool_shorthand.py +0 -0
- {hud_python-0.5.34 → hud_python-0.5.35}/hud/utils/types.py +0 -0
|
@@ -336,12 +336,15 @@ class MCPAgent(ABC):
|
|
|
336
336
|
f"Available tools: {sorted(available_tool_names)}"
|
|
337
337
|
)
|
|
338
338
|
|
|
339
|
-
self.
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
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
|
|
149
|
-
"
|
|
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
|
|
98
|
-
"
|
|
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
|
|
123
|
-
"
|
|
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.
|
|
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(
|
|
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:
|
|
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
|
|
205
|
-
if "
|
|
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["
|
|
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["
|
|
233
|
+
if analysis["hubTools"]:
|
|
223
234
|
hub_tools = tools_tree.add("[bright_white]Hub Tools[/bright_white]")
|
|
224
|
-
for hub_name, functions in analysis["
|
|
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:
|
|
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
|
|
348
|
-
if "
|
|
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["
|
|
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["
|
|
368
|
+
if analysis["hubTools"]:
|
|
358
369
|
md.append("### Hub Tools")
|
|
359
|
-
for hub_name, functions in analysis["
|
|
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.
|
|
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(
|
|
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:
|