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,279 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Optional, List
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_types import ACModListTool, ToolResult
|
|
6
|
+
from autocoder.common.tokens import count_directory_tokens
|
|
7
|
+
from autocoder.common.ignorefiles.ignore_file_utils import should_ignore, DEFAULT_EXCLUDES
|
|
8
|
+
from loguru import logger
|
|
9
|
+
import typing
|
|
10
|
+
|
|
11
|
+
if typing.TYPE_CHECKING:
|
|
12
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class DirectoryInfo(BaseModel):
|
|
16
|
+
"""Directory information model"""
|
|
17
|
+
file_count: int
|
|
18
|
+
tokens: int
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ACModuleInfo(BaseModel):
|
|
22
|
+
"""Complete AC module information model"""
|
|
23
|
+
path: str
|
|
24
|
+
absolute_path: str
|
|
25
|
+
title: str
|
|
26
|
+
file_count: int
|
|
27
|
+
tokens: int
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class CompactACModuleInfo(BaseModel):
|
|
31
|
+
"""Compact AC module information model for display"""
|
|
32
|
+
path: str
|
|
33
|
+
title: str
|
|
34
|
+
tokens: int
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ACModListToolResolver(BaseToolResolver):
|
|
38
|
+
"""
|
|
39
|
+
Resolver for ACModListTool - lists all directories containing .ac.mod.md files
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: ACModListTool, args):
|
|
43
|
+
super().__init__(agent, tool, args)
|
|
44
|
+
self.tool: ACModListTool = tool
|
|
45
|
+
self._ignore_cache = {} # Cache for ignore checks to improve performance
|
|
46
|
+
|
|
47
|
+
def resolve(self) -> ToolResult:
|
|
48
|
+
"""
|
|
49
|
+
Lists all directories containing .ac.mod.md files (AC Modules)
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
ToolResult: Contains list of AC module directories and their information
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
# Determine search root path
|
|
56
|
+
source_dir = self.args.source_dir or "."
|
|
57
|
+
search_path = self.tool.path if self.tool.path else source_dir
|
|
58
|
+
|
|
59
|
+
# Make absolute path
|
|
60
|
+
if not os.path.isabs(search_path):
|
|
61
|
+
abs_search_path = os.path.abspath(os.path.join(source_dir, search_path))
|
|
62
|
+
else:
|
|
63
|
+
abs_search_path = search_path
|
|
64
|
+
|
|
65
|
+
if not os.path.exists(abs_search_path):
|
|
66
|
+
return ToolResult(
|
|
67
|
+
success=False,
|
|
68
|
+
message=f"Search path does not exist: {search_path}"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if not os.path.isdir(abs_search_path):
|
|
72
|
+
return ToolResult(
|
|
73
|
+
success=False,
|
|
74
|
+
message=f"Search path is not a directory: {search_path}"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
logger.info(f"Searching for AC modules in: {abs_search_path}")
|
|
78
|
+
|
|
79
|
+
# Find all AC modules
|
|
80
|
+
ac_modules = self._find_ac_modules(abs_search_path, source_dir)
|
|
81
|
+
|
|
82
|
+
if not ac_modules:
|
|
83
|
+
formatted_content = f"Search path: {search_path}\nTotal: 0 modules\n\nNo AC modules found."
|
|
84
|
+
return ToolResult(
|
|
85
|
+
success=True,
|
|
86
|
+
message="No AC modules found in the specified path",
|
|
87
|
+
content=formatted_content
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Format result message and content
|
|
91
|
+
module_count = len(ac_modules)
|
|
92
|
+
message = f"Found {module_count} AC module{'s' if module_count != 1 else ''}"
|
|
93
|
+
|
|
94
|
+
# Create compact module list with only path, title, tokens
|
|
95
|
+
compact_modules = []
|
|
96
|
+
for module in ac_modules:
|
|
97
|
+
compact_modules.append(CompactACModuleInfo(
|
|
98
|
+
path=module.path,
|
|
99
|
+
title=module.title,
|
|
100
|
+
tokens=module.tokens
|
|
101
|
+
))
|
|
102
|
+
|
|
103
|
+
# Format as compact text
|
|
104
|
+
module_lines = []
|
|
105
|
+
for module in compact_modules:
|
|
106
|
+
path_display = module.path if module.path != "." else "(root)"
|
|
107
|
+
# 不显示token数量,因为默认为0
|
|
108
|
+
module_lines.append(f" • {path_display} - {module.title}")
|
|
109
|
+
|
|
110
|
+
formatted_content = f"Search path: {search_path}\nTotal: {module_count} modules\n\nModules:\n" + "\n".join(module_lines)
|
|
111
|
+
|
|
112
|
+
logger.info(f"Found {module_count} AC modules")
|
|
113
|
+
|
|
114
|
+
return ToolResult(
|
|
115
|
+
success=True,
|
|
116
|
+
message=message,
|
|
117
|
+
content=formatted_content
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
except Exception as e:
|
|
121
|
+
logger.error(f"Error listing AC modules: {e}")
|
|
122
|
+
return ToolResult(
|
|
123
|
+
success=False,
|
|
124
|
+
message=f"Error listing AC modules: {str(e)}"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
def _find_ac_modules(self, search_path: str, source_dir: str) -> List[ACModuleInfo]:
|
|
128
|
+
"""
|
|
129
|
+
Recursively find all directories containing .ac.mod.md files
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
search_path: Absolute path to search in
|
|
133
|
+
source_dir: Source directory for relative path calculation
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
List of ACModuleInfo models containing AC module information
|
|
137
|
+
"""
|
|
138
|
+
ac_modules = []
|
|
139
|
+
abs_source_dir = os.path.abspath(source_dir)
|
|
140
|
+
|
|
141
|
+
try:
|
|
142
|
+
for root, dirs, files in os.walk(search_path):
|
|
143
|
+
# Early exit if current directory should be ignored
|
|
144
|
+
if self._should_ignore_directory(root, abs_source_dir):
|
|
145
|
+
dirs.clear() # Don't descend into ignored directories
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
# Filter out ignored directories before descending into them
|
|
149
|
+
dirs[:] = [d for d in dirs if not self._should_ignore_directory(os.path.join(root, d), abs_source_dir)]
|
|
150
|
+
|
|
151
|
+
if ".ac.mod.md" in files:
|
|
152
|
+
# Calculate relative path from source directory
|
|
153
|
+
rel_path = os.path.relpath(root, abs_source_dir)
|
|
154
|
+
if rel_path == ".":
|
|
155
|
+
rel_path = ""
|
|
156
|
+
|
|
157
|
+
# Try to read module title from .ac.mod.md file
|
|
158
|
+
mod_file_path = os.path.join(root, ".ac.mod.md")
|
|
159
|
+
module_title = self._extract_module_title(mod_file_path)
|
|
160
|
+
|
|
161
|
+
# Get directory token info (默认返回0以提升性能)
|
|
162
|
+
dir_info = self._get_directory_info(root)
|
|
163
|
+
|
|
164
|
+
module_info = ACModuleInfo(
|
|
165
|
+
path=rel_path if rel_path else ".",
|
|
166
|
+
absolute_path=root,
|
|
167
|
+
title=module_title,
|
|
168
|
+
file_count=dir_info.file_count,
|
|
169
|
+
tokens=dir_info.tokens
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
ac_modules.append(module_info)
|
|
173
|
+
logger.debug(f"Found AC module: {rel_path} - {module_title}")
|
|
174
|
+
|
|
175
|
+
# Sort by path for consistent ordering
|
|
176
|
+
ac_modules.sort(key=lambda x: x.path)
|
|
177
|
+
|
|
178
|
+
except Exception as e:
|
|
179
|
+
logger.error(f"Error walking directory {search_path}: {e}")
|
|
180
|
+
raise
|
|
181
|
+
|
|
182
|
+
return ac_modules
|
|
183
|
+
|
|
184
|
+
def _should_ignore_directory(self, dir_path: str, project_root: str) -> bool:
|
|
185
|
+
"""
|
|
186
|
+
Check if a directory should be ignored during traversal
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
dir_path: Directory path to check
|
|
190
|
+
project_root: Project root directory for relative path calculation
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
True if directory should be ignored, False otherwise
|
|
194
|
+
"""
|
|
195
|
+
# Check cache first for performance
|
|
196
|
+
cache_key = (dir_path, project_root)
|
|
197
|
+
if cache_key in self._ignore_cache:
|
|
198
|
+
return self._ignore_cache[cache_key]
|
|
199
|
+
|
|
200
|
+
# Fast check for common ignore patterns first (performance optimization)
|
|
201
|
+
dir_name = os.path.basename(dir_path)
|
|
202
|
+
if dir_name in DEFAULT_EXCLUDES:
|
|
203
|
+
self._ignore_cache[cache_key] = True
|
|
204
|
+
return True
|
|
205
|
+
|
|
206
|
+
try:
|
|
207
|
+
# Use ignorefiles module for more sophisticated filtering
|
|
208
|
+
result = should_ignore(dir_path, project_root)
|
|
209
|
+
self._ignore_cache[cache_key] = result
|
|
210
|
+
return result
|
|
211
|
+
except Exception as e:
|
|
212
|
+
# Fallback to basic filtering if ignorefiles module fails
|
|
213
|
+
logger.warning(f"Error checking ignore status for {dir_path}: {e}")
|
|
214
|
+
self._ignore_cache[cache_key] = False
|
|
215
|
+
return False
|
|
216
|
+
|
|
217
|
+
def _extract_module_title(self, mod_file_path: str) -> str:
|
|
218
|
+
"""
|
|
219
|
+
Extract module title from .ac.mod.md file
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
mod_file_path: Path to .ac.mod.md file
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
Module title or default name
|
|
226
|
+
"""
|
|
227
|
+
try:
|
|
228
|
+
with open(mod_file_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
229
|
+
# Read first few lines to find the title (markdown h1)
|
|
230
|
+
for line_num, line in enumerate(f):
|
|
231
|
+
line = line.strip()
|
|
232
|
+
if line.startswith("# "):
|
|
233
|
+
return line[2:].strip()
|
|
234
|
+
# Only check first 10 lines
|
|
235
|
+
if line_num >= 9:
|
|
236
|
+
break
|
|
237
|
+
|
|
238
|
+
# If no title found, return a default
|
|
239
|
+
return "AC Module"
|
|
240
|
+
|
|
241
|
+
except Exception as e:
|
|
242
|
+
logger.warning(f"Could not read title from {mod_file_path}: {e}")
|
|
243
|
+
return "AC Module"
|
|
244
|
+
|
|
245
|
+
def _get_directory_info(self, dir_path: str) -> DirectoryInfo:
|
|
246
|
+
"""
|
|
247
|
+
Get basic information about directory (file count and tokens)
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
dir_path: Directory path
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
DirectoryInfo model with file count and token information
|
|
254
|
+
"""
|
|
255
|
+
try:
|
|
256
|
+
# 为了提升性能,默认不统计token数量,直接返回0
|
|
257
|
+
# 只统计文件数量(快速操作),同时应用忽略规则
|
|
258
|
+
file_count = 0
|
|
259
|
+
for root, dirs, files in os.walk(dir_path):
|
|
260
|
+
# Early exit if current directory should be ignored
|
|
261
|
+
if self._should_ignore_directory(root, dir_path):
|
|
262
|
+
dirs.clear() # Don't descend into ignored directories
|
|
263
|
+
continue
|
|
264
|
+
|
|
265
|
+
# 跳过忽略的目录
|
|
266
|
+
dirs[:] = [d for d in dirs if not self._should_ignore_directory(os.path.join(root, d), dir_path)]
|
|
267
|
+
file_count += len(files)
|
|
268
|
+
|
|
269
|
+
return DirectoryInfo(
|
|
270
|
+
file_count=file_count,
|
|
271
|
+
tokens=0 # 默认显示0以提升性能
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
except Exception as e:
|
|
275
|
+
logger.warning(f"Could not get directory info for {dir_path}: {e}")
|
|
276
|
+
return DirectoryInfo(
|
|
277
|
+
file_count=0,
|
|
278
|
+
tokens=0
|
|
279
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
|
|
2
|
+
import os
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_types import ACModReadTool, ToolResult
|
|
6
|
+
from loguru import logger
|
|
7
|
+
import typing
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
11
|
+
|
|
12
|
+
class ACModReadToolResolver(BaseToolResolver):
|
|
13
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: ACModReadTool, args):
|
|
14
|
+
super().__init__(agent, tool, args)
|
|
15
|
+
self.tool: ACModReadTool = tool
|
|
16
|
+
|
|
17
|
+
def resolve(self) -> ToolResult:
|
|
18
|
+
source_dir = self.args.source_dir or "."
|
|
19
|
+
input_path = self.tool.path.strip()
|
|
20
|
+
abs_input_path = os.path.abspath(os.path.join(source_dir, input_path)) if not os.path.isabs(input_path) else input_path
|
|
21
|
+
|
|
22
|
+
# # 校验输入目录是否在项目目录内
|
|
23
|
+
# if not abs_input_path.startswith(abs_source_dir):
|
|
24
|
+
# return ToolResult(success=False, message=f"Error: Access denied. Path outside project: {self.tool.path}")
|
|
25
|
+
|
|
26
|
+
# 直接在输入文件夹中查找 .ac.mod.md 文件
|
|
27
|
+
mod_file_path = os.path.join(abs_input_path, ".ac.mod.md")
|
|
28
|
+
|
|
29
|
+
logger.info(f"Looking for package info at: {mod_file_path}")
|
|
30
|
+
|
|
31
|
+
if not os.path.exists(mod_file_path):
|
|
32
|
+
return ToolResult(success=True, message=f"The path {self.tool.path} is NOT AC module.", content="")
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
with open(mod_file_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
36
|
+
content = f.read()
|
|
37
|
+
return ToolResult(success=True, message=f"The path {self.tool.path} is AC module.", content=content)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.error(f"Error reading package info file: {e}")
|
|
40
|
+
return ToolResult(success=False, message=f"Error reading {self.tool.path}/.ac.mod.md file: {e}")
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
from typing import Optional, List, Tuple
|
|
4
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_tools.replace_in_file_tool_resolver import ReplaceInFileToolResolver
|
|
6
|
+
from autocoder.common.v2.agent.agentic_edit_tools.write_to_file_tool_resolver import WriteToFileToolResolver
|
|
7
|
+
from autocoder.common.v2.agent.agentic_edit_types import ACModWriteTool, ToolResult,ReplaceInFileTool, WriteToFileTool
|
|
8
|
+
from loguru import logger
|
|
9
|
+
import typing
|
|
10
|
+
|
|
11
|
+
if typing.TYPE_CHECKING:
|
|
12
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
13
|
+
|
|
14
|
+
class ACModWriteToolResolver(BaseToolResolver):
|
|
15
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: ACModWriteTool, args):
|
|
16
|
+
super().__init__(agent, tool, args)
|
|
17
|
+
self.tool: ACModWriteTool = tool
|
|
18
|
+
|
|
19
|
+
def resolve(self) -> ToolResult:
|
|
20
|
+
source_dir = self.args.source_dir or "."
|
|
21
|
+
input_path = self.tool.path.strip()
|
|
22
|
+
|
|
23
|
+
# Check if the path already contains .ac.mod.md file name
|
|
24
|
+
if input_path.endswith('.ac.mod.md'):
|
|
25
|
+
# Path already includes the filename
|
|
26
|
+
if not os.path.isabs(input_path):
|
|
27
|
+
mod_file_path = os.path.abspath(os.path.join(source_dir, input_path))
|
|
28
|
+
else:
|
|
29
|
+
mod_file_path = input_path
|
|
30
|
+
|
|
31
|
+
# Create the parent directory if it doesn't exist
|
|
32
|
+
parent_dir = os.path.dirname(mod_file_path)
|
|
33
|
+
os.makedirs(parent_dir, exist_ok=True)
|
|
34
|
+
else:
|
|
35
|
+
# Path is a directory, need to append .ac.mod.md
|
|
36
|
+
abs_input_path = os.path.abspath(os.path.join(source_dir, input_path)) if not os.path.isabs(input_path) else input_path
|
|
37
|
+
|
|
38
|
+
# Create the directory if it doesn't exist
|
|
39
|
+
os.makedirs(abs_input_path, exist_ok=True)
|
|
40
|
+
|
|
41
|
+
# Path to the .ac.mod.md file
|
|
42
|
+
mod_file_path = os.path.join(abs_input_path, ".ac.mod.md")
|
|
43
|
+
|
|
44
|
+
# Check if .ac.mod.md file exists
|
|
45
|
+
if not os.path.exists(mod_file_path):
|
|
46
|
+
# Create new .ac.mod.md file with default template
|
|
47
|
+
with open(mod_file_path, 'w',encoding='utf-8') as f:
|
|
48
|
+
f.write("")
|
|
49
|
+
|
|
50
|
+
return ReplaceInFileToolResolver(self.agent, ReplaceInFileTool(path=mod_file_path, diff=self.tool.diff), self.args).resolve()
|
|
51
|
+
|
|
52
|
+
|
|
@@ -29,6 +29,14 @@ class AskFollowupQuestionToolResolver(BaseToolResolver):
|
|
|
29
29
|
Packages the question and options to be handled by the main loop/UI.
|
|
30
30
|
This resolver doesn't directly ask the user but prepares the data for it.
|
|
31
31
|
"""
|
|
32
|
+
# Check if running in CLI mode, if so return immediately with a message
|
|
33
|
+
# instructing the model to solve the problem on its own
|
|
34
|
+
if get_run_context().is_cli() or self.agent.args.enable_agentic_auto_approve:
|
|
35
|
+
return ToolResult(
|
|
36
|
+
success=False,
|
|
37
|
+
message="Remember, you cannot ask follow-up questions. Please try to solve the problem on your own using the available information. Do not give up and do your best to find a solution."
|
|
38
|
+
)
|
|
39
|
+
|
|
32
40
|
question = self.tool.question
|
|
33
41
|
options = self.tool.options or []
|
|
34
42
|
options_text = "\n".join([f"{i+1}. {option}" for i, option in enumerate(options)])
|