auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +1029 -2310
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +1021 -372
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +26 -9
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/file_monitor/test_file_monitor.py +307 -0
- autocoder/common/git_utils.py +51 -10
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
- autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
- autocoder/common/pruner/test_context_pruner.py +546 -0
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/__init__.py +15 -0
- autocoder/common/tokens/counter.py +44 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2729 -2052
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +386 -10
- autocoder/common/v2/agent/runner/__init__.py +31 -0
- autocoder/common/v2/agent/runner/base_runner.py +92 -0
- autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
- autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
- autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
- autocoder/common/v2/agent/runner/tool_display.py +589 -0
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +323 -334
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +156 -37
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/run_context.py +9 -0
- autocoder/sdk/__init__.py +50 -161
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +158 -170
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -267
- autocoder/sdk/core/bridge.py +298 -118
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-0.1.400.dist-info/METADATA +0 -396
- auto_coder-0.1.400.dist-info/RECORD +0 -425
- auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
测试 MCP 工具模块的 KeyboardInterrupt 处理
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import sys
|
|
7
|
+
import time
|
|
8
|
+
import signal
|
|
9
|
+
import threading
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
# 添加项目根目录到 Python 路径
|
|
13
|
+
project_root = Path(__file__).parent.parent.parent.parent
|
|
14
|
+
sys.path.insert(0, str(project_root))
|
|
15
|
+
|
|
16
|
+
from autocoder.common.mcp_tools import get_mcp_server, McpRequest
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_keyboard_interrupt():
|
|
20
|
+
"""测试 KeyboardInterrupt 是否能正确处理"""
|
|
21
|
+
print("🧪 测试 MCP 工具模块的 KeyboardInterrupt 处理")
|
|
22
|
+
print("=" * 50)
|
|
23
|
+
|
|
24
|
+
# 获取 MCP 服务器实例
|
|
25
|
+
print("1. 获取 MCP 服务器实例...")
|
|
26
|
+
server = get_mcp_server()
|
|
27
|
+
print(f" ✓ 服务器实例创建成功: {server}")
|
|
28
|
+
|
|
29
|
+
# 测试基本请求
|
|
30
|
+
print("\n2. 测试基本请求...")
|
|
31
|
+
try:
|
|
32
|
+
request = McpRequest(query="test query")
|
|
33
|
+
print(f" ✓ 请求创建成功: {request}")
|
|
34
|
+
except Exception as e:
|
|
35
|
+
print(f" ✗ 请求创建失败: {e}")
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
# 设置定时器,5秒后发送 KeyboardInterrupt
|
|
39
|
+
def send_interrupt():
|
|
40
|
+
print("\n⏰ 5秒后将发送 KeyboardInterrupt 信号...")
|
|
41
|
+
time.sleep(5)
|
|
42
|
+
print("📡 发送 KeyboardInterrupt 信号")
|
|
43
|
+
import os
|
|
44
|
+
os.kill(os.getpid(), signal.SIGINT)
|
|
45
|
+
|
|
46
|
+
# 启动定时器线程
|
|
47
|
+
timer_thread = threading.Thread(target=send_interrupt, daemon=True)
|
|
48
|
+
timer_thread.start()
|
|
49
|
+
|
|
50
|
+
# 保持程序运行,等待中断信号
|
|
51
|
+
print("\n3. 等待 KeyboardInterrupt 信号...")
|
|
52
|
+
print(" (或者您可以手动按 Ctrl+C 来测试)")
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
while True:
|
|
56
|
+
time.sleep(1)
|
|
57
|
+
print(" ⏳ 程序正在运行...")
|
|
58
|
+
except KeyboardInterrupt:
|
|
59
|
+
print("\n✅ KeyboardInterrupt 信号被正确捕获!")
|
|
60
|
+
print(" 正在进行清理...")
|
|
61
|
+
|
|
62
|
+
# 等待一下,让清理完成
|
|
63
|
+
time.sleep(2)
|
|
64
|
+
print("✅ 清理完成,程序即将退出")
|
|
65
|
+
return True
|
|
66
|
+
except Exception as e:
|
|
67
|
+
print(f"\n❌ 发生意外错误: {e}")
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def main():
|
|
72
|
+
"""主函数"""
|
|
73
|
+
print("🚀 开始测试 MCP 工具模块的 KeyboardInterrupt 处理")
|
|
74
|
+
|
|
75
|
+
try:
|
|
76
|
+
success = test_keyboard_interrupt()
|
|
77
|
+
if success:
|
|
78
|
+
print("\n🎉 测试成功!MCP 工具模块可以正确处理 KeyboardInterrupt")
|
|
79
|
+
return 0
|
|
80
|
+
else:
|
|
81
|
+
print("\n❌ 测试失败!MCP 工具模块无法正确处理 KeyboardInterrupt")
|
|
82
|
+
return 1
|
|
83
|
+
except Exception as e:
|
|
84
|
+
print(f"\n💥 测试过程中发生异常: {e}")
|
|
85
|
+
import traceback
|
|
86
|
+
traceback.print_exc()
|
|
87
|
+
return 1
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
exit_code = main()
|
|
92
|
+
print(f"\n🏁 测试结束,退出代码: {exit_code}")
|
|
93
|
+
sys.exit(exit_code)
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test suite for MCP Tools Module
|
|
3
|
+
|
|
4
|
+
This module provides comprehensive tests for all MCP tools functionality,
|
|
5
|
+
including server connections, tool execution, and configuration management.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import pytest
|
|
9
|
+
import asyncio
|
|
10
|
+
import json
|
|
11
|
+
import tempfile
|
|
12
|
+
import os
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from unittest.mock import Mock, patch, AsyncMock
|
|
15
|
+
import threading
|
|
16
|
+
import time
|
|
17
|
+
|
|
18
|
+
from .types import (
|
|
19
|
+
McpRequest, McpInstallRequest, McpRemoveRequest, McpListRequest,
|
|
20
|
+
McpListRunningRequest, McpRefreshRequest, McpServerInfoRequest,
|
|
21
|
+
McpResponse, ServerInfo, InstallResult, RemoveResult, ListResult,
|
|
22
|
+
ListRunningResult, RefreshResult, QueryResult, ErrorResult,
|
|
23
|
+
StringResult, MarketplaceAddRequest, MarketplaceAddResult,
|
|
24
|
+
MarketplaceUpdateRequest, MarketplaceUpdateResult, MarketplaceMCPServerItem,
|
|
25
|
+
McpToolCall, McpResourceAccess
|
|
26
|
+
)
|
|
27
|
+
from .hub import McpHub, MCP_BUILD_IN_SERVERS
|
|
28
|
+
from .executor import McpExecutor
|
|
29
|
+
from .installer import McpServerInstaller
|
|
30
|
+
from .server import McpServer, get_mcp_server
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TestMcpTypes:
|
|
34
|
+
"""Test MCP type definitions"""
|
|
35
|
+
|
|
36
|
+
def test_mcp_request_creation(self):
|
|
37
|
+
"""Test creating McpRequest"""
|
|
38
|
+
request = McpRequest(query="test query")
|
|
39
|
+
assert request.query == "test query"
|
|
40
|
+
assert request.model is None
|
|
41
|
+
assert request.product_mode is None
|
|
42
|
+
|
|
43
|
+
def test_mcp_install_request_creation(self):
|
|
44
|
+
"""Test creating McpInstallRequest"""
|
|
45
|
+
request = McpInstallRequest(server_name_or_config="test-server")
|
|
46
|
+
assert request.server_name_or_config == "test-server"
|
|
47
|
+
assert request.market_install_item is None
|
|
48
|
+
|
|
49
|
+
def test_marketplace_item_creation(self):
|
|
50
|
+
"""Test creating MarketplaceMCPServerItem"""
|
|
51
|
+
item = MarketplaceMCPServerItem(
|
|
52
|
+
name="test-server",
|
|
53
|
+
description="Test server",
|
|
54
|
+
mcp_type="command",
|
|
55
|
+
command="python",
|
|
56
|
+
args=["-m", "test"],
|
|
57
|
+
env={"PATH": "/usr/bin"}
|
|
58
|
+
)
|
|
59
|
+
assert item.name == "test-server"
|
|
60
|
+
assert item.description == "Test server"
|
|
61
|
+
assert item.mcp_type == "command"
|
|
62
|
+
assert item.command == "python"
|
|
63
|
+
assert item.args == ["-m", "test"]
|
|
64
|
+
assert item.env == {"PATH": "/usr/bin"}
|
|
65
|
+
|
|
66
|
+
def test_mcp_tool_call_creation(self):
|
|
67
|
+
"""Test creating McpToolCall"""
|
|
68
|
+
tool_call = McpToolCall(
|
|
69
|
+
server_name="test-server",
|
|
70
|
+
tool_name="test-tool",
|
|
71
|
+
arguments={"param1": "value1"}
|
|
72
|
+
)
|
|
73
|
+
assert tool_call.server_name == "test-server"
|
|
74
|
+
assert tool_call.tool_name == "test-tool"
|
|
75
|
+
assert tool_call.arguments == {"param1": "value1"}
|
|
76
|
+
|
|
77
|
+
def test_mcp_resource_access_creation(self):
|
|
78
|
+
"""Test creating McpResourceAccess"""
|
|
79
|
+
resource_access = McpResourceAccess(
|
|
80
|
+
server_name="test-server",
|
|
81
|
+
uri="file:///test.txt"
|
|
82
|
+
)
|
|
83
|
+
assert resource_access.server_name == "test-server"
|
|
84
|
+
assert resource_access.uri == "file:///test.txt"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class TestMcpHub:
|
|
88
|
+
"""Test MCP Hub functionality"""
|
|
89
|
+
|
|
90
|
+
def test_singleton_behavior(self):
|
|
91
|
+
"""Test that McpHub is a singleton"""
|
|
92
|
+
hub1 = McpHub()
|
|
93
|
+
hub2 = McpHub()
|
|
94
|
+
assert hub1 is hub2
|
|
95
|
+
|
|
96
|
+
def test_settings_file_creation(self):
|
|
97
|
+
"""Test that settings file is created"""
|
|
98
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
99
|
+
settings_path = Path(tmp_dir) / "settings.json"
|
|
100
|
+
hub = McpHub(settings_path=str(settings_path))
|
|
101
|
+
assert settings_path.exists()
|
|
102
|
+
|
|
103
|
+
with open(settings_path) as f:
|
|
104
|
+
data = json.load(f)
|
|
105
|
+
assert "mcpServers" in data
|
|
106
|
+
assert data["mcpServers"] == {}
|
|
107
|
+
|
|
108
|
+
def test_marketplace_file_creation(self):
|
|
109
|
+
"""Test that marketplace file is created"""
|
|
110
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
111
|
+
marketplace_path = Path(tmp_dir) / "marketplace.json"
|
|
112
|
+
hub = McpHub(marketplace_path=str(marketplace_path))
|
|
113
|
+
assert marketplace_path.exists()
|
|
114
|
+
|
|
115
|
+
with open(marketplace_path) as f:
|
|
116
|
+
data = json.load(f)
|
|
117
|
+
assert "mcpServers" in data
|
|
118
|
+
assert data["mcpServers"] == []
|
|
119
|
+
|
|
120
|
+
def test_get_marketplace_items(self):
|
|
121
|
+
"""Test getting marketplace items"""
|
|
122
|
+
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
123
|
+
marketplace_path = Path(tmp_dir) / "marketplace.json"
|
|
124
|
+
# Create test marketplace data
|
|
125
|
+
test_data = {
|
|
126
|
+
"mcpServers": [
|
|
127
|
+
{
|
|
128
|
+
"name": "test-server",
|
|
129
|
+
"description": "Test server",
|
|
130
|
+
"mcp_type": "command",
|
|
131
|
+
"command": "python",
|
|
132
|
+
"args": ["-m", "test"],
|
|
133
|
+
"env": {},
|
|
134
|
+
"url": ""
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
with open(marketplace_path, 'w') as f:
|
|
139
|
+
json.dump(test_data, f)
|
|
140
|
+
|
|
141
|
+
hub = McpHub(marketplace_path=str(marketplace_path))
|
|
142
|
+
items = hub.get_marketplace_items()
|
|
143
|
+
assert len(items) == 1
|
|
144
|
+
assert items[0].name == "test-server"
|
|
145
|
+
|
|
146
|
+
def test_server_templates(self):
|
|
147
|
+
"""Test getting server templates"""
|
|
148
|
+
templates = McpHub.get_server_templates()
|
|
149
|
+
assert isinstance(templates, dict)
|
|
150
|
+
# Should have at least some built-in servers
|
|
151
|
+
assert len(templates) >= 0
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class TestMcpExecutor:
|
|
155
|
+
"""Test MCP Executor functionality"""
|
|
156
|
+
|
|
157
|
+
def test_executor_creation(self):
|
|
158
|
+
"""Test creating McpExecutor"""
|
|
159
|
+
mock_hub = Mock()
|
|
160
|
+
mock_llm = Mock()
|
|
161
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
162
|
+
assert executor.mcp_hub == mock_hub
|
|
163
|
+
assert executor.llm == mock_llm
|
|
164
|
+
|
|
165
|
+
def test_get_server_names_empty(self):
|
|
166
|
+
"""Test get_server_names with no servers"""
|
|
167
|
+
mock_hub = Mock()
|
|
168
|
+
mock_hub.get_servers.return_value = []
|
|
169
|
+
mock_llm = Mock()
|
|
170
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
171
|
+
|
|
172
|
+
result = executor.get_server_names()
|
|
173
|
+
assert result == "(None running currently)"
|
|
174
|
+
|
|
175
|
+
def test_get_server_names_with_servers(self):
|
|
176
|
+
"""Test get_server_names with servers"""
|
|
177
|
+
mock_hub = Mock()
|
|
178
|
+
mock_server1 = Mock()
|
|
179
|
+
mock_server1.name = "server1"
|
|
180
|
+
mock_server2 = Mock()
|
|
181
|
+
mock_server2.name = "server2"
|
|
182
|
+
mock_hub.get_servers.return_value = [mock_server1, mock_server2]
|
|
183
|
+
mock_llm = Mock()
|
|
184
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
185
|
+
|
|
186
|
+
result = executor.get_server_names()
|
|
187
|
+
assert result == "server1,server2"
|
|
188
|
+
|
|
189
|
+
@pytest.mark.asyncio
|
|
190
|
+
async def test_extract_mcp_calls_tool_call(self):
|
|
191
|
+
"""Test extracting MCP tool calls from content"""
|
|
192
|
+
mock_hub = Mock()
|
|
193
|
+
mock_llm = Mock()
|
|
194
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
195
|
+
|
|
196
|
+
content = """
|
|
197
|
+
<use_mcp_tool>
|
|
198
|
+
<server_name>test-server</server_name>
|
|
199
|
+
<tool_name>test-tool</tool_name>
|
|
200
|
+
<arguments>
|
|
201
|
+
{
|
|
202
|
+
"param1": "value1",
|
|
203
|
+
"param2": "value2"
|
|
204
|
+
}
|
|
205
|
+
</arguments>
|
|
206
|
+
</use_mcp_tool>
|
|
207
|
+
"""
|
|
208
|
+
|
|
209
|
+
calls = await executor.extract_mcp_calls(content)
|
|
210
|
+
assert len(calls) == 1
|
|
211
|
+
assert isinstance(calls[0], McpToolCall)
|
|
212
|
+
assert calls[0].server_name == "test-server"
|
|
213
|
+
assert calls[0].tool_name == "test-tool"
|
|
214
|
+
assert calls[0].arguments == {"param1": "value1", "param2": "value2"}
|
|
215
|
+
|
|
216
|
+
@pytest.mark.asyncio
|
|
217
|
+
async def test_extract_mcp_calls_resource_access(self):
|
|
218
|
+
"""Test extracting MCP resource access from content"""
|
|
219
|
+
mock_hub = Mock()
|
|
220
|
+
mock_llm = Mock()
|
|
221
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
222
|
+
|
|
223
|
+
content = """
|
|
224
|
+
<access_mcp_resource>
|
|
225
|
+
<server_name>test-server</server_name>
|
|
226
|
+
<uri>file:///test.txt</uri>
|
|
227
|
+
</access_mcp_resource>
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
calls = await executor.extract_mcp_calls(content)
|
|
231
|
+
assert len(calls) == 1
|
|
232
|
+
assert isinstance(calls[0], McpResourceAccess)
|
|
233
|
+
assert calls[0].server_name == "test-server"
|
|
234
|
+
assert calls[0].uri == "file:///test.txt"
|
|
235
|
+
|
|
236
|
+
def test_format_mcp_result_none(self):
|
|
237
|
+
"""Test formatting None result"""
|
|
238
|
+
mock_hub = Mock()
|
|
239
|
+
mock_llm = Mock()
|
|
240
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
241
|
+
|
|
242
|
+
result = executor.format_mcp_result(None)
|
|
243
|
+
assert result == "(No result)"
|
|
244
|
+
|
|
245
|
+
def test_format_mcp_result_dict(self):
|
|
246
|
+
"""Test formatting dict result"""
|
|
247
|
+
mock_hub = Mock()
|
|
248
|
+
mock_llm = Mock()
|
|
249
|
+
executor = McpExecutor(mock_hub, mock_llm)
|
|
250
|
+
|
|
251
|
+
test_dict = {"key": "value"}
|
|
252
|
+
result = executor.format_mcp_result(test_dict)
|
|
253
|
+
assert '"key": "value"' in result
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
class TestMcpServerInstaller:
|
|
257
|
+
"""Test MCP Server Installer functionality"""
|
|
258
|
+
|
|
259
|
+
def test_installer_creation(self):
|
|
260
|
+
"""Test creating McpServerInstaller"""
|
|
261
|
+
installer = McpServerInstaller()
|
|
262
|
+
assert installer is not None
|
|
263
|
+
|
|
264
|
+
def test_deep_merge_dicts(self):
|
|
265
|
+
"""Test deep merging of dictionaries"""
|
|
266
|
+
installer = McpServerInstaller()
|
|
267
|
+
|
|
268
|
+
dict1 = {"a": 1, "b": {"c": 2}}
|
|
269
|
+
dict2 = {"b": {"d": 3}, "e": 4}
|
|
270
|
+
|
|
271
|
+
result = installer.deep_merge_dicts(dict1, dict2)
|
|
272
|
+
expected = {"a": 1, "b": {"c": 2, "d": 3}, "e": 4}
|
|
273
|
+
assert result == expected
|
|
274
|
+
|
|
275
|
+
def test_parse_command_line_args(self):
|
|
276
|
+
"""Test parsing command line arguments"""
|
|
277
|
+
installer = McpServerInstaller()
|
|
278
|
+
|
|
279
|
+
args = "--name test-server --command python --args -m test --env PATH=/usr/bin"
|
|
280
|
+
name, config = installer.parse_command_line_args(args)
|
|
281
|
+
|
|
282
|
+
assert name == "test-server"
|
|
283
|
+
assert config["command"] == "python"
|
|
284
|
+
assert config["args"] == ["-m", "test"]
|
|
285
|
+
assert config["env"] == {"PATH": "/usr/bin"}
|
|
286
|
+
|
|
287
|
+
def test_parse_json_config(self):
|
|
288
|
+
"""Test parsing JSON configuration"""
|
|
289
|
+
installer = McpServerInstaller()
|
|
290
|
+
|
|
291
|
+
json_config = '{"test-server": {"command": "python", "args": ["-m", "test"]}}'
|
|
292
|
+
name, config = installer.parse_json_config(json_config)
|
|
293
|
+
|
|
294
|
+
assert name == "test-server"
|
|
295
|
+
assert config["command"] == "python"
|
|
296
|
+
assert config["args"] == ["-m", "test"]
|
|
297
|
+
|
|
298
|
+
def test_process_market_install_item(self):
|
|
299
|
+
"""Test processing marketplace install item"""
|
|
300
|
+
installer = McpServerInstaller()
|
|
301
|
+
|
|
302
|
+
item = MarketplaceMCPServerItem(
|
|
303
|
+
name="test-server",
|
|
304
|
+
command="python",
|
|
305
|
+
args=["-m", "test"],
|
|
306
|
+
env={"PATH": "/usr/bin"}
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
name, config = installer.process_market_install_item(item)
|
|
310
|
+
|
|
311
|
+
assert name == "test-server"
|
|
312
|
+
assert config["command"] == "python"
|
|
313
|
+
assert config["args"] == ["-m", "test"]
|
|
314
|
+
assert config["env"] == {"PATH": "/usr/bin"}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
class TestMcpServer:
|
|
318
|
+
"""Test MCP Server functionality"""
|
|
319
|
+
|
|
320
|
+
def test_server_creation(self):
|
|
321
|
+
"""Test creating McpServer"""
|
|
322
|
+
server = McpServer()
|
|
323
|
+
assert server is not None
|
|
324
|
+
assert not server._running
|
|
325
|
+
|
|
326
|
+
def test_server_start_stop(self):
|
|
327
|
+
"""Test starting and stopping server"""
|
|
328
|
+
server = McpServer()
|
|
329
|
+
|
|
330
|
+
# Start server
|
|
331
|
+
server.start()
|
|
332
|
+
assert server._running
|
|
333
|
+
|
|
334
|
+
# Stop server
|
|
335
|
+
server.stop()
|
|
336
|
+
assert not server._running
|
|
337
|
+
|
|
338
|
+
def test_get_mcp_server_singleton(self):
|
|
339
|
+
"""Test get_mcp_server singleton behavior"""
|
|
340
|
+
server1 = get_mcp_server()
|
|
341
|
+
server2 = get_mcp_server()
|
|
342
|
+
assert server1 is server2
|
|
343
|
+
|
|
344
|
+
def test_send_request_basic(self):
|
|
345
|
+
"""Test sending basic request"""
|
|
346
|
+
server = McpServer()
|
|
347
|
+
|
|
348
|
+
# Mock the request processing
|
|
349
|
+
with patch.object(server, '_process_request') as mock_process:
|
|
350
|
+
request = McpRequest(query="test")
|
|
351
|
+
|
|
352
|
+
# This test is limited because we can't easily mock the async queue
|
|
353
|
+
# In a real test, we'd need to set up the full async infrastructure
|
|
354
|
+
pass
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class TestIntegration:
|
|
358
|
+
"""Integration tests for the MCP tools module"""
|
|
359
|
+
|
|
360
|
+
def test_module_import(self):
|
|
361
|
+
"""Test that all modules can be imported"""
|
|
362
|
+
from . import (
|
|
363
|
+
McpHub, McpExecutor, McpServerInstaller, McpServer,
|
|
364
|
+
get_mcp_server, McpRequest, McpResponse
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# All imports should work without errors
|
|
368
|
+
assert McpHub is not None
|
|
369
|
+
assert McpExecutor is not None
|
|
370
|
+
assert McpServerInstaller is not None
|
|
371
|
+
assert McpServer is not None
|
|
372
|
+
assert get_mcp_server is not None
|
|
373
|
+
assert McpRequest is not None
|
|
374
|
+
assert McpResponse is not None
|
|
375
|
+
|
|
376
|
+
def test_basic_workflow(self):
|
|
377
|
+
"""Test basic MCP workflow"""
|
|
378
|
+
# Create components
|
|
379
|
+
server = get_mcp_server()
|
|
380
|
+
assert server is not None
|
|
381
|
+
|
|
382
|
+
# Create request
|
|
383
|
+
request = McpRequest(query="test query")
|
|
384
|
+
assert request.query == "test query"
|
|
385
|
+
|
|
386
|
+
# Note: Full integration test would require actual MCP server setup
|
|
387
|
+
# which is beyond the scope of unit tests
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
if __name__ == "__main__":
|
|
391
|
+
pytest.main([__file__, "-v"])
|