auto-coder 1.0.0__py3-none-any.whl → 2.0.1__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.1.dist-info/LICENSE +158 -0
- auto_coder-2.0.1.dist-info/METADATA +558 -0
- auto_coder-2.0.1.dist-info/RECORD +795 -0
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.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 +24 -3
- 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 +77 -73
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +962 -2345
- 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 +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- 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 +409 -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/git_utils.py +44 -8
- 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 +316 -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 +651 -102
- 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/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- 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/counter.py +24 -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 +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- 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 +564 -29
- 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 +356 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
- 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 +410 -86
- 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 +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- 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 +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- 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 +1094 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +400 -129
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- 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 +923 -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 +65 -46
- 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/sdk/__init__.py +46 -190
- 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 +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- 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 +665 -0
- autocoder/workflow_agents/loader.py +749 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +173 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.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/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- 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-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
专门测试消息ID裁剪逻辑的验证脚本
|
|
4
|
+
|
|
5
|
+
只测试 _apply_message_ids_pruning 方法,不受 token 阈值限制影响
|
|
6
|
+
|
|
7
|
+
支持的消息ID格式:
|
|
8
|
+
1. 直接字段格式: {"message_id": "9226b3a4-1234-5678-9abc-def012345678"}
|
|
9
|
+
2. Hint嵌入格式: {"content": "消息内容 [[message_id: 9226b3a4]]"}
|
|
10
|
+
3. 兼容格式: {"content": "消息内容 message_id: 9226b3a4"}
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
import os
|
|
15
|
+
from datetime import datetime
|
|
16
|
+
|
|
17
|
+
# 添加src路径到Python路径
|
|
18
|
+
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../..'))
|
|
19
|
+
|
|
20
|
+
from autocoder.common.pruner.agentic_conversation_pruner import AgenticConversationPruner
|
|
21
|
+
from autocoder.common.pruner.conversation_message_ids_api import get_conversation_message_ids_api
|
|
22
|
+
from autocoder.common import AutoCoderArgs
|
|
23
|
+
from autocoder.sdk import get_llm
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_message_ids_pruning_logic():
|
|
27
|
+
"""直接测试消息ID裁剪逻辑"""
|
|
28
|
+
|
|
29
|
+
print("🧪 消息ID裁剪逻辑专项测试")
|
|
30
|
+
print(f"📅 测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
31
|
+
print("=" * 80)
|
|
32
|
+
|
|
33
|
+
# 使用已知的会话ID
|
|
34
|
+
conversation_id = "796e1c2e-1ab8-46d1-9448-f9bd29d5c095"
|
|
35
|
+
|
|
36
|
+
# 创建测试数据,包含要删除的消息ID
|
|
37
|
+
# 展示两种消息ID格式的支持
|
|
38
|
+
test_conversations = [
|
|
39
|
+
{
|
|
40
|
+
"role": "system",
|
|
41
|
+
"content": "You are a helpful assistant.",
|
|
42
|
+
"message_id": "12345678abcdef01" # 格式1: 直接字段格式(完整UUID)
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"role": "user",
|
|
46
|
+
"content": "Hello, can you help me with some code? [[message_id: 87654321]]", # 格式2: 标准hint格式
|
|
47
|
+
"message_id": "87654321fedcba02" # 同时测试优先级(字段优先)
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"role": "assistant",
|
|
51
|
+
"content": "Of course! I'd be happy to help you with your code. What do you need assistance with?",
|
|
52
|
+
"message_id": "642f04ee11223344" # 格式1: 这个消息ID应该被删除
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"role": "user",
|
|
56
|
+
"content": "I want to read a file and analyze it. message_id: 13579bdf", # 格式2: 兼容hint格式
|
|
57
|
+
# 没有message_id字段,只从content中提取
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"role": "assistant",
|
|
61
|
+
"content": "I'll help you read and analyze the file. [[message_id: 97531eca]]", # 格式2: 标准hint格式
|
|
62
|
+
# 没有message_id字段,只从content中提取
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
print("📋 测试数据:")
|
|
67
|
+
for i, conv in enumerate(test_conversations, 1):
|
|
68
|
+
role = conv.get("role", "unknown")
|
|
69
|
+
message_id = conv.get("message_id", "no_id")[:8]
|
|
70
|
+
content = conv.get("content", "")[:50] + "..." if len(conv.get("content", "")) > 50 else conv.get("content", "")
|
|
71
|
+
print(f" {i}. [{role:9}] {message_id} | {content}")
|
|
72
|
+
|
|
73
|
+
# 查询消息ID配置
|
|
74
|
+
api = get_conversation_message_ids_api()
|
|
75
|
+
message_ids_config = api.get_conversation_message_ids(conversation_id)
|
|
76
|
+
|
|
77
|
+
if not message_ids_config:
|
|
78
|
+
print(f"❌ 未找到会话ID {conversation_id} 的消息删除配置")
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
print(f"\n✅ 消息ID配置:")
|
|
82
|
+
print(f" 要删除的消息ID: {message_ids_config.message_ids}")
|
|
83
|
+
print(f" 保持成对删除: {message_ids_config.preserve_pairs}")
|
|
84
|
+
|
|
85
|
+
# 创建裁剪器
|
|
86
|
+
args = AutoCoderArgs(
|
|
87
|
+
source_dir=".",
|
|
88
|
+
conversation_prune_safe_zone_tokens=1000,
|
|
89
|
+
context_prune=True,
|
|
90
|
+
context_prune_strategy="extract",
|
|
91
|
+
query="测试消息ID裁剪逻辑"
|
|
92
|
+
)
|
|
93
|
+
llm = get_llm("v3_chat", product_mode="lite")
|
|
94
|
+
|
|
95
|
+
# 创建裁剪器
|
|
96
|
+
from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
|
|
97
|
+
|
|
98
|
+
# 设置当前对话ID
|
|
99
|
+
conversation_manager = get_conversation_manager()
|
|
100
|
+
conversation_manager.set_current_conversation(conversation_id)
|
|
101
|
+
|
|
102
|
+
# 创建AgenticConversationPruner实例并执行测试
|
|
103
|
+
pruner = AgenticConversationPruner(args=args, llm=llm, conversation_id=conversation_id)
|
|
104
|
+
|
|
105
|
+
# 直接测试消息ID裁剪逻辑
|
|
106
|
+
print(f"\n🚀 执行消息ID裁剪:")
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
# 由于 _apply_message_ids_pruning 是私有方法,我们通过完整流程测试但强制低token阈值
|
|
110
|
+
# 设置一个极小的token阈值来强制触发裁剪逻辑
|
|
111
|
+
args.conversation_prune_safe_zone_tokens = 1 # 极小值,确保触发
|
|
112
|
+
|
|
113
|
+
# 使用完整的 prune_conversations 方法
|
|
114
|
+
pruned_conversations = pruner.prune_conversations(test_conversations)
|
|
115
|
+
|
|
116
|
+
print(f"\n📊 裁剪结果:")
|
|
117
|
+
print(f" 原始消息数量: {len(test_conversations)}")
|
|
118
|
+
print(f" 裁剪后数量: {len(pruned_conversations)}")
|
|
119
|
+
print(f" 删除的消息数: {len(test_conversations) - len(pruned_conversations)}")
|
|
120
|
+
|
|
121
|
+
# 检查具体被删除的消息
|
|
122
|
+
original_ids = [conv.get("message_id", "")[:8] for conv in test_conversations]
|
|
123
|
+
pruned_ids = [conv.get("message_id", "")[:8] for conv in pruned_conversations]
|
|
124
|
+
deleted_ids = [msg_id for msg_id in original_ids if msg_id not in pruned_ids]
|
|
125
|
+
remaining_ids = pruned_ids
|
|
126
|
+
|
|
127
|
+
print(f"\n🔍 详细分析:")
|
|
128
|
+
print(f" 原始消息ID: {original_ids}")
|
|
129
|
+
print(f" 删除的消息ID: {deleted_ids}")
|
|
130
|
+
print(f" 保留的消息ID: {remaining_ids}")
|
|
131
|
+
|
|
132
|
+
# 验证目标消息ID是否被删除
|
|
133
|
+
target_id = "642f04ee"
|
|
134
|
+
if target_id in deleted_ids:
|
|
135
|
+
print(f" ✅ 目标消息ID {target_id} 已成功删除")
|
|
136
|
+
else:
|
|
137
|
+
print(f" ❌ 目标消息ID {target_id} 未被删除")
|
|
138
|
+
return False
|
|
139
|
+
|
|
140
|
+
# 验证成对删除逻辑
|
|
141
|
+
if message_ids_config.preserve_pairs:
|
|
142
|
+
print(f"\n🔗 成对删除验证:")
|
|
143
|
+
if "87654321" in deleted_ids and "642f04ee" in deleted_ids:
|
|
144
|
+
print(f" ✅ 成对删除正确:user消息 87654321 和 assistant消息 642f04ee 都被删除")
|
|
145
|
+
else:
|
|
146
|
+
print(f" ⚠️ 成对删除检查:删除的消息ID = {deleted_ids}")
|
|
147
|
+
|
|
148
|
+
# 显示裁剪后的消息列表
|
|
149
|
+
print(f"\n📋 裁剪后的消息:")
|
|
150
|
+
for i, conv in enumerate(pruned_conversations, 1):
|
|
151
|
+
role = conv.get("role", "unknown")
|
|
152
|
+
message_id = conv.get("message_id", "no_id")[:8]
|
|
153
|
+
content = conv.get("content", "")[:50] + "..." if len(conv.get("content", "")) > 50 else conv.get("content", "")
|
|
154
|
+
print(f" {i}. [{role:9}] {message_id} | {content}")
|
|
155
|
+
|
|
156
|
+
# 获取裁剪统计信息
|
|
157
|
+
stats = pruner.get_pruning_statistics()
|
|
158
|
+
if stats["range_pruning"]["applied"]:
|
|
159
|
+
print(f"\n📈 裁剪统计:")
|
|
160
|
+
print(f" 消息ID裁剪已应用: {stats['range_pruning']['applied']}")
|
|
161
|
+
print(f" 消息ID裁剪成功: {stats['range_pruning']['success']}")
|
|
162
|
+
print(f" 总压缩比: {stats['compression']['total_compression_ratio']:.2%}")
|
|
163
|
+
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
except Exception as e:
|
|
167
|
+
print(f"❌ 消息ID裁剪测试失败: {str(e)}")
|
|
168
|
+
import traceback
|
|
169
|
+
traceback.print_exc()
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def main():
|
|
174
|
+
"""主函数"""
|
|
175
|
+
success = test_message_ids_pruning_logic()
|
|
176
|
+
|
|
177
|
+
print(f"\n🎯 测试结果: {'✅ 通过' if success else '❌ 失败'}")
|
|
178
|
+
|
|
179
|
+
if success:
|
|
180
|
+
print("\n🎉 消息ID裁剪逻辑工作正常!")
|
|
181
|
+
print(" - 消息ID匹配正确")
|
|
182
|
+
print(" - 成对删除逻辑有效")
|
|
183
|
+
print(" - 裁剪算法运行正常")
|
|
184
|
+
else:
|
|
185
|
+
print("\n⚠️ 消息ID裁剪逻辑存在问题,请检查相关代码")
|
|
186
|
+
|
|
187
|
+
return success
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
if __name__ == "__main__":
|
|
191
|
+
success = main()
|
|
192
|
+
sys.exit(0 if success else 1)
|
|
@@ -21,7 +21,8 @@ from .utils import (
|
|
|
21
21
|
parse_git_url, detect_platform_from_repo, get_repo_info_from_path,
|
|
22
22
|
get_current_branch, branch_exists, is_git_repo, get_default_remote_branch,
|
|
23
23
|
ensure_branch_exists_remotely, is_main_branch, create_and_checkout_branch,
|
|
24
|
-
generate_auto_branch_name
|
|
24
|
+
generate_auto_branch_name, has_uncommitted_changes, auto_commit_changes,
|
|
25
|
+
ensure_branch_has_commits
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
|
|
@@ -92,6 +93,13 @@ def create_pull_request(
|
|
|
92
93
|
if source_branch == target_branch:
|
|
93
94
|
raise ValidationError(f"源分支和目标分支不能相同: {source_branch}")
|
|
94
95
|
|
|
96
|
+
# 确保分支有提交,如果没有则自动提交更改
|
|
97
|
+
if not ensure_branch_has_commits(repo_path, source_branch, auto_commit=True):
|
|
98
|
+
raise ValidationError(
|
|
99
|
+
f"分支 '{source_branch}' 没有提交且无法自动提交更改。"
|
|
100
|
+
f"请确保有需要提交的更改或手动提交后再创建PR。"
|
|
101
|
+
)
|
|
102
|
+
|
|
95
103
|
# 确保源分支存在于远程仓库,如果不存在则自动推送
|
|
96
104
|
if not ensure_branch_exists_remotely(repo_path, source_branch):
|
|
97
105
|
raise BranchNotFoundError(
|
|
@@ -325,6 +325,127 @@ def validate_repo_path(repo_path: str) -> str:
|
|
|
325
325
|
return str(path)
|
|
326
326
|
|
|
327
327
|
|
|
328
|
+
def has_uncommitted_changes(repo_path: str) -> bool:
|
|
329
|
+
"""检查是否有未提交的更改"""
|
|
330
|
+
try:
|
|
331
|
+
# 检查工作区是否有未暂存的更改
|
|
332
|
+
result = subprocess.run(
|
|
333
|
+
['git', 'diff', '--quiet'],
|
|
334
|
+
cwd=repo_path,
|
|
335
|
+
capture_output=True
|
|
336
|
+
)
|
|
337
|
+
has_unstaged = result.returncode != 0
|
|
338
|
+
|
|
339
|
+
# 检查暂存区是否有未提交的更改
|
|
340
|
+
result = subprocess.run(
|
|
341
|
+
['git', 'diff', '--cached', '--quiet'],
|
|
342
|
+
cwd=repo_path,
|
|
343
|
+
capture_output=True
|
|
344
|
+
)
|
|
345
|
+
has_staged = result.returncode != 0
|
|
346
|
+
|
|
347
|
+
return has_unstaged or has_staged
|
|
348
|
+
except subprocess.CalledProcessError:
|
|
349
|
+
return False
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def get_uncommitted_files(repo_path: str) -> list:
|
|
353
|
+
"""获取未提交的文件列表"""
|
|
354
|
+
try:
|
|
355
|
+
result = subprocess.run(
|
|
356
|
+
['git', 'status', '--porcelain'],
|
|
357
|
+
cwd=repo_path,
|
|
358
|
+
capture_output=True,
|
|
359
|
+
text=True,
|
|
360
|
+
check=True
|
|
361
|
+
)
|
|
362
|
+
lines = result.stdout.strip().split('\n')
|
|
363
|
+
return [line.strip() for line in lines if line.strip()]
|
|
364
|
+
except subprocess.CalledProcessError:
|
|
365
|
+
return []
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def auto_commit_changes(repo_path: str, commit_message: str = None) -> bool:
|
|
369
|
+
"""自动提交所有更改"""
|
|
370
|
+
try:
|
|
371
|
+
# 检查是否有更改
|
|
372
|
+
if not has_uncommitted_changes(repo_path):
|
|
373
|
+
logger.info("没有需要提交的更改")
|
|
374
|
+
return True
|
|
375
|
+
|
|
376
|
+
# 获取未提交的文件列表用于日志
|
|
377
|
+
uncommitted_files = get_uncommitted_files(repo_path)
|
|
378
|
+
logger.info(f"发现 {len(uncommitted_files)} 个未提交的更改")
|
|
379
|
+
|
|
380
|
+
# 添加所有更改到暂存区
|
|
381
|
+
logger.info("正在添加所有更改到暂存区...")
|
|
382
|
+
subprocess.run(
|
|
383
|
+
['git', 'add', '.'],
|
|
384
|
+
cwd=repo_path,
|
|
385
|
+
check=True
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
# 生成提交消息
|
|
389
|
+
if not commit_message:
|
|
390
|
+
current_branch = get_current_branch(repo_path)
|
|
391
|
+
if current_branch and current_branch.startswith('ac-'):
|
|
392
|
+
commit_message = f"Auto-commit changes for PR from {current_branch}"
|
|
393
|
+
else:
|
|
394
|
+
commit_message = "Auto-commit changes for PR creation"
|
|
395
|
+
|
|
396
|
+
# 提交更改
|
|
397
|
+
logger.info(f"正在提交更改: {commit_message}")
|
|
398
|
+
subprocess.run(
|
|
399
|
+
['git', 'commit', '-m', commit_message],
|
|
400
|
+
cwd=repo_path,
|
|
401
|
+
check=True
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
logger.info("✓ 成功提交所有更改")
|
|
405
|
+
return True
|
|
406
|
+
|
|
407
|
+
except subprocess.CalledProcessError as e:
|
|
408
|
+
logger.error(f"自动提交失败: {e}")
|
|
409
|
+
return False
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def ensure_branch_has_commits(repo_path: str, branch_name: str, auto_commit: bool = True) -> bool:
|
|
413
|
+
"""确保分支有提交,如果没有则自动提交更改"""
|
|
414
|
+
try:
|
|
415
|
+
# 检查分支是否有提交(相对于目标分支的差异)
|
|
416
|
+
result = subprocess.run(
|
|
417
|
+
['git', 'rev-list', '--count', f'origin/main..{branch_name}'],
|
|
418
|
+
cwd=repo_path,
|
|
419
|
+
capture_output=True,
|
|
420
|
+
text=True,
|
|
421
|
+
check=True
|
|
422
|
+
)
|
|
423
|
+
commit_count = int(result.stdout.strip())
|
|
424
|
+
|
|
425
|
+
if commit_count > 0:
|
|
426
|
+
logger.info(f"分支 '{branch_name}' 已有 {commit_count} 个提交")
|
|
427
|
+
return True
|
|
428
|
+
|
|
429
|
+
# 如果没有提交,检查是否有未提交的更改
|
|
430
|
+
if has_uncommitted_changes(repo_path):
|
|
431
|
+
if auto_commit:
|
|
432
|
+
logger.info(f"分支 '{branch_name}' 没有提交但有未提交的更改,正在自动提交...")
|
|
433
|
+
return auto_commit_changes(repo_path)
|
|
434
|
+
else:
|
|
435
|
+
logger.warning(f"分支 '{branch_name}' 没有提交且有未提交的更改,但未启用自动提交")
|
|
436
|
+
return False
|
|
437
|
+
else:
|
|
438
|
+
logger.warning(f"分支 '{branch_name}' 没有提交也没有更改")
|
|
439
|
+
return False
|
|
440
|
+
|
|
441
|
+
except subprocess.CalledProcessError as e:
|
|
442
|
+
logger.error(f"检查分支提交状态失败: {e}")
|
|
443
|
+
# 如果检查失败,尝试自动提交(如果有更改的话)
|
|
444
|
+
if auto_commit and has_uncommitted_changes(repo_path):
|
|
445
|
+
return auto_commit_changes(repo_path)
|
|
446
|
+
return False
|
|
447
|
+
|
|
448
|
+
|
|
328
449
|
def build_pr_url(platform: PlatformType, repo_info: RepoInfo, pr_number: int) -> str:
|
|
329
450
|
"""构建PR的Web URL"""
|
|
330
451
|
base_urls = {
|
|
@@ -341,4 +462,4 @@ def build_pr_url(platform: PlatformType, repo_info: RepoInfo, pr_number: int) ->
|
|
|
341
462
|
if platform == PlatformType.GITLAB or platform == PlatformType.GITCODE:
|
|
342
463
|
return f"{base_url}/{repo_info.full_name}/-/merge_requests/{pr_number}"
|
|
343
464
|
else:
|
|
344
|
-
return f"{base_url}/{repo_info.full_name}/pull/{pr_number}"
|
|
465
|
+
return f"{base_url}/{repo_info.full_name}/pull/{pr_number}"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import json
|
|
3
|
-
from typing import List,
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
from pydantic import BaseModel
|
|
5
6
|
from autocoder.common import AutoCoderArgs
|
|
6
7
|
from loguru import logger
|
|
@@ -16,42 +17,37 @@ class RAGConfig(BaseModel):
|
|
|
16
17
|
|
|
17
18
|
class RAGManager:
|
|
18
19
|
"""RAG 管理器,用于读取和管理 RAG 服务器配置"""
|
|
19
|
-
|
|
20
|
+
|
|
20
21
|
def __init__(self, args: AutoCoderArgs):
|
|
21
22
|
self.args = args
|
|
22
23
|
self.configs: List[RAGConfig] = []
|
|
23
24
|
self._load_configs()
|
|
24
|
-
|
|
25
|
+
|
|
25
26
|
def _load_configs(self):
|
|
26
27
|
"""加载 RAG 配置,优先从项目配置,然后从全局配置"""
|
|
27
28
|
# 优先读取项目级别配置
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"rags",
|
|
33
|
-
"rags.json"
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
if os.path.exists(project_config_path):
|
|
29
|
+
base_path = Path(self.args.source_dir) if self.args.source_dir else Path.cwd()
|
|
30
|
+
project_config_path = base_path / ".auto-coder" / "auto-coder.web" / "rags" / "rags.json"
|
|
31
|
+
|
|
32
|
+
if project_config_path.exists():
|
|
37
33
|
logger.info(f"正在加载项目级别 RAG 配置: {project_config_path}")
|
|
38
|
-
self._load_project_config(project_config_path)
|
|
34
|
+
self._load_project_config(str(project_config_path))
|
|
39
35
|
else:
|
|
40
36
|
logger.info("未找到项目级别 RAG 配置,尝试加载全局配置")
|
|
41
|
-
#
|
|
42
|
-
global_config_path =
|
|
43
|
-
if
|
|
37
|
+
# 读取全局配置(使用 pathlib 确保跨平台兼容性)
|
|
38
|
+
global_config_path = Path.home() / ".auto-coder" / "keys" / "rags.json"
|
|
39
|
+
if global_config_path.exists():
|
|
44
40
|
logger.info(f"正在加载全局 RAG 配置: {global_config_path}")
|
|
45
|
-
self._load_global_config(global_config_path)
|
|
41
|
+
self._load_global_config(str(global_config_path))
|
|
46
42
|
else:
|
|
47
43
|
logger.warning("未找到任何 RAG 配置文件")
|
|
48
|
-
|
|
44
|
+
|
|
49
45
|
def _load_project_config(self, config_path: str):
|
|
50
46
|
"""加载项目级别的 RAG 配置"""
|
|
51
47
|
try:
|
|
52
48
|
with open(config_path, 'r', encoding='utf-8') as f:
|
|
53
49
|
config_data = json.load(f)
|
|
54
|
-
|
|
50
|
+
|
|
55
51
|
if "data" in config_data and isinstance(config_data["data"], list):
|
|
56
52
|
for item in config_data["data"]:
|
|
57
53
|
try:
|
|
@@ -67,18 +63,18 @@ class RAGManager:
|
|
|
67
63
|
logger.error(f"解析项目级别 RAG 配置项时出错: {e}, 配置项: {item}")
|
|
68
64
|
else:
|
|
69
65
|
logger.error(f"项目级别 RAG 配置格式错误,缺少 'data' 字段或 'data' 不是列表")
|
|
70
|
-
|
|
66
|
+
|
|
71
67
|
except json.JSONDecodeError as e:
|
|
72
68
|
logger.error(f"项目级别 RAG 配置文件 JSON 格式错误: {e}")
|
|
73
69
|
except Exception as e:
|
|
74
70
|
logger.error(f"读取项目级别 RAG 配置文件时出错: {e}")
|
|
75
|
-
|
|
71
|
+
|
|
76
72
|
def _load_global_config(self, config_path: str):
|
|
77
73
|
"""加载全局级别的 RAG 配置"""
|
|
78
74
|
try:
|
|
79
75
|
with open(config_path, 'r', encoding='utf-8') as f:
|
|
80
76
|
config_data = json.load(f)
|
|
81
|
-
|
|
77
|
+
|
|
82
78
|
if "data" in config_data and isinstance(config_data["data"], list):
|
|
83
79
|
for item in config_data["data"]:
|
|
84
80
|
try:
|
|
@@ -94,49 +90,49 @@ class RAGManager:
|
|
|
94
90
|
logger.error(f"解析全局 RAG 配置项时出错: {e}, 配置项: {item}")
|
|
95
91
|
else:
|
|
96
92
|
logger.error(f"全局 RAG 配置格式错误,缺少 'data' 字段或 'data' 不是列表")
|
|
97
|
-
|
|
93
|
+
|
|
98
94
|
except json.JSONDecodeError as e:
|
|
99
95
|
logger.error(f"全局 RAG 配置文件 JSON 格式错误: {e}")
|
|
100
96
|
except Exception as e:
|
|
101
97
|
logger.error(f"读取全局 RAG 配置文件时出错: {e}")
|
|
102
|
-
|
|
98
|
+
|
|
103
99
|
def get_all_configs(self) -> List[RAGConfig]:
|
|
104
100
|
"""获取所有 RAG 配置"""
|
|
105
101
|
return self.configs
|
|
106
|
-
|
|
102
|
+
|
|
107
103
|
def get_config_by_name(self, name: str) -> Optional[RAGConfig]:
|
|
108
104
|
"""根据名称获取特定的 RAG 配置"""
|
|
109
105
|
for config in self.configs:
|
|
110
106
|
if config.name == name:
|
|
111
107
|
return config
|
|
112
108
|
return None
|
|
113
|
-
|
|
109
|
+
|
|
114
110
|
def get_server_names(self) -> List[str]:
|
|
115
111
|
"""获取所有服务器名称列表"""
|
|
116
112
|
return [config.server_name for config in self.configs]
|
|
117
|
-
|
|
113
|
+
|
|
118
114
|
def get_config_info(self) -> str:
|
|
119
115
|
"""获取格式化的配置信息,用于显示"""
|
|
120
116
|
if not self.configs:
|
|
121
|
-
return "
|
|
122
|
-
|
|
117
|
+
return "### RAG_SERVER_LIST\n No available RAG server configurations found"
|
|
118
|
+
|
|
123
119
|
info_lines = []
|
|
124
|
-
info_lines.append("
|
|
125
|
-
|
|
120
|
+
info_lines.append("### RAG_SERVER_LIST\nAvailable RAG server configurations")
|
|
121
|
+
|
|
126
122
|
for i, config in enumerate(self.configs, 1):
|
|
127
|
-
info_lines.append(f"\n{i}.
|
|
128
|
-
info_lines.append(f"
|
|
129
|
-
|
|
123
|
+
info_lines.append(f"\n{i}. Configuration name: {config.name}")
|
|
124
|
+
info_lines.append(f" Server address: {config.server_name}")
|
|
125
|
+
|
|
130
126
|
if config.description:
|
|
131
|
-
info_lines.append(f"
|
|
127
|
+
info_lines.append(f" Description: {config.description}")
|
|
132
128
|
else:
|
|
133
|
-
info_lines.append(f"
|
|
134
|
-
|
|
129
|
+
info_lines.append(f" Description: None")
|
|
130
|
+
|
|
135
131
|
if i < len(self.configs):
|
|
136
132
|
info_lines.append("-" * 30)
|
|
137
|
-
|
|
133
|
+
|
|
138
134
|
return "\n".join(info_lines)
|
|
139
|
-
|
|
135
|
+
|
|
140
136
|
def has_configs(self) -> bool:
|
|
141
137
|
"""检查是否有可用的配置"""
|
|
142
|
-
return len(self.configs) > 0
|
|
138
|
+
return len(self.configs) > 0
|
|
@@ -4,12 +4,64 @@
|
|
|
4
4
|
AutoCoder 规则文件管理模块
|
|
5
5
|
|
|
6
6
|
提供读取、解析和监控 AutoCoder 规则文件的功能。
|
|
7
|
+
|
|
8
|
+
重构后的模块结构:
|
|
9
|
+
- models/: 数据模型 (RuleFile, RuleRelevance, AlwaysApplyRuleSummary, ConditionalRulesIndex)
|
|
10
|
+
- core/: 核心功能 (AutocoderRulesManager, RuleSelector)
|
|
11
|
+
- utils/: 工具函数 (parser, monitor)
|
|
12
|
+
- api.py: 统一的 API 接口
|
|
7
13
|
"""
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
# 导入数据模型
|
|
16
|
+
from .models import (
|
|
17
|
+
RuleFile,
|
|
18
|
+
RuleRelevance,
|
|
19
|
+
AlwaysApplyRuleSummary,
|
|
20
|
+
ConditionalRulesIndex,
|
|
21
|
+
InitRule,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# 导入核心组件
|
|
25
|
+
from .core import (
|
|
26
|
+
AutocoderRulesManager,
|
|
27
|
+
RuleSelector,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# 导入公共 API 函数
|
|
31
|
+
from .api import (
|
|
10
32
|
get_rules,
|
|
33
|
+
get_parsed_rules,
|
|
34
|
+
parse_rule_file,
|
|
35
|
+
reset_rules_manager,
|
|
36
|
+
auto_select_rules,
|
|
37
|
+
get_required_and_index_rules,
|
|
38
|
+
generate_always_apply_summary,
|
|
39
|
+
generate_conditional_rules_index,
|
|
40
|
+
init_rule,
|
|
41
|
+
get_rules_for_conversation,
|
|
11
42
|
)
|
|
12
43
|
|
|
13
44
|
__all__ = [
|
|
45
|
+
# 数据模型
|
|
46
|
+
'RuleFile',
|
|
47
|
+
'RuleRelevance',
|
|
48
|
+
'AlwaysApplyRuleSummary',
|
|
49
|
+
'ConditionalRulesIndex',
|
|
50
|
+
'InitRule',
|
|
51
|
+
|
|
52
|
+
# 核心组件
|
|
53
|
+
'AutocoderRulesManager',
|
|
54
|
+
'RuleSelector',
|
|
55
|
+
|
|
56
|
+
# 公共 API 函数
|
|
14
57
|
'get_rules',
|
|
58
|
+
'get_parsed_rules',
|
|
59
|
+
'parse_rule_file',
|
|
60
|
+
'reset_rules_manager',
|
|
61
|
+
'auto_select_rules',
|
|
62
|
+
'get_required_and_index_rules',
|
|
63
|
+
'generate_always_apply_summary',
|
|
64
|
+
'generate_conditional_rules_index',
|
|
65
|
+
'init_rule',
|
|
66
|
+
'get_rules_for_conversation',
|
|
15
67
|
]
|