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,225 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import tempfile
|
|
3
|
+
import requests
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from urllib.parse import urlparse
|
|
7
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
8
|
+
from autocoder.common.v2.agent.agentic_edit_types import ExtractToTextTool, ToolResult
|
|
9
|
+
from autocoder.common import AutoCoderArgs
|
|
10
|
+
from loguru import logger
|
|
11
|
+
import typing
|
|
12
|
+
|
|
13
|
+
# 导入文档解析相关模块
|
|
14
|
+
from autocoder.rag.loaders import (
|
|
15
|
+
extract_text_from_pdf,
|
|
16
|
+
extract_text_from_docx,
|
|
17
|
+
extract_text_from_ppt
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if typing.TYPE_CHECKING:
|
|
21
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ExtractToTextToolResolver(BaseToolResolver):
|
|
25
|
+
"""文本提取工具解析器,将各种格式文件转换为文本文件"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: ExtractToTextTool, args: AutoCoderArgs):
|
|
28
|
+
super().__init__(agent, tool, args)
|
|
29
|
+
self.tool: ExtractToTextTool = tool # 类型提示
|
|
30
|
+
|
|
31
|
+
def _is_url(self, path: str) -> bool:
|
|
32
|
+
"""检查路径是否为URL"""
|
|
33
|
+
try:
|
|
34
|
+
result = urlparse(path)
|
|
35
|
+
return all([result.scheme, result.netloc])
|
|
36
|
+
except Exception:
|
|
37
|
+
return False
|
|
38
|
+
|
|
39
|
+
def _download_from_url(self, url: str) -> str:
|
|
40
|
+
"""从URL下载文件到临时路径"""
|
|
41
|
+
try:
|
|
42
|
+
logger.info(f"Downloading file from URL: {url}")
|
|
43
|
+
response = requests.get(url, timeout=30)
|
|
44
|
+
response.raise_for_status()
|
|
45
|
+
|
|
46
|
+
# 从URL或Content-Disposition头获取文件名
|
|
47
|
+
filename = None
|
|
48
|
+
if 'content-disposition' in response.headers:
|
|
49
|
+
content_disposition = response.headers['content-disposition']
|
|
50
|
+
if 'filename=' in content_disposition:
|
|
51
|
+
filename = content_disposition.split('filename=')[1].strip('"')
|
|
52
|
+
|
|
53
|
+
if not filename:
|
|
54
|
+
# 从URL路径提取文件名
|
|
55
|
+
parsed_url = urlparse(url)
|
|
56
|
+
filename = os.path.basename(parsed_url.path)
|
|
57
|
+
if not filename or '.' not in filename:
|
|
58
|
+
# 根据Content-Type猜测扩展名
|
|
59
|
+
content_type = response.headers.get('content-type', '')
|
|
60
|
+
if 'pdf' in content_type:
|
|
61
|
+
filename = 'downloaded_file.pdf'
|
|
62
|
+
elif 'word' in content_type or 'officedocument' in content_type:
|
|
63
|
+
filename = 'downloaded_file.docx'
|
|
64
|
+
elif 'powerpoint' in content_type or 'presentation' in content_type:
|
|
65
|
+
filename = 'downloaded_file.pptx'
|
|
66
|
+
else:
|
|
67
|
+
filename = 'downloaded_file.txt'
|
|
68
|
+
|
|
69
|
+
# 创建临时文件
|
|
70
|
+
temp_dir = tempfile.mkdtemp()
|
|
71
|
+
temp_file_path = os.path.join(temp_dir, filename)
|
|
72
|
+
|
|
73
|
+
with open(temp_file_path, 'wb') as temp_file:
|
|
74
|
+
temp_file.write(response.content)
|
|
75
|
+
|
|
76
|
+
logger.info(f"Downloaded file to: {temp_file_path}")
|
|
77
|
+
return temp_file_path
|
|
78
|
+
|
|
79
|
+
except Exception as e:
|
|
80
|
+
raise Exception(f"Failed to download file from URL '{url}': {str(e)}")
|
|
81
|
+
|
|
82
|
+
def _extract_text_content(self, file_path: str) -> str:
|
|
83
|
+
"""提取文件的文本内容,支持多种格式"""
|
|
84
|
+
try:
|
|
85
|
+
ext = os.path.splitext(file_path)[1].lower()
|
|
86
|
+
|
|
87
|
+
if ext == '.pdf':
|
|
88
|
+
logger.info(f"Extracting text from PDF: {file_path}")
|
|
89
|
+
return extract_text_from_pdf(file_path)
|
|
90
|
+
elif ext == '.docx':
|
|
91
|
+
logger.info(f"Extracting text from DOCX: {file_path}")
|
|
92
|
+
return extract_text_from_docx(file_path)
|
|
93
|
+
elif ext in ('.pptx', '.ppt'):
|
|
94
|
+
logger.info(f"Extracting text from PPT/PPTX: {file_path}")
|
|
95
|
+
slide_texts = []
|
|
96
|
+
for slide_identifier, slide_text_content in extract_text_from_ppt(file_path):
|
|
97
|
+
slide_texts.append(f"--- Slide {slide_identifier} ---\n{slide_text_content}")
|
|
98
|
+
return "\n\n".join(slide_texts) if slide_texts else ""
|
|
99
|
+
else:
|
|
100
|
+
# 处理普通文本文件
|
|
101
|
+
logger.info(f"Reading plain text file: {file_path}")
|
|
102
|
+
with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
103
|
+
return f.read()
|
|
104
|
+
|
|
105
|
+
except Exception as e:
|
|
106
|
+
raise Exception(f"Failed to extract text from file '{file_path}': {str(e)}")
|
|
107
|
+
|
|
108
|
+
def _write_text_to_file(self, content: str, target_path: str) -> None:
|
|
109
|
+
"""将文本内容写入目标文件"""
|
|
110
|
+
try:
|
|
111
|
+
# 确保目标目录存在
|
|
112
|
+
target_dir = os.path.dirname(target_path)
|
|
113
|
+
if target_dir:
|
|
114
|
+
os.makedirs(target_dir, exist_ok=True)
|
|
115
|
+
|
|
116
|
+
# 写入文件
|
|
117
|
+
with open(target_path, 'w', encoding='utf-8') as f:
|
|
118
|
+
f.write(content)
|
|
119
|
+
|
|
120
|
+
logger.info(f"Successfully wrote text content to: {target_path}")
|
|
121
|
+
|
|
122
|
+
except Exception as e:
|
|
123
|
+
raise Exception(f"Failed to write text to file '{target_path}': {str(e)}")
|
|
124
|
+
|
|
125
|
+
def _cleanup_temp_file(self, temp_path: str) -> None:
|
|
126
|
+
"""清理临时文件"""
|
|
127
|
+
try:
|
|
128
|
+
if os.path.exists(temp_path):
|
|
129
|
+
# 如果是临时目录中的文件,删除整个临时目录
|
|
130
|
+
temp_dir = os.path.dirname(temp_path)
|
|
131
|
+
if temp_dir.startswith(tempfile.gettempdir()):
|
|
132
|
+
import shutil
|
|
133
|
+
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
134
|
+
logger.info(f"Cleaned up temporary directory: {temp_dir}")
|
|
135
|
+
else:
|
|
136
|
+
os.remove(temp_path)
|
|
137
|
+
logger.info(f"Cleaned up temporary file: {temp_path}")
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.warning(f"Failed to cleanup temporary file '{temp_path}': {str(e)}")
|
|
140
|
+
|
|
141
|
+
def resolve(self) -> ToolResult:
|
|
142
|
+
"""
|
|
143
|
+
执行文本提取工具
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
ToolResult: 工具执行结果
|
|
147
|
+
"""
|
|
148
|
+
source_path = self.tool.source_path
|
|
149
|
+
target_path = self.tool.target_path
|
|
150
|
+
temp_file_path = None
|
|
151
|
+
|
|
152
|
+
try:
|
|
153
|
+
# 第一步:获取源文件路径
|
|
154
|
+
if self._is_url(source_path):
|
|
155
|
+
# 从URL下载文件
|
|
156
|
+
temp_file_path = self._download_from_url(source_path)
|
|
157
|
+
actual_source_path = temp_file_path
|
|
158
|
+
logger.info(f"Processing URL: {source_path} -> {temp_file_path}")
|
|
159
|
+
else:
|
|
160
|
+
# 本地文件路径
|
|
161
|
+
if not os.path.exists(source_path):
|
|
162
|
+
return ToolResult(
|
|
163
|
+
success=False,
|
|
164
|
+
message=f"Error: Source file not found at path: {source_path}"
|
|
165
|
+
)
|
|
166
|
+
if not os.path.isfile(source_path):
|
|
167
|
+
return ToolResult(
|
|
168
|
+
success=False,
|
|
169
|
+
message=f"Error: Source path is not a file: {source_path}"
|
|
170
|
+
)
|
|
171
|
+
actual_source_path = source_path
|
|
172
|
+
logger.info(f"Processing local file: {source_path}")
|
|
173
|
+
|
|
174
|
+
# 第二步:提取文本内容
|
|
175
|
+
text_content = self._extract_text_content(actual_source_path)
|
|
176
|
+
|
|
177
|
+
if not text_content.strip():
|
|
178
|
+
return ToolResult(
|
|
179
|
+
success=False,
|
|
180
|
+
message=f"Warning: No text content extracted from file: {source_path}"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# 第三步:写入目标文件
|
|
184
|
+
self._write_text_to_file(text_content, target_path)
|
|
185
|
+
|
|
186
|
+
# 记录文件变更(如果需要)
|
|
187
|
+
if self.agent:
|
|
188
|
+
self.agent.record_file_change(
|
|
189
|
+
file_path=target_path,
|
|
190
|
+
change_type="added",
|
|
191
|
+
content=text_content
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# 统计信息
|
|
195
|
+
line_count = len(text_content.split('\n'))
|
|
196
|
+
char_count = len(text_content)
|
|
197
|
+
|
|
198
|
+
success_message = f"Successfully extracted text from '{source_path}' to '{target_path}'"
|
|
199
|
+
if self._is_url(source_path):
|
|
200
|
+
success_message += f" (downloaded from URL)"
|
|
201
|
+
success_message += f" - {line_count} lines, {char_count} characters"
|
|
202
|
+
|
|
203
|
+
return ToolResult(
|
|
204
|
+
success=True,
|
|
205
|
+
message=success_message,
|
|
206
|
+
content={
|
|
207
|
+
"source_path": source_path,
|
|
208
|
+
"target_path": target_path,
|
|
209
|
+
"line_count": line_count,
|
|
210
|
+
"char_count": char_count,
|
|
211
|
+
"is_url": self._is_url(source_path)
|
|
212
|
+
}
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
except Exception as e:
|
|
216
|
+
logger.error(f"ExtractToTextTool execution failed: {str(e)}")
|
|
217
|
+
return ToolResult(
|
|
218
|
+
success=False,
|
|
219
|
+
message=f"文本提取失败: {str(e)}"
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
finally:
|
|
223
|
+
# 清理临时文件
|
|
224
|
+
if temp_file_path:
|
|
225
|
+
self._cleanup_temp_file(temp_file_path)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Lint report data structure for AgenticEdit tools integration.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Dict, List, Any, Optional
|
|
7
|
+
from autocoder.common.linter_core.models.lint_result import LintResult
|
|
8
|
+
from autocoder.common.linter_core.linter_manager import LinterManager
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class LintReport:
|
|
13
|
+
"""Lint 检查报告 - 基于 linter_core 的简化实现"""
|
|
14
|
+
results: Dict[str, LintResult] # 原始检查结果
|
|
15
|
+
summary: Dict[str, Any] # LinterManager.get_summary_report() 的结果
|
|
16
|
+
|
|
17
|
+
@classmethod
|
|
18
|
+
def from_linter_results(cls, results: Dict[str, LintResult],
|
|
19
|
+
manager: LinterManager) -> 'LintReport':
|
|
20
|
+
"""从 LinterManager 的结果创建报告"""
|
|
21
|
+
summary = manager.get_summary_report(results)
|
|
22
|
+
return cls(results=results, summary=summary)
|
|
23
|
+
|
|
24
|
+
def to_markdown(self) -> str:
|
|
25
|
+
"""生成 Markdown 格式报告"""
|
|
26
|
+
lines = ["## Lint Report\n"]
|
|
27
|
+
|
|
28
|
+
# 汇总信息
|
|
29
|
+
lines.append("### Summary")
|
|
30
|
+
lines.append(f"- Total files: {self.summary['total_files']}")
|
|
31
|
+
lines.append(f"- Files with issues: {self.summary['files_with_issues']}")
|
|
32
|
+
lines.append(f"- Failed files: {self.summary['failed_files']}")
|
|
33
|
+
lines.append(f"- Execution time: {self.summary['total_execution_time']:.2f}s\n")
|
|
34
|
+
|
|
35
|
+
# 详细结果
|
|
36
|
+
if self.has_issues():
|
|
37
|
+
lines.append("### Issues Found")
|
|
38
|
+
for file_path, result in self.results.items():
|
|
39
|
+
if result.has_issues:
|
|
40
|
+
lines.append(f"#### {file_path}")
|
|
41
|
+
lines.append("```")
|
|
42
|
+
lines.append(result.lint_output)
|
|
43
|
+
lines.append("```\n")
|
|
44
|
+
|
|
45
|
+
return "\n".join(lines)
|
|
46
|
+
|
|
47
|
+
def to_simple_text(self) -> str:
|
|
48
|
+
"""生成简单文本格式报告"""
|
|
49
|
+
if not self.has_issues():
|
|
50
|
+
return f"✅ Lint check passed - No issues found in {self.summary['total_files']} file(s)"
|
|
51
|
+
|
|
52
|
+
lines = [f"❌ Lint issues detected in {self.summary['files_with_issues']} of {self.summary['total_files']} file(s):"]
|
|
53
|
+
for file_path, result in self.results.items():
|
|
54
|
+
if result.has_issues:
|
|
55
|
+
lines.append(f"\n{file_path}:")
|
|
56
|
+
lines.append(result.lint_output)
|
|
57
|
+
|
|
58
|
+
return "\n".join(lines)
|
|
59
|
+
|
|
60
|
+
def to_json(self) -> dict:
|
|
61
|
+
"""生成 JSON 格式报告"""
|
|
62
|
+
return {
|
|
63
|
+
'summary': self.summary,
|
|
64
|
+
'results': {
|
|
65
|
+
path: result.to_dict()
|
|
66
|
+
for path, result in self.results.items()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
def has_issues(self) -> bool:
|
|
71
|
+
"""检查是否有任何问题"""
|
|
72
|
+
return self.summary.get('files_with_issues', 0) > 0
|
|
73
|
+
|
|
74
|
+
def get_files_with_issues(self) -> List[str]:
|
|
75
|
+
"""获取有问题的文件列表"""
|
|
76
|
+
return [
|
|
77
|
+
path for path, result in self.results.items()
|
|
78
|
+
if result.has_issues
|
|
79
|
+
]
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pydantic models for linter configuration with type validation and defaults.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import List, Optional, Dict, Any, Literal
|
|
6
|
+
from pydantic import BaseModel, Field, validator
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class FilePatterns(BaseModel):
|
|
11
|
+
"""File pattern configuration for include/exclude rules."""
|
|
12
|
+
|
|
13
|
+
include: List[str] = Field(
|
|
14
|
+
default=["*.py", "*.ts", "*.tsx", "*.js", "*.jsx", "*.java"],
|
|
15
|
+
description="List of glob patterns for files to include in linting"
|
|
16
|
+
)
|
|
17
|
+
exclude: List[str] = Field(
|
|
18
|
+
default=["*.test.*", "*.spec.*", "__pycache__", "node_modules", ".git"],
|
|
19
|
+
description="List of glob patterns for files to exclude from linting"
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
@validator('include', 'exclude', pre=True)
|
|
23
|
+
def ensure_list(cls, v):
|
|
24
|
+
"""Ensure the value is a list."""
|
|
25
|
+
if isinstance(v, str):
|
|
26
|
+
return [v]
|
|
27
|
+
return v
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class PythonConfig(BaseModel):
|
|
31
|
+
"""Python-specific linter configuration."""
|
|
32
|
+
|
|
33
|
+
use_mypy: bool = Field(
|
|
34
|
+
default=True,
|
|
35
|
+
description="Enable mypy type checking"
|
|
36
|
+
)
|
|
37
|
+
flake8_args: List[str] = Field(
|
|
38
|
+
default_factory=list,
|
|
39
|
+
description="Additional arguments for flake8"
|
|
40
|
+
)
|
|
41
|
+
mypy_args: List[str] = Field(
|
|
42
|
+
default_factory=list,
|
|
43
|
+
description="Additional arguments for mypy"
|
|
44
|
+
)
|
|
45
|
+
flake8_timeout: int = Field(
|
|
46
|
+
default=30,
|
|
47
|
+
ge=1,
|
|
48
|
+
le=300,
|
|
49
|
+
description="Timeout for flake8 execution in seconds"
|
|
50
|
+
)
|
|
51
|
+
mypy_timeout: int = Field(
|
|
52
|
+
default=30,
|
|
53
|
+
ge=1,
|
|
54
|
+
le=300,
|
|
55
|
+
description="Timeout for mypy execution in seconds"
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TypeScriptConfig(BaseModel):
|
|
60
|
+
"""TypeScript-specific linter configuration."""
|
|
61
|
+
|
|
62
|
+
use_eslint: bool = Field(
|
|
63
|
+
default=True,
|
|
64
|
+
description="Enable ESLint checking"
|
|
65
|
+
)
|
|
66
|
+
tsc_args: List[str] = Field(
|
|
67
|
+
default=["--noEmit", "--strict"],
|
|
68
|
+
description="Arguments for TypeScript compiler"
|
|
69
|
+
)
|
|
70
|
+
eslint_args: List[str] = Field(
|
|
71
|
+
default_factory=list,
|
|
72
|
+
description="Additional arguments for ESLint"
|
|
73
|
+
)
|
|
74
|
+
tsconfig_path: Optional[str] = Field(
|
|
75
|
+
default=None,
|
|
76
|
+
description="Path to tsconfig.json file"
|
|
77
|
+
)
|
|
78
|
+
tsc_timeout: int = Field(
|
|
79
|
+
default=60,
|
|
80
|
+
ge=1,
|
|
81
|
+
le=300,
|
|
82
|
+
description="Timeout for tsc execution in seconds"
|
|
83
|
+
)
|
|
84
|
+
eslint_timeout: int = Field(
|
|
85
|
+
default=30,
|
|
86
|
+
ge=1,
|
|
87
|
+
le=300,
|
|
88
|
+
description="Timeout for ESLint execution in seconds"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
@validator('tsconfig_path')
|
|
92
|
+
def validate_tsconfig_path(cls, v):
|
|
93
|
+
"""Validate tsconfig path if provided."""
|
|
94
|
+
if v and not Path(v).exists():
|
|
95
|
+
# Don't fail, just log warning (file might be created later)
|
|
96
|
+
pass
|
|
97
|
+
return v
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class JavaConfig(BaseModel):
|
|
101
|
+
"""Java-specific linter configuration."""
|
|
102
|
+
|
|
103
|
+
javac_args: List[str] = Field(
|
|
104
|
+
default_factory=list,
|
|
105
|
+
description="Additional arguments for javac"
|
|
106
|
+
)
|
|
107
|
+
javac_timeout: int = Field(
|
|
108
|
+
default=30,
|
|
109
|
+
ge=1,
|
|
110
|
+
le=300,
|
|
111
|
+
description="Timeout for javac execution in seconds"
|
|
112
|
+
)
|
|
113
|
+
project_type: Literal["auto", "maven", "gradle", "local"] = Field(
|
|
114
|
+
default="auto",
|
|
115
|
+
description="Project type for dependency resolution"
|
|
116
|
+
)
|
|
117
|
+
source_paths: List[str] = Field(
|
|
118
|
+
default=["src", "src/main/java"],
|
|
119
|
+
description="Source directories to search"
|
|
120
|
+
)
|
|
121
|
+
lib_dirs: List[str] = Field(
|
|
122
|
+
default=["lib", "libs"],
|
|
123
|
+
description="Directories containing JAR files"
|
|
124
|
+
)
|
|
125
|
+
enable_dependency_resolution: bool = Field(
|
|
126
|
+
default=True,
|
|
127
|
+
description="Enable automatic dependency resolution"
|
|
128
|
+
)
|
|
129
|
+
cache_dependencies: bool = Field(
|
|
130
|
+
default=True,
|
|
131
|
+
description="Cache resolved classpaths for performance"
|
|
132
|
+
)
|
|
133
|
+
release: str = Field(
|
|
134
|
+
default="8",
|
|
135
|
+
description="Java release version"
|
|
136
|
+
)
|
|
137
|
+
use_release_flag: bool = Field(
|
|
138
|
+
default=True,
|
|
139
|
+
description="Use --release flag (can be disabled for older javac)"
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
class LanguageConfig(BaseModel):
|
|
144
|
+
"""Container for all language-specific configurations."""
|
|
145
|
+
|
|
146
|
+
python: PythonConfig = Field(
|
|
147
|
+
default_factory=PythonConfig,
|
|
148
|
+
description="Python linter configuration"
|
|
149
|
+
)
|
|
150
|
+
typescript: TypeScriptConfig = Field(
|
|
151
|
+
default_factory=TypeScriptConfig,
|
|
152
|
+
description="TypeScript linter configuration"
|
|
153
|
+
)
|
|
154
|
+
java: JavaConfig = Field(
|
|
155
|
+
default_factory=JavaConfig,
|
|
156
|
+
description="Java linter configuration"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
class Config:
|
|
160
|
+
extra = "allow" # Allow additional language configurations
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class ReportConfig(BaseModel):
|
|
164
|
+
"""Linter report configuration."""
|
|
165
|
+
|
|
166
|
+
format: Literal["simple", "detailed", "json"] = Field(
|
|
167
|
+
default="simple",
|
|
168
|
+
description="Report format"
|
|
169
|
+
)
|
|
170
|
+
include_in_result: bool = Field(
|
|
171
|
+
default=True,
|
|
172
|
+
description="Include lint report in ToolResult content"
|
|
173
|
+
)
|
|
174
|
+
save_to_file: bool = Field(
|
|
175
|
+
default=False,
|
|
176
|
+
description="Save lint reports to files"
|
|
177
|
+
)
|
|
178
|
+
file_path: str = Field(
|
|
179
|
+
default=".auto-coder/lint-reports/",
|
|
180
|
+
description="Directory path for saving lint reports"
|
|
181
|
+
)
|
|
182
|
+
max_issues_shown: int = Field(
|
|
183
|
+
default=50,
|
|
184
|
+
ge=1,
|
|
185
|
+
le=1000,
|
|
186
|
+
description="Maximum number of issues to show in report"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
class LinterConfig(BaseModel):
|
|
191
|
+
"""Main linter configuration model with type validation."""
|
|
192
|
+
|
|
193
|
+
enabled: bool = Field(
|
|
194
|
+
default=False,
|
|
195
|
+
description="Global linter enable/disable switch"
|
|
196
|
+
)
|
|
197
|
+
mode: Literal["warning", "blocking", "silent"] = Field(
|
|
198
|
+
default="warning",
|
|
199
|
+
description="Linter operation mode"
|
|
200
|
+
)
|
|
201
|
+
check_before_modification: bool = Field(
|
|
202
|
+
default=False,
|
|
203
|
+
description="Run linter before applying modifications"
|
|
204
|
+
)
|
|
205
|
+
check_after_modification: bool = Field(
|
|
206
|
+
default=True,
|
|
207
|
+
description="Run linter after applying modifications"
|
|
208
|
+
)
|
|
209
|
+
max_workers: int = Field(
|
|
210
|
+
default=4,
|
|
211
|
+
ge=1,
|
|
212
|
+
le=32,
|
|
213
|
+
description="Maximum parallel workers for linting"
|
|
214
|
+
)
|
|
215
|
+
timeout: int = Field(
|
|
216
|
+
default=300,
|
|
217
|
+
ge=10,
|
|
218
|
+
le=3600,
|
|
219
|
+
description="Global timeout for linting operations in seconds"
|
|
220
|
+
)
|
|
221
|
+
file_patterns: FilePatterns = Field(
|
|
222
|
+
default_factory=FilePatterns,
|
|
223
|
+
description="File include/exclude patterns"
|
|
224
|
+
)
|
|
225
|
+
language_config: LanguageConfig = Field(
|
|
226
|
+
default_factory=LanguageConfig,
|
|
227
|
+
description="Language-specific configurations"
|
|
228
|
+
)
|
|
229
|
+
report: ReportConfig = Field(
|
|
230
|
+
default_factory=ReportConfig,
|
|
231
|
+
description="Report generation configuration"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
class Config:
|
|
235
|
+
"""Pydantic configuration."""
|
|
236
|
+
validate_assignment = True
|
|
237
|
+
use_enum_values = True
|
|
238
|
+
extra = "forbid" # Don't allow extra fields at root level
|
|
239
|
+
json_schema_extra = {
|
|
240
|
+
"example": {
|
|
241
|
+
"enabled": True,
|
|
242
|
+
"mode": "warning",
|
|
243
|
+
"check_after_modification": True,
|
|
244
|
+
"file_patterns": {
|
|
245
|
+
"include": ["*.py", "*.ts"],
|
|
246
|
+
"exclude": ["*.test.*"]
|
|
247
|
+
},
|
|
248
|
+
"language_config": {
|
|
249
|
+
"python": {
|
|
250
|
+
"use_mypy": True,
|
|
251
|
+
"flake8_args": ["--max-line-length=120"]
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"report": {
|
|
255
|
+
"format": "detailed",
|
|
256
|
+
"include_in_result": True
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@validator('mode')
|
|
262
|
+
def validate_mode(cls, v):
|
|
263
|
+
"""Validate linter mode."""
|
|
264
|
+
valid_modes = ["warning", "blocking", "silent"]
|
|
265
|
+
if v not in valid_modes:
|
|
266
|
+
raise ValueError(f"Invalid mode: {v}. Must be one of {valid_modes}")
|
|
267
|
+
return v
|
|
268
|
+
|
|
269
|
+
@classmethod
|
|
270
|
+
def from_dict(cls, config_dict: Dict[str, Any]) -> 'LinterConfig':
|
|
271
|
+
"""
|
|
272
|
+
Create LinterConfig from a dictionary, handling nested 'linter' key.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
config_dict: Configuration dictionary
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
LinterConfig instance
|
|
279
|
+
"""
|
|
280
|
+
# Handle both direct config and nested under 'linter' key
|
|
281
|
+
if 'linter' in config_dict:
|
|
282
|
+
config_data = config_dict['linter']
|
|
283
|
+
else:
|
|
284
|
+
config_data = config_dict
|
|
285
|
+
|
|
286
|
+
# Handle legacy 'language_config' key mapping
|
|
287
|
+
if 'language_config' in config_data:
|
|
288
|
+
lang_config = config_data['language_config']
|
|
289
|
+
|
|
290
|
+
# Map old config structure to new structure
|
|
291
|
+
if 'python_config' in lang_config:
|
|
292
|
+
lang_config['python'] = lang_config.pop('python_config')
|
|
293
|
+
if 'typescript_config' in lang_config:
|
|
294
|
+
lang_config['typescript'] = lang_config.pop('typescript_config')
|
|
295
|
+
if 'java_config' in lang_config:
|
|
296
|
+
lang_config['java'] = lang_config.pop('java_config')
|
|
297
|
+
|
|
298
|
+
return cls(**config_data)
|
|
299
|
+
|
|
300
|
+
def to_manager_config(self) -> Dict[str, Any]:
|
|
301
|
+
"""
|
|
302
|
+
Convert to LinterManager compatible configuration.
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
Dictionary suitable for LinterManager initialization
|
|
306
|
+
"""
|
|
307
|
+
manager_config = {
|
|
308
|
+
'max_workers': self.max_workers,
|
|
309
|
+
'timeout': self.timeout,
|
|
310
|
+
'python_config': self.language_config.python.dict(),
|
|
311
|
+
'typescript_config': self.language_config.typescript.dict(),
|
|
312
|
+
'java_config': self.language_config.java.dict()
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return manager_config
|
|
316
|
+
|
|
317
|
+
def should_lint_file(self, file_path: str) -> bool:
|
|
318
|
+
"""
|
|
319
|
+
Check if a file should be linted based on patterns.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
file_path: Path to the file
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
True if file should be linted
|
|
326
|
+
"""
|
|
327
|
+
if not self.enabled:
|
|
328
|
+
return False
|
|
329
|
+
|
|
330
|
+
from pathlib import Path
|
|
331
|
+
path = Path(file_path)
|
|
332
|
+
|
|
333
|
+
# Check exclude patterns first
|
|
334
|
+
for pattern in self.file_patterns.exclude:
|
|
335
|
+
if path.match(pattern):
|
|
336
|
+
return False
|
|
337
|
+
|
|
338
|
+
# Check include patterns
|
|
339
|
+
for pattern in self.file_patterns.include:
|
|
340
|
+
if pattern == '*' or path.match(pattern):
|
|
341
|
+
return True
|
|
342
|
+
|
|
343
|
+
return False
|