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
|
@@ -9,18 +9,11 @@ from autocoder.index.index import IndexManager
|
|
|
9
9
|
from autocoder.index.types import (
|
|
10
10
|
IndexItem,
|
|
11
11
|
TargetFile,
|
|
12
|
-
VerifyFileRelevance,
|
|
13
|
-
FileList,
|
|
14
|
-
FileNumberList
|
|
12
|
+
VerifyFileRelevance,
|
|
15
13
|
)
|
|
16
14
|
from loguru import logger
|
|
17
|
-
|
|
18
|
-
queue_communicate,
|
|
19
|
-
CommunicateEvent,
|
|
20
|
-
CommunicateEventType,
|
|
21
|
-
)
|
|
15
|
+
|
|
22
16
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
23
|
-
import json
|
|
24
17
|
|
|
25
18
|
def get_file_path(file_path):
|
|
26
19
|
if file_path.startswith("##"):
|
|
@@ -40,7 +33,7 @@ class NormalFilter():
|
|
|
40
33
|
self.stats = stats
|
|
41
34
|
self.sources = sources
|
|
42
35
|
|
|
43
|
-
def filter(self, index_items: List[IndexItem], query: str) ->
|
|
36
|
+
def filter(self, index_items: List[IndexItem], query: str) -> NormalFilterResult:
|
|
44
37
|
|
|
45
38
|
final_files: Dict[str, TargetFile] = {}
|
|
46
39
|
if not self.args.skip_filter_index:
|
|
@@ -49,7 +42,8 @@ class NormalFilter():
|
|
|
49
42
|
"Phase 3: Performing Level 1 filtering (query-based)...")
|
|
50
43
|
|
|
51
44
|
phase_start = time.monotonic()
|
|
52
|
-
|
|
45
|
+
query_str = self.args.query or ""
|
|
46
|
+
target_files = self.index_manager.get_target_files_by_query(query_str)
|
|
53
47
|
|
|
54
48
|
if target_files:
|
|
55
49
|
for file in target_files.file_list:
|
|
@@ -14,7 +14,7 @@ from autocoder.index.types import (
|
|
|
14
14
|
TargetFile,
|
|
15
15
|
FileNumberList
|
|
16
16
|
)
|
|
17
|
-
from autocoder.
|
|
17
|
+
from autocoder.common.tokens import count_string_tokens as count_tokens
|
|
18
18
|
from autocoder.common.printer import Printer
|
|
19
19
|
from concurrent.futures import ThreadPoolExecutor
|
|
20
20
|
from byzerllm import MetaHolder
|
autocoder/index/index.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import json
|
|
3
3
|
import time
|
|
4
|
-
from typing import List,
|
|
4
|
+
from typing import List, Union, Any, Optional
|
|
5
5
|
from datetime import datetime
|
|
6
6
|
from autocoder.common import SourceCode, AutoCoderArgs
|
|
7
|
+
from autocoder.common.autocoderargs_parser import AutoCoderArgsParser
|
|
7
8
|
from autocoder.index.symbols_utils import (
|
|
8
9
|
extract_symbols,
|
|
9
10
|
SymbolType,
|
|
@@ -27,7 +28,7 @@ from autocoder.index.types import (
|
|
|
27
28
|
)
|
|
28
29
|
from autocoder.common.global_cancel import global_cancel
|
|
29
30
|
from autocoder.utils.llms import get_llm_names
|
|
30
|
-
from autocoder.
|
|
31
|
+
from autocoder.common.tokens import count_string_tokens as count_tokens
|
|
31
32
|
from autocoder.common.stream_out_type import IndexStreamOutType
|
|
32
33
|
from autocoder.events.event_manager_singleton import get_event_manager
|
|
33
34
|
from autocoder.events import event_content as EventContentCreator
|
|
@@ -35,7 +36,7 @@ from loguru import logger
|
|
|
35
36
|
|
|
36
37
|
class IndexManager:
|
|
37
38
|
def __init__(
|
|
38
|
-
self, llm: byzerllm.ByzerLLM, sources: List[SourceCode], args: AutoCoderArgs
|
|
39
|
+
self, llm: Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM], sources: List[SourceCode], args: AutoCoderArgs
|
|
39
40
|
):
|
|
40
41
|
self.sources = sources
|
|
41
42
|
self.source_dir = args.source_dir
|
|
@@ -48,12 +49,22 @@ class IndexManager:
|
|
|
48
49
|
self.index_dir = os.path.join(self.source_dir, ".auto-coder")
|
|
49
50
|
self.index_file = os.path.join(self.index_dir, "index.json")
|
|
50
51
|
if llm and (s := llm.get_sub_client("index_model")):
|
|
51
|
-
|
|
52
|
+
# 如果 s 是 list 则获取第一个,否则直接赋值
|
|
53
|
+
if isinstance(s, list) and len(s) > 0:
|
|
54
|
+
self.index_llm = s[0]
|
|
55
|
+
else:
|
|
56
|
+
self.index_llm = s
|
|
52
57
|
else:
|
|
53
58
|
self.index_llm = llm
|
|
54
59
|
|
|
55
60
|
if llm and (s := llm.get_sub_client("index_filter_model")):
|
|
56
|
-
|
|
61
|
+
# 如果 s 是 list 则获取第一个,否则直接赋值
|
|
62
|
+
if isinstance(s, list) and len(s) > 0:
|
|
63
|
+
self.index_filter_llm = s[0]
|
|
64
|
+
elif isinstance(s, byzerllm.SimpleByzerLLM) or isinstance(s, byzerllm.ByzerLLM):
|
|
65
|
+
self.index_filter_llm = s
|
|
66
|
+
else:
|
|
67
|
+
raise ValueError(f"index_filter_llm is not a valid LLM: {s}")
|
|
57
68
|
else:
|
|
58
69
|
self.index_filter_llm = llm
|
|
59
70
|
|
|
@@ -71,11 +82,26 @@ class IndexManager:
|
|
|
71
82
|
args.index_model_max_input_length or args.model_max_input_length
|
|
72
83
|
)
|
|
73
84
|
self.printer = Printer()
|
|
85
|
+
|
|
86
|
+
# Initialize AutoCoderArgs parser for flexible parameter parsing
|
|
87
|
+
self.args_parser = AutoCoderArgsParser()
|
|
74
88
|
|
|
75
89
|
# 如果索引目录不存在,则创建它
|
|
76
90
|
if not os.path.exists(self.index_dir):
|
|
77
91
|
os.makedirs(self.index_dir)
|
|
78
92
|
|
|
93
|
+
def _get_parsed_safe_zone_tokens(self) -> int:
|
|
94
|
+
"""
|
|
95
|
+
解析 conversation_prune_safe_zone_tokens 参数,支持多种格式
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
解析后的 token 数量
|
|
99
|
+
"""
|
|
100
|
+
return self.args_parser.parse_conversation_prune_safe_zone_tokens(
|
|
101
|
+
self.args.conversation_prune_safe_zone_tokens,
|
|
102
|
+
self.args.code_model
|
|
103
|
+
)
|
|
104
|
+
|
|
79
105
|
@byzerllm.prompt()
|
|
80
106
|
def verify_file_relevance(self, file_content: str, query: str) -> str:
|
|
81
107
|
"""
|
|
@@ -299,7 +325,7 @@ class IndexManager:
|
|
|
299
325
|
return False
|
|
300
326
|
|
|
301
327
|
def build_index_for_single_source(self, source: SourceCode):
|
|
302
|
-
global_cancel.check_and_raise(token=self.args.
|
|
328
|
+
global_cancel.check_and_raise(token=self.args.cancel_token)
|
|
303
329
|
|
|
304
330
|
file_path = source.module_name
|
|
305
331
|
if not os.path.exists(file_path):
|
|
@@ -336,13 +362,14 @@ class IndexManager:
|
|
|
336
362
|
total_input_cost = 0.0
|
|
337
363
|
total_output_cost = 0.0
|
|
338
364
|
|
|
339
|
-
|
|
365
|
+
parsed_safe_zone_tokens = self._get_parsed_safe_zone_tokens()
|
|
366
|
+
if count_tokens(source.source_code) > parsed_safe_zone_tokens:
|
|
340
367
|
self.printer.print_in_terminal(
|
|
341
368
|
"index_file_too_large",
|
|
342
369
|
style="yellow",
|
|
343
370
|
file_path=source.module_name,
|
|
344
371
|
file_size=len(source.source_code),
|
|
345
|
-
max_length=
|
|
372
|
+
max_length=parsed_safe_zone_tokens
|
|
346
373
|
)
|
|
347
374
|
chunks = self.split_text_into_chunks(
|
|
348
375
|
source_code, self.max_input_length - 1000
|
|
@@ -580,7 +607,7 @@ class IndexManager:
|
|
|
580
607
|
for source in wait_to_build_files
|
|
581
608
|
]
|
|
582
609
|
for future in as_completed(futures):
|
|
583
|
-
global_cancel.check_and_raise(token=self.args.
|
|
610
|
+
global_cancel.check_and_raise(token=self.args.cancel_token)
|
|
584
611
|
result = future.result()
|
|
585
612
|
if result is not None:
|
|
586
613
|
counter += 1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Index module tests package
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Test runner for the Index Module
|
|
4
|
+
|
|
5
|
+
This script runs all available tests for the index module using pytest
|
|
6
|
+
and provides a comprehensive report on the module's functionality.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python run_tests.py [--verbose] [--integration-only] [--unit-only] [--coverage]
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import sys
|
|
14
|
+
import subprocess
|
|
15
|
+
import argparse
|
|
16
|
+
|
|
17
|
+
def run_command(cmd, description):
|
|
18
|
+
"""Run a command and return success status"""
|
|
19
|
+
print(f"\n{'='*60}")
|
|
20
|
+
print(f"Running: {description}")
|
|
21
|
+
print(f"Command: {cmd}")
|
|
22
|
+
print('='*60)
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
result = subprocess.run(cmd, shell=True, check=True, capture_output=False)
|
|
26
|
+
print(f"✓ {description} completed successfully")
|
|
27
|
+
return True
|
|
28
|
+
except subprocess.CalledProcessError as e:
|
|
29
|
+
print(f"✗ {description} failed with exit code {e.returncode}")
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
def main():
|
|
33
|
+
parser = argparse.ArgumentParser(description="Run Index Module Tests with pytest")
|
|
34
|
+
parser.add_argument("--verbose", "-v", action="store_true", help="Verbose output")
|
|
35
|
+
parser.add_argument("--integration-only", action="store_true", help="Run only integration tests")
|
|
36
|
+
parser.add_argument("--unit-only", action="store_true", help="Run only unit tests")
|
|
37
|
+
parser.add_argument("--coverage", action="store_true", help="Run with coverage reporting")
|
|
38
|
+
parser.add_argument("--parallel", "-n", type=int, help="Run tests in parallel (requires pytest-xdist)")
|
|
39
|
+
|
|
40
|
+
args = parser.parse_args()
|
|
41
|
+
|
|
42
|
+
print("Index Module Test Runner (pytest)")
|
|
43
|
+
print("="*60)
|
|
44
|
+
|
|
45
|
+
# Get the directory of this script
|
|
46
|
+
test_dir = os.path.dirname(os.path.abspath(__file__))
|
|
47
|
+
os.chdir(test_dir)
|
|
48
|
+
|
|
49
|
+
# Build pytest command
|
|
50
|
+
pytest_args = ["python", "-m", "pytest"]
|
|
51
|
+
|
|
52
|
+
if args.verbose:
|
|
53
|
+
pytest_args.extend(["-v", "-s"])
|
|
54
|
+
|
|
55
|
+
if args.coverage:
|
|
56
|
+
pytest_args.extend(["--cov=.", "--cov-report=term-missing"])
|
|
57
|
+
|
|
58
|
+
if args.parallel:
|
|
59
|
+
pytest_args.extend(["-n", str(args.parallel)])
|
|
60
|
+
|
|
61
|
+
success_count = 0
|
|
62
|
+
total_tests = 0
|
|
63
|
+
|
|
64
|
+
if not args.integration_only:
|
|
65
|
+
# Run unit tests
|
|
66
|
+
unit_tests = [
|
|
67
|
+
("tests/test_symbols_utils.py", "Symbol Utilities Unit Tests"),
|
|
68
|
+
("tests/test_index_manager.py", "IndexManager Unit Tests"),
|
|
69
|
+
("tests/test_entry.py", "Entry Module Unit Tests"),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
for test_file, description in unit_tests:
|
|
73
|
+
cmd = " ".join(pytest_args + [test_file])
|
|
74
|
+
total_tests += 1
|
|
75
|
+
if run_command(cmd, description):
|
|
76
|
+
success_count += 1
|
|
77
|
+
|
|
78
|
+
if not args.unit_only:
|
|
79
|
+
# Run integration tests
|
|
80
|
+
integration_tests = [
|
|
81
|
+
("tests/test_module_integration.py", "Module Integration Tests"),
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
for test_file, description in integration_tests:
|
|
85
|
+
cmd = " ".join(pytest_args + [test_file])
|
|
86
|
+
total_tests += 1
|
|
87
|
+
if run_command(cmd, description):
|
|
88
|
+
success_count += 1
|
|
89
|
+
|
|
90
|
+
# Run all tests together if neither flag is specified
|
|
91
|
+
if not args.unit_only and not args.integration_only:
|
|
92
|
+
print(f"\n{'='*60}")
|
|
93
|
+
print("Running All Tests Together")
|
|
94
|
+
print('='*60)
|
|
95
|
+
|
|
96
|
+
cmd = " ".join(pytest_args + ["tests/"])
|
|
97
|
+
total_tests += 1
|
|
98
|
+
if run_command(cmd, "Complete Test Suite"):
|
|
99
|
+
success_count += 1
|
|
100
|
+
|
|
101
|
+
# Run module verification commands from AC documentation
|
|
102
|
+
print(f"\n{'='*60}")
|
|
103
|
+
print("Running AC Module Verification Commands")
|
|
104
|
+
print('='*60)
|
|
105
|
+
|
|
106
|
+
verification_commands = [
|
|
107
|
+
("""python -c "
|
|
108
|
+
from autocoder.index.index import IndexManager
|
|
109
|
+
from autocoder.common import SourceCode, AutoCoderArgs
|
|
110
|
+
from autocoder.utils.llms import get_single_llm
|
|
111
|
+
|
|
112
|
+
args = AutoCoderArgs(source_dir='src/autocoder/index')
|
|
113
|
+
sources = []
|
|
114
|
+
llm = get_single_llm('v3_chat', 'lite')
|
|
115
|
+
if llm:
|
|
116
|
+
manager = IndexManager(llm=llm, sources=sources, args=args)
|
|
117
|
+
print('IndexManager initialized successfully with v3_chat')
|
|
118
|
+
else:
|
|
119
|
+
print('IndexManager would work but v3_chat not available')
|
|
120
|
+
"
|
|
121
|
+
""", "IndexManager with v3_chat Verification"),
|
|
122
|
+
|
|
123
|
+
("""python -c "
|
|
124
|
+
from autocoder.index.symbols_utils import extract_symbols
|
|
125
|
+
test_code = '''
|
|
126
|
+
def test_function():
|
|
127
|
+
pass
|
|
128
|
+
|
|
129
|
+
class TestClass:
|
|
130
|
+
def __init__(self):
|
|
131
|
+
self.value = 42
|
|
132
|
+
'''
|
|
133
|
+
symbols = extract_symbols('用途:测试代码\\n函数:test_function\\n类:TestClass\\n变量:value')
|
|
134
|
+
print(f'Successfully extracted symbols: {symbols.functions}, {symbols.classes}')
|
|
135
|
+
"
|
|
136
|
+
""", "Symbol Extraction Verification"),
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
for cmd, description in verification_commands:
|
|
140
|
+
total_tests += 1
|
|
141
|
+
if run_command(cmd, description):
|
|
142
|
+
success_count += 1
|
|
143
|
+
|
|
144
|
+
# Show test discovery and summary
|
|
145
|
+
print(f"\n{'='*60}")
|
|
146
|
+
print("Test Discovery Summary")
|
|
147
|
+
print('='*60)
|
|
148
|
+
|
|
149
|
+
discovery_cmd = "python -m pytest --collect-only tests/"
|
|
150
|
+
if run_command(discovery_cmd, "Test Discovery"):
|
|
151
|
+
success_count += 1
|
|
152
|
+
total_tests += 1
|
|
153
|
+
|
|
154
|
+
# Final summary
|
|
155
|
+
print(f"\n{'='*70}")
|
|
156
|
+
print("INDEX MODULE PYTEST CONVERSION TEST SUMMARY")
|
|
157
|
+
print('='*70)
|
|
158
|
+
print(f"Tests passed: {success_count}/{total_tests}")
|
|
159
|
+
|
|
160
|
+
if success_count == total_tests:
|
|
161
|
+
print("🎉 ALL TESTS PASSED! Index module pytest conversion successful.")
|
|
162
|
+
print("\nModule features verified:")
|
|
163
|
+
print("✓ All tests converted from unittest to pytest format")
|
|
164
|
+
print("✓ Pytest fixtures properly implemented")
|
|
165
|
+
print("✓ Parametrized tests added for better coverage")
|
|
166
|
+
print("✓ AC Module documentation (.ac.mod.md) complete")
|
|
167
|
+
print("✓ Core symbol extraction and processing functionality")
|
|
168
|
+
print("✓ Type system with IndexItem, TargetFile, FileList")
|
|
169
|
+
print("✓ IndexManager class with full interface")
|
|
170
|
+
print("✓ Module structure follows AC standards")
|
|
171
|
+
print("✓ v3_chat model integration confirmed")
|
|
172
|
+
print("✓ All dependencies properly resolved")
|
|
173
|
+
|
|
174
|
+
print(f"\nTo run tests with pytest:")
|
|
175
|
+
print("pytest tests/ -v # Verbose output")
|
|
176
|
+
print("pytest tests/ --cov=. --cov-report=term-missing # With coverage")
|
|
177
|
+
print("pytest tests/ -k 'test_symbols' # Run specific tests")
|
|
178
|
+
print("pytest tests/ -m 'parametrize' # Run parametrized tests")
|
|
179
|
+
print("pytest tests/ --tb=short # Short traceback format")
|
|
180
|
+
|
|
181
|
+
print(f"\nPytest-specific features added:")
|
|
182
|
+
print("• Fixtures for setup/teardown (temp_dir, mock_llm, test_args, etc.)")
|
|
183
|
+
print("• Parametrized tests for comprehensive coverage")
|
|
184
|
+
print("• Clear assertion messages")
|
|
185
|
+
print("• Proper test discovery and collection")
|
|
186
|
+
print("• Support for parallel test execution")
|
|
187
|
+
print("• Coverage reporting integration")
|
|
188
|
+
|
|
189
|
+
sys.exit(0)
|
|
190
|
+
else:
|
|
191
|
+
print(f"❌ {total_tests - success_count} tests failed. Please check the output above.")
|
|
192
|
+
sys.exit(1)
|
|
193
|
+
|
|
194
|
+
if __name__ == '__main__':
|
|
195
|
+
main()
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from unittest.mock import Mock, patch, MagicMock
|
|
3
|
+
import tempfile
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
from autocoder.index.entry import build_index_and_filter_files
|
|
7
|
+
from autocoder.common import SourceCode, AutoCoderArgs, SourceCodeList
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@pytest.fixture
|
|
11
|
+
def temp_dir():
|
|
12
|
+
"""Fixture for temporary directory"""
|
|
13
|
+
temp_dir = tempfile.mkdtemp()
|
|
14
|
+
yield temp_dir
|
|
15
|
+
import shutil
|
|
16
|
+
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def mock_llm():
|
|
21
|
+
"""Fixture for mock LLM"""
|
|
22
|
+
mock_llm = Mock()
|
|
23
|
+
mock_llm.get_sub_client.return_value = None
|
|
24
|
+
mock_llm.default_model_name = "v3_chat"
|
|
25
|
+
return mock_llm
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def test_args(temp_dir):
|
|
30
|
+
"""Fixture for test arguments"""
|
|
31
|
+
return AutoCoderArgs(
|
|
32
|
+
source_dir=temp_dir,
|
|
33
|
+
query="test query",
|
|
34
|
+
skip_build_index=True, # Skip actual index building
|
|
35
|
+
skip_filter_index=True, # Skip actual filtering
|
|
36
|
+
skip_confirm=True,
|
|
37
|
+
index_filter_level=1,
|
|
38
|
+
index_filter_file_num=10,
|
|
39
|
+
context_prune=False
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@pytest.fixture
|
|
44
|
+
def test_sources():
|
|
45
|
+
"""Fixture for test sources"""
|
|
46
|
+
return [
|
|
47
|
+
SourceCode(
|
|
48
|
+
module_name="test1.py",
|
|
49
|
+
source_code="def test1(): pass",
|
|
50
|
+
tag="NORMAL"
|
|
51
|
+
),
|
|
52
|
+
SourceCode(
|
|
53
|
+
module_name="test2.py",
|
|
54
|
+
source_code="def test2(): pass",
|
|
55
|
+
tag="REST"
|
|
56
|
+
),
|
|
57
|
+
SourceCode(
|
|
58
|
+
module_name="test3.py",
|
|
59
|
+
source_code="def test3(): pass",
|
|
60
|
+
tag="RAG"
|
|
61
|
+
)
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TestEntry:
|
|
66
|
+
"""Test cases for entry module functions"""
|
|
67
|
+
|
|
68
|
+
def test_build_index_and_filter_files_basic(self, mock_llm, test_args, test_sources):
|
|
69
|
+
"""Test basic functionality of build_index_and_filter_files"""
|
|
70
|
+
result = build_index_and_filter_files(
|
|
71
|
+
llm=mock_llm,
|
|
72
|
+
args=test_args,
|
|
73
|
+
sources=test_sources
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
assert isinstance(result, SourceCodeList)
|
|
77
|
+
# Should process REST and RAG tagged sources
|
|
78
|
+
assert len(result.sources) >= 0
|
|
79
|
+
|
|
80
|
+
def test_build_index_and_filter_files_rest_rag_sources(self, mock_llm, test_args, test_sources):
|
|
81
|
+
"""Test that REST and RAG sources are processed correctly"""
|
|
82
|
+
result = build_index_and_filter_files(
|
|
83
|
+
llm=mock_llm,
|
|
84
|
+
args=test_args,
|
|
85
|
+
sources=test_sources
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# REST and RAG sources should be included automatically
|
|
89
|
+
rest_sources = [s for s in test_sources if s.tag == "REST"]
|
|
90
|
+
rag_sources = [s for s in test_sources if s.tag == "RAG"]
|
|
91
|
+
|
|
92
|
+
assert len(rest_sources) == 1
|
|
93
|
+
assert len(rag_sources) == 1
|
|
94
|
+
|
|
95
|
+
@patch('autocoder.index.entry.IndexManager')
|
|
96
|
+
def test_build_index_and_filter_files_with_indexing(self, mock_index_manager_class,
|
|
97
|
+
mock_llm, temp_dir, test_sources):
|
|
98
|
+
"""Test functionality when indexing is enabled"""
|
|
99
|
+
# Setup mock
|
|
100
|
+
mock_index_manager = Mock()
|
|
101
|
+
mock_index_manager.build_index.return_value = {"test": "data"}
|
|
102
|
+
mock_index_manager.read_index.return_value = []
|
|
103
|
+
mock_index_manager_class.return_value = mock_index_manager
|
|
104
|
+
|
|
105
|
+
args_with_indexing = AutoCoderArgs(
|
|
106
|
+
source_dir=temp_dir,
|
|
107
|
+
query="test query",
|
|
108
|
+
skip_build_index=False, # Enable indexing
|
|
109
|
+
skip_filter_index=True, # Still skip filtering
|
|
110
|
+
skip_confirm=True,
|
|
111
|
+
index_filter_level=1
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
result = build_index_and_filter_files(
|
|
115
|
+
llm=mock_llm,
|
|
116
|
+
args=args_with_indexing,
|
|
117
|
+
sources=test_sources
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Verify IndexManager was called
|
|
121
|
+
mock_index_manager_class.assert_called_once()
|
|
122
|
+
mock_index_manager.build_index.assert_called_once()
|
|
123
|
+
|
|
124
|
+
assert isinstance(result, SourceCodeList)
|
|
125
|
+
|
|
126
|
+
@patch('autocoder.index.entry.QuickFilter')
|
|
127
|
+
@patch('autocoder.index.entry.IndexManager')
|
|
128
|
+
def test_build_index_and_filter_files_with_quick_filter(self, mock_index_manager_class,
|
|
129
|
+
mock_quick_filter_class,
|
|
130
|
+
mock_llm, temp_dir, test_sources):
|
|
131
|
+
"""Test functionality when quick filtering is enabled"""
|
|
132
|
+
# Setup mocks
|
|
133
|
+
mock_index_manager = Mock()
|
|
134
|
+
mock_index_manager.build_index.return_value = {"test": "data"}
|
|
135
|
+
mock_index_manager.read_index.return_value = []
|
|
136
|
+
mock_index_manager.index_filter_llm = mock_llm
|
|
137
|
+
mock_index_manager_class.return_value = mock_index_manager
|
|
138
|
+
|
|
139
|
+
mock_filter_result = Mock()
|
|
140
|
+
mock_filter_result.files = {}
|
|
141
|
+
mock_filter_result.file_positions = {}
|
|
142
|
+
|
|
143
|
+
mock_quick_filter = Mock()
|
|
144
|
+
mock_quick_filter.filter.return_value = mock_filter_result
|
|
145
|
+
mock_quick_filter_class.return_value = mock_quick_filter
|
|
146
|
+
|
|
147
|
+
args_with_filtering = AutoCoderArgs(
|
|
148
|
+
source_dir=temp_dir,
|
|
149
|
+
query="test query",
|
|
150
|
+
skip_build_index=False,
|
|
151
|
+
skip_filter_index=False, # Enable filtering
|
|
152
|
+
skip_confirm=True,
|
|
153
|
+
index_filter_model="test_model",
|
|
154
|
+
enable_agentic_filter=False, # Use quick filter
|
|
155
|
+
index_filter_level=1
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
result = build_index_and_filter_files(
|
|
159
|
+
llm=mock_llm,
|
|
160
|
+
args=args_with_filtering,
|
|
161
|
+
sources=test_sources
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# Verify both IndexManager and QuickFilter were called
|
|
165
|
+
mock_index_manager_class.assert_called_once()
|
|
166
|
+
mock_index_manager.build_index.assert_called_once()
|
|
167
|
+
mock_quick_filter_class.assert_called_once()
|
|
168
|
+
mock_quick_filter.filter.assert_called_once()
|
|
169
|
+
|
|
170
|
+
assert isinstance(result, SourceCodeList)
|
|
171
|
+
|
|
172
|
+
def test_build_index_and_filter_files_no_llm(self, test_args, test_sources):
|
|
173
|
+
"""Test functionality when no LLM is provided"""
|
|
174
|
+
result = build_index_and_filter_files(
|
|
175
|
+
llm=None,
|
|
176
|
+
args=test_args,
|
|
177
|
+
sources=test_sources
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Should still work but skip LLM-dependent operations
|
|
181
|
+
assert isinstance(result, SourceCodeList)
|
|
182
|
+
|
|
183
|
+
def test_build_index_and_filter_files_empty_sources(self, mock_llm, test_args):
|
|
184
|
+
"""Test functionality with empty source list"""
|
|
185
|
+
result = build_index_and_filter_files(
|
|
186
|
+
llm=mock_llm,
|
|
187
|
+
args=test_args,
|
|
188
|
+
sources=[]
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
assert isinstance(result, SourceCodeList)
|
|
192
|
+
assert len(result.sources) == 0
|
|
193
|
+
|
|
194
|
+
@patch('autocoder.index.entry.ActionYmlFileManager')
|
|
195
|
+
def test_build_index_and_filter_files_with_action_file(self, mock_action_manager_class,
|
|
196
|
+
mock_llm, temp_dir, test_sources):
|
|
197
|
+
"""Test functionality when action file management is involved"""
|
|
198
|
+
# Setup mock
|
|
199
|
+
mock_action_manager = Mock()
|
|
200
|
+
mock_action_manager.update_yaml_field.return_value = True
|
|
201
|
+
mock_action_manager_class.return_value = mock_action_manager
|
|
202
|
+
|
|
203
|
+
args_with_file = AutoCoderArgs(
|
|
204
|
+
source_dir=temp_dir,
|
|
205
|
+
query="test query",
|
|
206
|
+
skip_build_index=True,
|
|
207
|
+
skip_filter_index=True,
|
|
208
|
+
skip_confirm=True,
|
|
209
|
+
file="test_action.yml"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
result = build_index_and_filter_files(
|
|
213
|
+
llm=mock_llm,
|
|
214
|
+
args=args_with_file,
|
|
215
|
+
sources=test_sources
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# Verify ActionYmlFileManager was used
|
|
219
|
+
mock_action_manager_class.assert_called_once_with(temp_dir)
|
|
220
|
+
|
|
221
|
+
assert isinstance(result, SourceCodeList)
|
|
222
|
+
|
|
223
|
+
def test_get_file_path_helper(self, mock_llm, test_args):
|
|
224
|
+
"""Test the get_file_path helper function behavior"""
|
|
225
|
+
# This tests the internal get_file_path function indirectly
|
|
226
|
+
test_sources_with_prefix = [
|
|
227
|
+
SourceCode(
|
|
228
|
+
module_name="##/path/to/file.py",
|
|
229
|
+
source_code="def test(): pass",
|
|
230
|
+
tag="NORMAL"
|
|
231
|
+
)
|
|
232
|
+
]
|
|
233
|
+
|
|
234
|
+
result = build_index_and_filter_files(
|
|
235
|
+
llm=mock_llm,
|
|
236
|
+
args=test_args,
|
|
237
|
+
sources=test_sources_with_prefix
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# Should handle the ## prefix correctly
|
|
241
|
+
assert isinstance(result, SourceCodeList)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
# Parametrized tests
|
|
245
|
+
@pytest.mark.parametrize("tag,should_be_processed", [
|
|
246
|
+
("REST", True),
|
|
247
|
+
("RAG", True),
|
|
248
|
+
("SEARCH", True),
|
|
249
|
+
("NORMAL", False),
|
|
250
|
+
("OTHER", False),
|
|
251
|
+
])
|
|
252
|
+
def test_tag_processing(tag, should_be_processed, mock_llm):
|
|
253
|
+
"""Test that different tags are processed correctly"""
|
|
254
|
+
args = AutoCoderArgs(
|
|
255
|
+
source_dir=".",
|
|
256
|
+
skip_build_index=True,
|
|
257
|
+
skip_filter_index=True,
|
|
258
|
+
skip_confirm=True
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
sources = [
|
|
262
|
+
SourceCode(
|
|
263
|
+
module_name="test.py",
|
|
264
|
+
source_code="def test(): pass",
|
|
265
|
+
tag=tag
|
|
266
|
+
)
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
result = build_index_and_filter_files(llm=mock_llm, args=args, sources=sources)
|
|
270
|
+
|
|
271
|
+
# REST, RAG, SEARCH tags should be processed automatically
|
|
272
|
+
# This is verified by the fact that they don't require LLM processing
|
|
273
|
+
assert isinstance(result, SourceCodeList)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@pytest.mark.parametrize("skip_build,skip_filter,expected_operations", [
|
|
277
|
+
(True, True, "minimal"),
|
|
278
|
+
(False, True, "index_only"),
|
|
279
|
+
(True, False, "filter_only"),
|
|
280
|
+
(False, False, "full"),
|
|
281
|
+
])
|
|
282
|
+
def test_skip_combinations(skip_build, skip_filter, expected_operations, mock_llm, temp_dir):
|
|
283
|
+
"""Test different combinations of skip flags"""
|
|
284
|
+
args = AutoCoderArgs(
|
|
285
|
+
source_dir=temp_dir,
|
|
286
|
+
query="test",
|
|
287
|
+
skip_build_index=skip_build,
|
|
288
|
+
skip_filter_index=skip_filter,
|
|
289
|
+
skip_confirm=True
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
sources = [
|
|
293
|
+
SourceCode(
|
|
294
|
+
module_name="test.py",
|
|
295
|
+
source_code="def test(): pass",
|
|
296
|
+
tag="NORMAL"
|
|
297
|
+
)
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
result = build_index_and_filter_files(llm=mock_llm, args=args, sources=sources)
|
|
301
|
+
|
|
302
|
+
# All combinations should return a valid SourceCodeList
|
|
303
|
+
assert isinstance(result, SourceCodeList)
|