hanzo-mcp 0.8.15__tar.gz → 0.9.1__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 hanzo-mcp might be problematic. Click here for more details.
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/PKG-INFO +1 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/__init__.py +1 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli.py +108 -4
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/__init__.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent_tool.py +3 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/agent_tool_v1_deprecated.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/clarification_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/claude_desktop_auth.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/cli_agent_base.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/cli_tools.py +26 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/code_auth_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/critic_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/iching_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/network_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/review_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_alias.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_tool.py +3 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/swarm_tool_v1_deprecated.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/unified_cli_tools.py +5 -0
- hanzo_mcp-0.9.1/hanzo_mcp/tools/common/auto_timeout.py +234 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/base.py +4 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/batch_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/config_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/critic_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/paginated_base.py +4 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/stats.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/thinking_tool.py +5 -0
- hanzo_mcp-0.9.1/hanzo_mcp/tools/common/timeout_parser.py +103 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_disable.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_enable.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/tool_list.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/config_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/mode_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_add.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_query.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_remove.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_search.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/graph_stats.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_query.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_search.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/sql_stats.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_command.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_edit.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/neovim_session.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/ast_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/batch_search.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/content_replace.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/diff.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/directory_tree.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/directory_tree_paginated.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/edit.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/find.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/find_files.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/git_search.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/grep.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/multi_edit.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/read.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/rules_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/search_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/symbols_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/tree.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/watch.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/write.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/jupyter.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/notebook_edit.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/notebook_read.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/consensus_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_manage.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/llm_unified.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/provider_tools.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/lsp/lsp_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_add.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_remove.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_stats.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/mcp_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/knowledge_tools.py +14 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/memory_tools.py +17 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/find_tool.py +3 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/unified_search.py +3 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/base_process.py +4 -2
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_tool.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/logs.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx_background.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/npx_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/open.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/pkill.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/process_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/processes.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_background.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_command.py +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/run_command_windows.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/streaming_command.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx_background.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/uvx_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/zsh_tool.py +3 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo_read.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/todo_write.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/index_tool.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector_index.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/vector_search.py +5 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/PKG-INFO +1 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/SOURCES.txt +2 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/pyproject.toml +1 -1
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/README.md +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/__main__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/analytics/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/analytics/posthog_analytics.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/bridge.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli_enhanced.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/cli_plugin.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/compute_nodes.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/settings.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/config/tool_config.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/core/base_agent.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/core/model_registry.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/dev_server.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/compact_conversation.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/create_release.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/enhanced_prompts.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/example_custom_prompt.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/project_system.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/project_todo_reminder.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/tool_explorer.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/prompts/utils.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/server.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/server_enhanced.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/clarification_protocol.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/claude_cli_tool.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/code_auth.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/codex_cli_tool.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/gemini_cli_tool.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/grok_cli_tool.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/prompt.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/agent/tool_adapter.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/context.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/context_fix.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/decorators.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/enhanced_base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/fastmcp_pagination.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/forgiving_edit.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/mode.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/mode_loader.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/paginated_response.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/pagination.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/permissions.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/personality.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/plugin_loader.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/test_helpers.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/truncate.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/common/validation.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/config/index_config.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/database/database_manager.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/editor/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/ast_multi_edit.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/filesystem/unix_aliases.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/jupyter/base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/llm/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/lsp/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/mcp/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/memory/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/search/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/auto_background.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_session.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/bash_session_executor.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/command_executor.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/session_manager.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/shell/session_storage.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/todo/base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/__init__.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/ast_analyzer.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/git_ingester.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/infinity_store.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/mock_infinity.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/tools/vector/project_manager.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp/types.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/dependency_links.txt +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/entry_points.txt +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/requires.txt +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/hanzo_mcp.egg-info/top_level.txt +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/setup.cfg +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_agent_tools_ci.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_async_support.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_batch_tool_edge_cases.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli_agents_consolidated.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_cli_tools.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_e2e_demo.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_e2e_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_failure_cases.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_ffind.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_integration.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_find_tool_registration.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_git_ingestion.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_agents_integration.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_integration.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_local.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_mcp_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_hanzo_network_integration.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_litellm_warnings.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_lsp_tool.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_manual.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_base.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_basic.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_consolidated.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_memory_utils.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_new_tools.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_no_stubs.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_performance.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_search.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_search_quality.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_shell_features.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_shell_tools.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_stdio_protocol.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_stdio_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_streaming_command.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_swarm_simple.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_tools_suite.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_unified_search.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_utils.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_vector_store.py +0 -0
- {hanzo_mcp-0.8.15 → hanzo_mcp-0.9.1}/tests/test_web3_integration.py +0 -0
|
@@ -15,6 +15,19 @@ import argparse
|
|
|
15
15
|
from typing import Any, cast
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
|
|
18
|
+
# Import timeout parser (deferred to avoid early imports)
|
|
19
|
+
def _parse_timeout_arg(timeout_str: str) -> float:
|
|
20
|
+
"""Parse timeout argument with human-readable format support."""
|
|
21
|
+
try:
|
|
22
|
+
from hanzo_mcp.tools.common.timeout_parser import parse_timeout
|
|
23
|
+
return parse_timeout(timeout_str)
|
|
24
|
+
except ImportError:
|
|
25
|
+
# Fallback if parser not available
|
|
26
|
+
try:
|
|
27
|
+
return float(timeout_str)
|
|
28
|
+
except ValueError:
|
|
29
|
+
raise ValueError(f"Invalid timeout format: '{timeout_str}'")
|
|
30
|
+
|
|
18
31
|
|
|
19
32
|
def main() -> None:
|
|
20
33
|
"""Run the CLI for the Hanzo AI server."""
|
|
@@ -150,9 +163,37 @@ def main() -> None:
|
|
|
150
163
|
_ = parser.add_argument(
|
|
151
164
|
"--command-timeout",
|
|
152
165
|
dest="command_timeout",
|
|
153
|
-
type=
|
|
154
|
-
default=
|
|
155
|
-
help="Default timeout for command execution
|
|
166
|
+
type=str,
|
|
167
|
+
default="120s",
|
|
168
|
+
help="Default timeout for command execution (default: 120s). Supports: 2min, 5m, 120s, 30sec, 1.5h",
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
_ = parser.add_argument(
|
|
172
|
+
"--timeout", "-t",
|
|
173
|
+
dest="tool_timeout",
|
|
174
|
+
type=str,
|
|
175
|
+
help="Default timeout for MCP tool operations (default: 2min). Supports: 2min, 5m, 120s, 30sec, 1.5h",
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
_ = parser.add_argument(
|
|
179
|
+
"--search-timeout",
|
|
180
|
+
dest="search_timeout",
|
|
181
|
+
type=str,
|
|
182
|
+
help="Timeout specifically for search operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
_ = parser.add_argument(
|
|
186
|
+
"--find-timeout",
|
|
187
|
+
dest="find_timeout",
|
|
188
|
+
type=str,
|
|
189
|
+
help="Timeout specifically for find operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
_ = parser.add_argument(
|
|
193
|
+
"--ast-timeout",
|
|
194
|
+
dest="ast_timeout",
|
|
195
|
+
type=str,
|
|
196
|
+
help="Timeout specifically for AST operations. Supports: 2min, 5m, 120s, 30sec, 1.5h",
|
|
156
197
|
)
|
|
157
198
|
|
|
158
199
|
_ = parser.add_argument(
|
|
@@ -206,6 +247,27 @@ def main() -> None:
|
|
|
206
247
|
help="Run in development mode with hot reload",
|
|
207
248
|
)
|
|
208
249
|
|
|
250
|
+
_ = parser.add_argument(
|
|
251
|
+
"--daemon",
|
|
252
|
+
action="store_true",
|
|
253
|
+
help="Run as daemon process for multiple agent connections",
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
_ = parser.add_argument(
|
|
257
|
+
"--socket-path",
|
|
258
|
+
dest="socket_path",
|
|
259
|
+
default="/tmp/hanzo-mcp.sock",
|
|
260
|
+
help="Unix socket path for daemon mode (default: /tmp/hanzo-mcp.sock)",
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
_ = parser.add_argument(
|
|
264
|
+
"--max-connections",
|
|
265
|
+
dest="max_connections",
|
|
266
|
+
type=int,
|
|
267
|
+
default=100,
|
|
268
|
+
help="Maximum number of concurrent connections in daemon mode (default: 100)",
|
|
269
|
+
)
|
|
270
|
+
|
|
209
271
|
_ = parser.add_argument(
|
|
210
272
|
"--install",
|
|
211
273
|
action="store_true",
|
|
@@ -222,10 +284,33 @@ def main() -> None:
|
|
|
222
284
|
pass
|
|
223
285
|
sys.stdout = original_stdout
|
|
224
286
|
|
|
287
|
+
# Parse timeout arguments with human-readable format support
|
|
288
|
+
command_timeout = _parse_timeout_arg(str(args.command_timeout))
|
|
289
|
+
|
|
290
|
+
# Set timeout environment variables from CLI args
|
|
291
|
+
if hasattr(args, 'tool_timeout') and args.tool_timeout:
|
|
292
|
+
tool_timeout = _parse_timeout_arg(args.tool_timeout)
|
|
293
|
+
os.environ["HANZO_MCP_TOOL_TIMEOUT"] = str(tool_timeout)
|
|
294
|
+
|
|
295
|
+
if hasattr(args, 'search_timeout') and args.search_timeout:
|
|
296
|
+
search_timeout = _parse_timeout_arg(args.search_timeout)
|
|
297
|
+
os.environ["HANZO_MCP_SEARCH_TIMEOUT"] = str(search_timeout)
|
|
298
|
+
|
|
299
|
+
if hasattr(args, 'find_timeout') and args.find_timeout:
|
|
300
|
+
find_timeout = _parse_timeout_arg(args.find_timeout)
|
|
301
|
+
os.environ["HANZO_MCP_FIND_TIMEOUT"] = str(find_timeout)
|
|
302
|
+
|
|
303
|
+
if hasattr(args, 'ast_timeout') and args.ast_timeout:
|
|
304
|
+
ast_timeout = _parse_timeout_arg(args.ast_timeout)
|
|
305
|
+
os.environ["HANZO_MCP_AST_TIMEOUT"] = str(ast_timeout)
|
|
306
|
+
|
|
225
307
|
# Cast args attributes to appropriate types to avoid 'Any' warnings
|
|
226
308
|
name: str = cast(str, args.name)
|
|
227
309
|
install: bool = cast(bool, args.install)
|
|
228
310
|
dev: bool = cast(bool, args.dev)
|
|
311
|
+
daemon: bool = cast(bool, args.daemon)
|
|
312
|
+
socket_path: str = cast(str, args.socket_path)
|
|
313
|
+
max_connections: int = cast(int, args.max_connections)
|
|
229
314
|
transport: str = cast(str, args.transport)
|
|
230
315
|
agent_model: str | None = cast(str | None, args.agent_model)
|
|
231
316
|
agent_max_tokens: int | None = cast(int | None, args.agent_max_tokens)
|
|
@@ -234,7 +319,6 @@ def main() -> None:
|
|
|
234
319
|
agent_max_iterations: int = cast(int, args.agent_max_iterations)
|
|
235
320
|
agent_max_tool_uses: int = cast(int, args.agent_max_tool_uses)
|
|
236
321
|
enable_agent_tool: bool = cast(bool, args.enable_agent_tool)
|
|
237
|
-
command_timeout: float = cast(float, args.command_timeout)
|
|
238
322
|
disable_write_tools: bool = cast(bool, args.disable_write_tools)
|
|
239
323
|
disable_search_tools: bool = cast(bool, args.disable_search_tools)
|
|
240
324
|
host: str = cast(str, args.host)
|
|
@@ -285,6 +369,26 @@ def main() -> None:
|
|
|
285
369
|
if not allowed_paths:
|
|
286
370
|
allowed_paths = [os.path.expanduser("~")]
|
|
287
371
|
|
|
372
|
+
# Set daemon mode environment variables
|
|
373
|
+
if daemon:
|
|
374
|
+
os.environ["HANZO_MCP_DAEMON"] = "true"
|
|
375
|
+
os.environ["HANZO_MCP_SOCKET_PATH"] = socket_path
|
|
376
|
+
os.environ["HANZO_MCP_MAX_CONNECTIONS"] = str(max_connections)
|
|
377
|
+
|
|
378
|
+
if transport != "stdio":
|
|
379
|
+
logger.info(f"Starting Hanzo MCP daemon on {socket_path}")
|
|
380
|
+
logger.info(f"Max connections: {max_connections}")
|
|
381
|
+
|
|
382
|
+
# Ensure only one daemon runs per socket
|
|
383
|
+
try:
|
|
384
|
+
import fcntl
|
|
385
|
+
lock_file = f"{socket_path}.lock"
|
|
386
|
+
with open(lock_file, 'w') as f:
|
|
387
|
+
fcntl.flock(f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
|
|
388
|
+
except (ImportError, IOError):
|
|
389
|
+
# Fallback for systems without fcntl or if lock fails
|
|
390
|
+
pass
|
|
391
|
+
|
|
288
392
|
# Run in dev mode if requested
|
|
289
393
|
if dev:
|
|
290
394
|
from hanzo_mcp.dev_server import DevServer
|
|
@@ -6,6 +6,8 @@ enabling concurrent execution of multiple operations and specialized processing.
|
|
|
6
6
|
|
|
7
7
|
from mcp.server import FastMCP
|
|
8
8
|
|
|
9
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
10
|
+
|
|
9
11
|
from hanzo_mcp.tools.common.base import BaseTool, ToolRegistry
|
|
10
12
|
|
|
11
13
|
# Import unified CLI tools (single source of truth)
|
|
@@ -78,6 +80,9 @@ def register_agent_tools(
|
|
|
78
80
|
def __init__(self, agent_tool: AgentTool):
|
|
79
81
|
self._agent = agent_tool
|
|
80
82
|
|
|
83
|
+
@auto_timeout("__init__")
|
|
84
|
+
|
|
85
|
+
|
|
81
86
|
async def call(self, ctx, **params): # type: ignore[override]
|
|
82
87
|
# Default to 5 agents unless explicitly provided
|
|
83
88
|
params = dict(params)
|
|
@@ -30,6 +30,8 @@ from pydantic import Field
|
|
|
30
30
|
from openai.types.chat import ChatCompletionMessageParam
|
|
31
31
|
from mcp.server.fastmcp import Context as MCPContext
|
|
32
32
|
|
|
33
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
34
|
+
|
|
33
35
|
from hanzo_mcp.tools.jupyter import get_read_only_jupyter_tools
|
|
34
36
|
from hanzo_mcp.tools.filesystem import get_read_only_filesystem_tools
|
|
35
37
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -212,6 +214,9 @@ Modes:
|
|
|
212
214
|
- rpc: Long-running agent for multiple calls (A2A support)"""
|
|
213
215
|
|
|
214
216
|
@override
|
|
217
|
+
@auto_timeout("agent")
|
|
218
|
+
|
|
219
|
+
|
|
215
220
|
async def call(
|
|
216
221
|
self,
|
|
217
222
|
ctx: MCPContext,
|
|
@@ -20,6 +20,8 @@ from typing import (
|
|
|
20
20
|
from mcp.server import FastMCP
|
|
21
21
|
from mcp.server.fastmcp import Context as MCPContext
|
|
22
22
|
|
|
23
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
24
|
+
|
|
23
25
|
# Import hanzo-agents SDK
|
|
24
26
|
try:
|
|
25
27
|
from hanzo_agents import (
|
|
@@ -338,6 +340,7 @@ Usage notes:
|
|
|
338
340
|
self.available_tools.append(BatchTool({t.name: t for t in self.available_tools}))
|
|
339
341
|
|
|
340
342
|
@override
|
|
343
|
+
@auto_timeout("agent")
|
|
341
344
|
async def call(
|
|
342
345
|
self,
|
|
343
346
|
ctx: MCPContext,
|
|
@@ -19,6 +19,8 @@ with warnings.catch_warnings():
|
|
|
19
19
|
import litellm
|
|
20
20
|
from pydantic import Field
|
|
21
21
|
from mcp.server import FastMCP
|
|
22
|
+
|
|
23
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
22
24
|
from openai.types.chat import ChatCompletionToolParam, ChatCompletionMessageParam
|
|
23
25
|
from mcp.server.fastmcp import Context as MCPContext
|
|
24
26
|
|
|
@@ -177,6 +179,9 @@ Usage notes:
|
|
|
177
179
|
self.review_protocol = ReviewProtocol()
|
|
178
180
|
|
|
179
181
|
@override
|
|
182
|
+
@auto_timeout("agent_tool_v1_deprecated")
|
|
183
|
+
|
|
184
|
+
|
|
180
185
|
async def call(
|
|
181
186
|
self,
|
|
182
187
|
ctx: MCPContext,
|
|
@@ -5,6 +5,7 @@ from typing import Any, Dict, List, Optional, override
|
|
|
5
5
|
from mcp.server import FastMCP
|
|
6
6
|
from mcp.server.fastmcp import Context as MCPContext
|
|
7
7
|
|
|
8
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
8
9
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
9
10
|
|
|
10
11
|
|
|
@@ -42,6 +43,7 @@ request_clarification(
|
|
|
42
43
|
options=["github.com/luxfi/node/common", "github.com/project/common"]
|
|
43
44
|
)"""
|
|
44
45
|
|
|
46
|
+
@auto_timeout("clarification")
|
|
45
47
|
async def call(
|
|
46
48
|
self,
|
|
47
49
|
ctx: MCPContext,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
1
3
|
"""Claude Desktop authentication management.
|
|
2
4
|
|
|
3
5
|
This module provides tools to automate Claude Desktop login/logout,
|
|
@@ -448,6 +450,9 @@ claude_auth ensure_agent swarm_agent_1"""
|
|
|
448
450
|
"""Initialize the auth tool."""
|
|
449
451
|
self.auth = ClaudeDesktopAuth()
|
|
450
452
|
|
|
453
|
+
@auto_timeout("claude_desktop_auth")
|
|
454
|
+
|
|
455
|
+
|
|
451
456
|
async def call(self, ctx, action: str = "status", **kwargs) -> str:
|
|
452
457
|
"""Execute auth action."""
|
|
453
458
|
tool_ctx = create_tool_context(ctx)
|
|
@@ -13,6 +13,8 @@ from typing import List, Optional
|
|
|
13
13
|
|
|
14
14
|
from mcp.server.fastmcp import Context as MCPContext
|
|
15
15
|
|
|
16
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
17
|
+
|
|
16
18
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
17
19
|
from hanzo_mcp.tools.common.context import create_tool_context
|
|
18
20
|
from hanzo_mcp.tools.common.permissions import PermissionManager
|
|
@@ -166,6 +168,9 @@ class CLIAgentBase(BaseTool):
|
|
|
166
168
|
await tool_ctx.error(f"{self.provider_name} error: {str(e)}")
|
|
167
169
|
return f"Error: {str(e)}"
|
|
168
170
|
|
|
171
|
+
@auto_timeout("cli_agent_base")
|
|
172
|
+
|
|
173
|
+
|
|
169
174
|
async def call(self, ctx: MCPContext, prompts: str, **kwargs) -> str:
|
|
170
175
|
"""Execute the CLI agent.
|
|
171
176
|
|
|
@@ -13,6 +13,8 @@ from pathlib import Path
|
|
|
13
13
|
|
|
14
14
|
from pydantic import Field
|
|
15
15
|
from mcp.server import FastMCP
|
|
16
|
+
|
|
17
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
16
18
|
from mcp.server.fastmcp import Context
|
|
17
19
|
|
|
18
20
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -186,6 +188,9 @@ class ClaudeCLITool(BaseCLITool):
|
|
|
186
188
|
def description(self) -> str:
|
|
187
189
|
return "Execute Claude CLI for AI assistance using Anthropic's models"
|
|
188
190
|
|
|
191
|
+
@auto_timeout("cli_tools")
|
|
192
|
+
|
|
193
|
+
|
|
189
194
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
190
195
|
prompt: str = params.get("prompt", "")
|
|
191
196
|
model: Optional[str] = params.get("model") or self.default_model
|
|
@@ -236,6 +241,9 @@ class CodexCLITool(BaseCLITool):
|
|
|
236
241
|
def description(self) -> str:
|
|
237
242
|
return "Execute OpenAI Codex/GPT-4 CLI for code generation and AI assistance"
|
|
238
243
|
|
|
244
|
+
@auto_timeout("cli_tools")
|
|
245
|
+
|
|
246
|
+
|
|
239
247
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
240
248
|
prompt: str = params.get("prompt", "")
|
|
241
249
|
model: Optional[str] = params.get("model") or self.default_model
|
|
@@ -274,6 +282,9 @@ class GeminiCLITool(BaseCLITool):
|
|
|
274
282
|
def description(self) -> str:
|
|
275
283
|
return "Execute Google Gemini CLI for multimodal AI assistance"
|
|
276
284
|
|
|
285
|
+
@auto_timeout("cli_tools")
|
|
286
|
+
|
|
287
|
+
|
|
277
288
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
278
289
|
prompt: str = params.get("prompt", "")
|
|
279
290
|
model: Optional[str] = params.get("model") or self.default_model
|
|
@@ -312,6 +323,9 @@ class GrokCLITool(BaseCLITool):
|
|
|
312
323
|
def description(self) -> str:
|
|
313
324
|
return "Execute xAI Grok CLI for real-time AI assistance"
|
|
314
325
|
|
|
326
|
+
@auto_timeout("cli_tools")
|
|
327
|
+
|
|
328
|
+
|
|
315
329
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
316
330
|
prompt: str = params.get("prompt", "")
|
|
317
331
|
model: Optional[str] = params.get("model") or self.default_model
|
|
@@ -350,6 +364,9 @@ class OpenHandsCLITool(BaseCLITool):
|
|
|
350
364
|
def description(self) -> str:
|
|
351
365
|
return "Execute OpenHands (OpenDevin) for autonomous coding assistance"
|
|
352
366
|
|
|
367
|
+
@auto_timeout("cli_tools")
|
|
368
|
+
|
|
369
|
+
|
|
353
370
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
354
371
|
prompt = params.get("prompt", "")
|
|
355
372
|
model = params.get("model") or self.default_model
|
|
@@ -400,6 +417,9 @@ class HanzoDevCLITool(BaseCLITool):
|
|
|
400
417
|
def description(self) -> str:
|
|
401
418
|
return "Execute Hanzo Dev for AI-powered code editing and development"
|
|
402
419
|
|
|
420
|
+
@auto_timeout("cli_tools")
|
|
421
|
+
|
|
422
|
+
|
|
403
423
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
404
424
|
prompt = params.get("prompt", "")
|
|
405
425
|
model = params.get("model") or self.default_model
|
|
@@ -438,6 +458,9 @@ class ClineCLITool(BaseCLITool):
|
|
|
438
458
|
def description(self) -> str:
|
|
439
459
|
return "Execute Cline for autonomous coding with Claude"
|
|
440
460
|
|
|
461
|
+
@auto_timeout("cli_tools")
|
|
462
|
+
|
|
463
|
+
|
|
441
464
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
442
465
|
prompt = params.get("prompt", "")
|
|
443
466
|
working_dir: str = params.get("working_dir") or os.getcwd()
|
|
@@ -473,6 +496,9 @@ class AiderCLITool(BaseCLITool):
|
|
|
473
496
|
def description(self) -> str:
|
|
474
497
|
return "Execute Aider for AI pair programming"
|
|
475
498
|
|
|
499
|
+
@auto_timeout("cli_tools")
|
|
500
|
+
|
|
501
|
+
|
|
476
502
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
477
503
|
prompt = params.get("prompt", "")
|
|
478
504
|
model = params.get("model") or self.default_model
|
|
@@ -6,6 +6,8 @@ This tool manages API keys and accounts for Claude Code and other AI coding tool
|
|
|
6
6
|
from typing import Unpack, Optional, TypedDict, final, override
|
|
7
7
|
|
|
8
8
|
from mcp.server import FastMCP
|
|
9
|
+
|
|
10
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
9
11
|
from mcp.server.fastmcp import Context as MCPContext
|
|
10
12
|
|
|
11
13
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -67,6 +69,9 @@ Providers: claude, openai, azure, deepseek, google, groq"""
|
|
|
67
69
|
self.auth_manager = CodeAuthManager()
|
|
68
70
|
|
|
69
71
|
@override
|
|
72
|
+
@auto_timeout("code_auth")
|
|
73
|
+
|
|
74
|
+
|
|
70
75
|
async def call(
|
|
71
76
|
self,
|
|
72
77
|
ctx: MCPContext,
|
|
@@ -6,6 +6,7 @@ from typing import List, Optional, override
|
|
|
6
6
|
from mcp.server import FastMCP
|
|
7
7
|
from mcp.server.fastmcp import Context as MCPContext
|
|
8
8
|
|
|
9
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
9
10
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
10
11
|
|
|
11
12
|
|
|
@@ -57,6 +58,7 @@ critic(
|
|
|
57
58
|
specific_concerns="Are the imports in the correct format and location?"
|
|
58
59
|
)"""
|
|
59
60
|
|
|
61
|
+
@auto_timeout("critic")
|
|
60
62
|
async def call(
|
|
61
63
|
self,
|
|
62
64
|
ctx: MCPContext,
|
|
@@ -5,6 +5,8 @@ from enum import Enum
|
|
|
5
5
|
from typing import List, override
|
|
6
6
|
|
|
7
7
|
from mcp.server import FastMCP
|
|
8
|
+
|
|
9
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
8
10
|
from mcp.server.fastmcp import Context as MCPContext
|
|
9
11
|
|
|
10
12
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -599,6 +601,9 @@ Use this when you need:
|
|
|
599
601
|
super().__init__()
|
|
600
602
|
self.oracle = IChing()
|
|
601
603
|
|
|
604
|
+
@auto_timeout("iching")
|
|
605
|
+
|
|
606
|
+
|
|
602
607
|
async def call(self, ctx: MCPContext, challenge: str) -> str:
|
|
603
608
|
"""Cast I Ching and provide guidance."""
|
|
604
609
|
# Cast hexagram
|
|
@@ -18,6 +18,8 @@ from typing import (
|
|
|
18
18
|
|
|
19
19
|
from pydantic import Field
|
|
20
20
|
from mcp.server import FastMCP
|
|
21
|
+
|
|
22
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
21
23
|
from mcp.server.fastmcp import Context as MCPContext
|
|
22
24
|
|
|
23
25
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -104,6 +106,9 @@ class NetworkTool(BaseTool):
|
|
|
104
106
|
return self._cluster
|
|
105
107
|
|
|
106
108
|
@override
|
|
109
|
+
@auto_timeout("network")
|
|
110
|
+
|
|
111
|
+
|
|
107
112
|
async def call(self, ctx: MCPContext, **params: Unpack[NetworkToolParams]) -> str:
|
|
108
113
|
"""Execute a task on the agent network.
|
|
109
114
|
|
|
@@ -6,6 +6,7 @@ from typing import List, Optional, override
|
|
|
6
6
|
from mcp.server import FastMCP
|
|
7
7
|
from mcp.server.fastmcp import Context as MCPContext
|
|
8
8
|
|
|
9
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
9
10
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
10
11
|
|
|
11
12
|
|
|
@@ -57,6 +58,7 @@ review(
|
|
|
57
58
|
context="This will be used to automatically fix missing imports in Go files"
|
|
58
59
|
)"""
|
|
59
60
|
|
|
61
|
+
@auto_timeout("review")
|
|
60
62
|
async def call(
|
|
61
63
|
self,
|
|
62
64
|
ctx: MCPContext,
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
|
|
2
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
1
3
|
"""Swarm tool as an alias to Network tool for backward compatibility.
|
|
2
4
|
|
|
3
5
|
This module makes swarm an alias to the network tool, as network is the
|
|
@@ -63,6 +65,9 @@ For new code, prefer using 'network' directly."""
|
|
|
63
65
|
# Just pass through to NetworkTool
|
|
64
66
|
super().__init__(permission_manager=permission_manager, default_mode=default_mode, **kwargs)
|
|
65
67
|
|
|
68
|
+
@auto_timeout("swarm_alias")
|
|
69
|
+
|
|
70
|
+
|
|
66
71
|
async def call(self, **kwargs) -> str:
|
|
67
72
|
"""Execute swarm via network tool.
|
|
68
73
|
|
|
@@ -19,6 +19,8 @@ from typing import (
|
|
|
19
19
|
from mcp.server import FastMCP
|
|
20
20
|
from mcp.server.fastmcp import Context as MCPContext
|
|
21
21
|
|
|
22
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
23
|
+
|
|
22
24
|
# Import hanzo-agents SDK with fallback
|
|
23
25
|
try:
|
|
24
26
|
from hanzo_agents import (
|
|
@@ -508,6 +510,7 @@ Models can be specified as:
|
|
|
508
510
|
self.available_tools.append(BatchTool({t.name: t for t in self.available_tools}))
|
|
509
511
|
|
|
510
512
|
@override
|
|
513
|
+
@auto_timeout("swarm")
|
|
511
514
|
async def call(
|
|
512
515
|
self,
|
|
513
516
|
ctx: MCPContext,
|
|
@@ -18,6 +18,8 @@ from typing import (
|
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
from mcp.server import FastMCP
|
|
21
|
+
|
|
22
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
21
23
|
from mcp.server.fastmcp import Context as MCPContext
|
|
22
24
|
|
|
23
25
|
from hanzo_mcp.tools.common.base import BaseTool
|
|
@@ -203,6 +205,9 @@ Models can be specified as:
|
|
|
203
205
|
self.agent_max_tool_uses = agent_max_tool_uses
|
|
204
206
|
|
|
205
207
|
@override
|
|
208
|
+
@auto_timeout("swarm_tool_v1_deprecated")
|
|
209
|
+
|
|
210
|
+
|
|
206
211
|
async def call(
|
|
207
212
|
self,
|
|
208
213
|
ctx: MCPContext,
|
|
@@ -11,6 +11,8 @@ from typing import Any, Dict, List, Optional
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
13
|
from mcp.server import FastMCP
|
|
14
|
+
|
|
15
|
+
from hanzo_mcp.tools.common.auto_timeout import auto_timeout
|
|
14
16
|
from mcp.server.fastmcp import Context
|
|
15
17
|
|
|
16
18
|
from ..common.base import BaseTool
|
|
@@ -142,6 +144,9 @@ class UnifiedCLITool(BaseTool, CLIAgent):
|
|
|
142
144
|
command.append(prompt)
|
|
143
145
|
return command
|
|
144
146
|
|
|
147
|
+
@auto_timeout("unified_cli_tools")
|
|
148
|
+
|
|
149
|
+
|
|
145
150
|
async def call(self, ctx: Context[Any, Any, Any], **params: Any) -> str:
|
|
146
151
|
"""Execute the CLI tool via MCP interface.
|
|
147
152
|
|