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
autocoder/sdk/core/bridge.py
CHANGED
|
@@ -9,63 +9,78 @@ import sys
|
|
|
9
9
|
from typing import Any, Dict, Optional, Iterator, Union
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
import subprocess
|
|
12
|
+
from contextlib import contextmanager
|
|
12
13
|
|
|
13
14
|
from ..exceptions import BridgeError
|
|
14
15
|
from ..models.responses import StreamEvent
|
|
15
|
-
from autocoder.auto_coder_runner import run_auto_command,configure
|
|
16
|
+
from autocoder.auto_coder_runner import run_auto_command, configure
|
|
16
17
|
from ..models.options import AutoCodeOptions
|
|
17
18
|
|
|
18
19
|
# 不导入事件类型,使用动态检查避免类型冲突
|
|
19
20
|
|
|
20
21
|
|
|
22
|
+
@contextmanager
|
|
23
|
+
def temporary_chdir(path: Union[str, Path]):
|
|
24
|
+
"""临时切换工作目录的上下文管理器"""
|
|
25
|
+
original_cwd = os.getcwd()
|
|
26
|
+
try:
|
|
27
|
+
os.chdir(path)
|
|
28
|
+
yield
|
|
29
|
+
finally:
|
|
30
|
+
os.chdir(original_cwd)
|
|
31
|
+
|
|
32
|
+
|
|
21
33
|
class AutoCoderBridge:
|
|
22
34
|
"""桥接层,连接现有功能"""
|
|
23
35
|
|
|
24
|
-
def __init__(self, project_root: str,options:AutoCodeOptions):
|
|
36
|
+
def __init__(self, project_root: str, options: AutoCodeOptions):
|
|
25
37
|
"""
|
|
26
38
|
初始化桥接层
|
|
27
39
|
|
|
28
40
|
Args:
|
|
29
41
|
project_root: 项目根目录
|
|
42
|
+
options: 配置选项
|
|
30
43
|
"""
|
|
31
44
|
self.project_root = project_root or os.getcwd()
|
|
32
|
-
self.options = options
|
|
45
|
+
self.options = options
|
|
46
|
+
self.allow_chdir = True # 默认允许切换目录,可以通过配置关闭
|
|
33
47
|
self._setup_environment()
|
|
34
48
|
|
|
35
49
|
def _setup_environment(self):
|
|
36
50
|
"""设置环境和内存"""
|
|
37
51
|
try:
|
|
38
|
-
#
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
self.
|
|
45
|
-
from autocoder.auto_coder_runner import start
|
|
46
|
-
start()
|
|
47
|
-
except ImportError:
|
|
48
|
-
# 如果无法导入,跳过初始化
|
|
49
|
-
pass
|
|
50
|
-
|
|
51
|
-
# 恢复原始工作目录
|
|
52
|
-
os.chdir(original_cwd)
|
|
52
|
+
# 使用上下文管理器临时切换到项目根目录
|
|
53
|
+
if self.allow_chdir:
|
|
54
|
+
with temporary_chdir(self.project_root):
|
|
55
|
+
self._init_project_environment()
|
|
56
|
+
else:
|
|
57
|
+
# 不切换目录的情况下初始化
|
|
58
|
+
self._init_project_environment()
|
|
53
59
|
|
|
54
60
|
except Exception as e:
|
|
55
61
|
# 设置环境失败不应该阻止程序运行
|
|
56
62
|
pass
|
|
57
63
|
|
|
64
|
+
def _init_project_environment(self):
|
|
65
|
+
"""初始化项目环境"""
|
|
66
|
+
try:
|
|
67
|
+
self.init_project_if_required()
|
|
68
|
+
from autocoder.auto_coder_runner import start
|
|
69
|
+
start()
|
|
70
|
+
except ImportError:
|
|
71
|
+
# 如果无法导入,跳过初始化
|
|
72
|
+
pass
|
|
73
|
+
|
|
58
74
|
def init_project_if_required(self):
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
["auto-coder", "init", "--source_dir", "."], check=True
|
|
62
|
-
)
|
|
75
|
+
from autocoder.auto_coder_runner import init_project_if_required as init_project_if_required_buildin
|
|
76
|
+
init_project_if_required_buildin(self.project_root, "*")
|
|
63
77
|
|
|
64
78
|
def call_run_auto_command(
|
|
65
79
|
self,
|
|
66
80
|
query: str,
|
|
67
81
|
pre_commit: bool = False,
|
|
68
82
|
pr: bool = False,
|
|
83
|
+
cancel_token: Optional[str] = None,
|
|
69
84
|
extra_args: Optional[Dict[str, Any]] = None,
|
|
70
85
|
stream: bool = True
|
|
71
86
|
) -> Iterator[StreamEvent]:
|
|
@@ -76,6 +91,7 @@ class AutoCoderBridge:
|
|
|
76
91
|
query: 查询内容
|
|
77
92
|
pre_commit: 是否预提交
|
|
78
93
|
pr: 是否预提交
|
|
94
|
+
cancel_token: 取消令牌,用于中断执行
|
|
79
95
|
extra_args: 额外参数
|
|
80
96
|
stream: 是否流式返回
|
|
81
97
|
|
|
@@ -86,50 +102,105 @@ class AutoCoderBridge:
|
|
|
86
102
|
BridgeError: 桥接层错误
|
|
87
103
|
"""
|
|
88
104
|
try:
|
|
89
|
-
# 切换到项目根目录
|
|
90
|
-
original_cwd = os.getcwd()
|
|
91
|
-
os.chdir(self.project_root)
|
|
92
|
-
|
|
93
105
|
# 准备参数
|
|
94
106
|
extra_args = extra_args or {}
|
|
95
107
|
|
|
108
|
+
# 根据会话配置确定 conversation_action 和 conversation_id
|
|
109
|
+
from autocoder.common.v2.agent.agentic_edit_types import ConversationAction
|
|
110
|
+
|
|
111
|
+
conversation_action = ConversationAction.NEW # 默认为新对话
|
|
112
|
+
conversation_id = None
|
|
113
|
+
|
|
114
|
+
if self.options.session_id:
|
|
115
|
+
# 如果有 session_id,就是恢复特定会话
|
|
116
|
+
conversation_action = ConversationAction.RESUME
|
|
117
|
+
conversation_id = self.options.session_id
|
|
118
|
+
elif self.options.continue_session:
|
|
119
|
+
# 如果是 continue_session,就是继续最近的对话
|
|
120
|
+
conversation_action = ConversationAction.CONTINUE
|
|
121
|
+
conversation_id = None
|
|
122
|
+
|
|
96
123
|
# 发送开始事件
|
|
97
124
|
yield StreamEvent(
|
|
98
125
|
event_type="start",
|
|
99
|
-
data={"query": query, "pre_commit": pre_commit
|
|
126
|
+
data={"query": query, "pre_commit": pre_commit,
|
|
127
|
+
"cancel_token": cancel_token, "conversation_action": conversation_action.value,
|
|
128
|
+
"conversation_id": conversation_id}
|
|
100
129
|
)
|
|
101
|
-
|
|
102
|
-
try:
|
|
103
|
-
|
|
104
|
-
configure(f"model:{self.options.model}")
|
|
105
|
-
events = run_auto_command(
|
|
106
|
-
query=query,
|
|
107
|
-
pre_commit=pre_commit,
|
|
108
|
-
pr=pr,
|
|
109
|
-
extra_args=extra_args
|
|
110
|
-
)
|
|
111
130
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
# 使用上下文管理器切换目录(如果允许)
|
|
132
|
+
context = temporary_chdir(
|
|
133
|
+
self.project_root) if self.allow_chdir else _nullcontext()
|
|
134
|
+
|
|
135
|
+
with context:
|
|
136
|
+
try:
|
|
137
|
+
# 实现循环逻辑
|
|
138
|
+
loop_count = self.options.loop
|
|
139
|
+
|
|
140
|
+
for loop_index in range(loop_count):
|
|
141
|
+
# 第一次使用原始查询,后续循环使用改进的查询
|
|
142
|
+
current_query = query
|
|
143
|
+
if loop_index > 0:
|
|
144
|
+
# 使用自定义的额外提示或默认提示
|
|
145
|
+
if self.options.loop_additional_prompt:
|
|
146
|
+
additional_prompt = self.options.loop_additional_prompt
|
|
147
|
+
else:
|
|
148
|
+
additional_prompt = "use git log to get the code changes generated by previous tasks and try to focus on iterative improvements and refinements. Ensure the implementation is complete, functional, and fully usable without any missing features or incomplete functionality. Make sure to use git commit command to make a commit after every single file edit."
|
|
149
|
+
current_query = f"{query}\n\nAdditional instruction: {additional_prompt}"
|
|
150
|
+
|
|
151
|
+
# 发送循环开始事件
|
|
152
|
+
if loop_count > 1:
|
|
153
|
+
yield StreamEvent(
|
|
154
|
+
event_type="loop_start",
|
|
155
|
+
data={"content": f"{loop_index + 1}/{loop_count}"}
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# 对于循环执行,根据loop_keep_conversation参数决定是否使用CONTINUE模式
|
|
159
|
+
current_conversation_action = conversation_action
|
|
160
|
+
current_conversation_id = conversation_id
|
|
161
|
+
if loop_index > 0 and self.options.loop_keep_conversation:
|
|
162
|
+
from autocoder.common.v2.agent.agentic_edit_types import ConversationAction
|
|
163
|
+
current_conversation_action = ConversationAction.CONTINUE
|
|
164
|
+
current_conversation_id = None
|
|
165
|
+
|
|
166
|
+
events = run_auto_command(
|
|
167
|
+
query=current_query,
|
|
168
|
+
pre_commit=pre_commit,
|
|
169
|
+
pr=pr and (loop_index == loop_count - 1), # 只在最后一次循环时创建PR
|
|
170
|
+
cancel_token=cancel_token,
|
|
171
|
+
extra_args={
|
|
172
|
+
**extra_args, "max_turns": self.options.max_turns, "model": self.options.model, "include_rules": self.options.include_rules},
|
|
173
|
+
system_prompt=self.options.system_prompt,
|
|
174
|
+
conversation_action=current_conversation_action,
|
|
175
|
+
conversation_id=current_conversation_id,
|
|
176
|
+
is_sub_agent=self.options.is_sub_agent
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# 如果返回的是生成器,逐个处理事件
|
|
180
|
+
if hasattr(events, '__iter__') and not isinstance(events, (str, bytes)):
|
|
181
|
+
for event in events:
|
|
182
|
+
# 转换事件格式
|
|
183
|
+
stream_event = self._convert_event_to_stream_event(
|
|
184
|
+
event)
|
|
185
|
+
if stream_event: # 只yield非None的事件
|
|
186
|
+
yield stream_event
|
|
187
|
+
else:
|
|
188
|
+
# 如果不是生成器,包装成单个事件
|
|
189
|
+
yield StreamEvent(
|
|
190
|
+
event_type="content",
|
|
191
|
+
data={"content": str(events)}
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# 发送循环完成事件
|
|
195
|
+
if loop_count > 1:
|
|
196
|
+
yield StreamEvent(
|
|
197
|
+
event_type="loop_end",
|
|
198
|
+
data={"content": f"{loop_index + 1}/{loop_count}"}
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
except (ImportError, FileNotFoundError, Exception) as e:
|
|
202
|
+
raise BridgeError(
|
|
203
|
+
f"run_auto_command failed: {str(e)}", original_error=e)
|
|
133
204
|
|
|
134
205
|
# 发送完成事件
|
|
135
206
|
yield StreamEvent(
|
|
@@ -145,9 +216,6 @@ class AutoCoderBridge:
|
|
|
145
216
|
)
|
|
146
217
|
raise BridgeError(
|
|
147
218
|
f"run_auto_command failed: {str(e)}", original_error=e)
|
|
148
|
-
finally:
|
|
149
|
-
# 恢复原始工作目录
|
|
150
|
-
os.chdir(original_cwd)
|
|
151
219
|
|
|
152
220
|
def _simulate_auto_command_response(self, query: str) -> Iterator[StreamEvent]:
|
|
153
221
|
"""
|
|
@@ -324,9 +392,22 @@ class AutoCoderBridge:
|
|
|
324
392
|
)
|
|
325
393
|
|
|
326
394
|
elif event_class_name == "TokenUsageEvent":
|
|
395
|
+
usage = getattr(event, 'usage', None)
|
|
396
|
+
if usage:
|
|
397
|
+
# 序列化 SingleOutputMeta 对象
|
|
398
|
+
usage_data = {
|
|
399
|
+
"input_tokens_count": getattr(usage, 'input_tokens_count', 0),
|
|
400
|
+
"generated_tokens_count": getattr(usage, 'generated_tokens_count', 0),
|
|
401
|
+
"reasoning_content": getattr(usage, 'reasoning_content', ''),
|
|
402
|
+
"finish_reason": getattr(usage, 'finish_reason', 'stop'),
|
|
403
|
+
"first_token_time": getattr(usage, 'first_token_time', 0)
|
|
404
|
+
}
|
|
405
|
+
else:
|
|
406
|
+
usage_data = {}
|
|
407
|
+
|
|
327
408
|
return StreamEvent(
|
|
328
409
|
event_type="token_usage",
|
|
329
|
-
data={"usage":
|
|
410
|
+
data={"usage": usage_data}
|
|
330
411
|
)
|
|
331
412
|
|
|
332
413
|
elif event_class_name == "WindowLengthChangeEvent":
|
|
@@ -342,6 +423,64 @@ class AutoCoderBridge:
|
|
|
342
423
|
event, 'conversation_id', '')}
|
|
343
424
|
)
|
|
344
425
|
|
|
426
|
+
elif event_class_name == "PreCommitEvent":
|
|
427
|
+
# event.commit_result 和 event.tpe 一定存在
|
|
428
|
+
commit_result = event.commit_result
|
|
429
|
+
commit_data = {
|
|
430
|
+
"success": commit_result.success if hasattr(commit_result, 'success') else False,
|
|
431
|
+
"message": commit_result.message if hasattr(commit_result, 'message') else '',
|
|
432
|
+
"commit_hash": commit_result.commit_hash if hasattr(commit_result, 'commit_hash') else '',
|
|
433
|
+
"files_changed": commit_result.files_changed if hasattr(commit_result, 'files_changed') else [],
|
|
434
|
+
"error": commit_result.error if hasattr(commit_result, 'error') else None
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return StreamEvent(
|
|
438
|
+
event_type="pre_commit",
|
|
439
|
+
data={
|
|
440
|
+
"commit_result": commit_data,
|
|
441
|
+
"tpe": event.tpe
|
|
442
|
+
}
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
elif event_class_name == "CommitEvent":
|
|
446
|
+
# event.commit_result 和 event.tpe 一定存在
|
|
447
|
+
commit_result = event.commit_result
|
|
448
|
+
commit_data = {
|
|
449
|
+
"success": commit_result.success if hasattr(commit_result, 'success') else False,
|
|
450
|
+
"message": commit_result.message if hasattr(commit_result, 'message') else '',
|
|
451
|
+
"commit_hash": commit_result.commit_hash if hasattr(commit_result, 'commit_hash') else '',
|
|
452
|
+
"files_changed": commit_result.files_changed if hasattr(commit_result, 'files_changed') else [],
|
|
453
|
+
"error": commit_result.error if hasattr(commit_result, 'error') else None
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return StreamEvent(
|
|
457
|
+
event_type="commit",
|
|
458
|
+
data={
|
|
459
|
+
"commit_result": commit_data,
|
|
460
|
+
"tpe": event.tpe
|
|
461
|
+
}
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
elif event_class_name == "PullRequestEvent":
|
|
465
|
+
# event.pull_request_result 一定存在
|
|
466
|
+
pr_result = event.pull_request_result
|
|
467
|
+
pr_data = {
|
|
468
|
+
"success": pr_result.success if hasattr(pr_result, 'success') else False,
|
|
469
|
+
"pr_number": pr_result.pr_number if hasattr(pr_result, 'pr_number') else None,
|
|
470
|
+
"pr_url": pr_result.pr_url if hasattr(pr_result, 'pr_url') else '',
|
|
471
|
+
"pr_id": pr_result.pr_id if hasattr(pr_result, 'pr_id') else None,
|
|
472
|
+
"error_message": pr_result.error_message if hasattr(pr_result, 'error_message') else None,
|
|
473
|
+
"error_code": pr_result.error_code if hasattr(pr_result, 'error_code') else None,
|
|
474
|
+
"platform": pr_result.platform if hasattr(pr_result, 'platform') else None,
|
|
475
|
+
"raw_response": pr_result.raw_response if hasattr(pr_result, 'raw_response') else None,
|
|
476
|
+
"retry_after": pr_result.retry_after if hasattr(pr_result, 'retry_after') else None
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
return StreamEvent(
|
|
480
|
+
event_type="pull_request",
|
|
481
|
+
data={"pull_request_result": pr_data}
|
|
482
|
+
)
|
|
483
|
+
|
|
345
484
|
elif event_class_name == "PlanModeRespondEvent":
|
|
346
485
|
result = ""
|
|
347
486
|
if hasattr(event, 'completion'):
|
|
@@ -390,27 +529,29 @@ class AutoCoderBridge:
|
|
|
390
529
|
Dict[str, Any]: 内存数据
|
|
391
530
|
"""
|
|
392
531
|
try:
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
memory_data = get_memory()
|
|
399
|
-
return memory_data
|
|
400
|
-
except ImportError:
|
|
401
|
-
# 模拟内存数据
|
|
402
|
-
return {
|
|
403
|
-
"current_files": {"files": [], "groups": {}},
|
|
404
|
-
"conf": {},
|
|
405
|
-
"exclude_dirs": [],
|
|
406
|
-
"mode": "auto_detect"
|
|
407
|
-
}
|
|
408
|
-
|
|
532
|
+
if self.allow_chdir:
|
|
533
|
+
with temporary_chdir(self.project_root):
|
|
534
|
+
return self._get_memory_internal()
|
|
535
|
+
else:
|
|
536
|
+
return self._get_memory_internal()
|
|
409
537
|
except Exception as e:
|
|
410
538
|
raise BridgeError(
|
|
411
539
|
f"Failed to get memory: {str(e)}", original_error=e)
|
|
412
|
-
|
|
413
|
-
|
|
540
|
+
|
|
541
|
+
def _get_memory_internal(self) -> Dict[str, Any]:
|
|
542
|
+
"""内部获取内存实现"""
|
|
543
|
+
try:
|
|
544
|
+
from autocoder.auto_coder_runner import get_memory
|
|
545
|
+
memory_data = get_memory()
|
|
546
|
+
return memory_data
|
|
547
|
+
except ImportError:
|
|
548
|
+
# 模拟内存数据
|
|
549
|
+
return {
|
|
550
|
+
"current_files": {"files": [], "groups": {}},
|
|
551
|
+
"conf": {},
|
|
552
|
+
"exclude_dirs": [],
|
|
553
|
+
"mode": "auto_detect"
|
|
554
|
+
}
|
|
414
555
|
|
|
415
556
|
def save_memory(self, memory_data: Dict[str, Any]) -> None:
|
|
416
557
|
"""
|
|
@@ -420,23 +561,25 @@ class AutoCoderBridge:
|
|
|
420
561
|
memory_data: 要保存的内存数据
|
|
421
562
|
"""
|
|
422
563
|
try:
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
# 更新全局 memory 变量
|
|
429
|
-
memory.update(memory_data)
|
|
430
|
-
save_memory()
|
|
431
|
-
except ImportError:
|
|
432
|
-
# 模拟保存
|
|
433
|
-
pass
|
|
434
|
-
|
|
564
|
+
if self.allow_chdir:
|
|
565
|
+
with temporary_chdir(self.project_root):
|
|
566
|
+
self._save_memory_internal(memory_data)
|
|
567
|
+
else:
|
|
568
|
+
self._save_memory_internal(memory_data)
|
|
435
569
|
except Exception as e:
|
|
436
570
|
raise BridgeError(
|
|
437
571
|
f"Failed to save memory: {str(e)}", original_error=e)
|
|
438
|
-
|
|
439
|
-
|
|
572
|
+
|
|
573
|
+
def _save_memory_internal(self, memory_data: Dict[str, Any]) -> None:
|
|
574
|
+
"""内部保存内存实现"""
|
|
575
|
+
try:
|
|
576
|
+
from autocoder.auto_coder_runner import save_memory, memory
|
|
577
|
+
# 更新全局 memory 变量
|
|
578
|
+
memory.update(memory_data)
|
|
579
|
+
save_memory()
|
|
580
|
+
except ImportError:
|
|
581
|
+
# 模拟保存
|
|
582
|
+
pass
|
|
440
583
|
|
|
441
584
|
def get_project_config(self) -> Dict[str, Any]:
|
|
442
585
|
"""
|
|
@@ -446,22 +589,24 @@ class AutoCoderBridge:
|
|
|
446
589
|
Dict[str, Any]: 项目配置
|
|
447
590
|
"""
|
|
448
591
|
try:
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
config = get_final_config()
|
|
455
|
-
return config.__dict__ if hasattr(config, '__dict__') else {}
|
|
456
|
-
except ImportError:
|
|
457
|
-
# 模拟配置
|
|
458
|
-
return {"mock_config": True}
|
|
459
|
-
|
|
592
|
+
if self.allow_chdir:
|
|
593
|
+
with temporary_chdir(self.project_root):
|
|
594
|
+
return self._get_project_config_internal()
|
|
595
|
+
else:
|
|
596
|
+
return self._get_project_config_internal()
|
|
460
597
|
except Exception as e:
|
|
461
598
|
raise BridgeError(
|
|
462
599
|
f"Failed to get project config: {str(e)}", original_error=e)
|
|
463
|
-
|
|
464
|
-
|
|
600
|
+
|
|
601
|
+
def _get_project_config_internal(self) -> Dict[str, Any]:
|
|
602
|
+
"""内部获取配置实现"""
|
|
603
|
+
try:
|
|
604
|
+
from autocoder.auto_coder_runner import get_final_config
|
|
605
|
+
config = get_final_config()
|
|
606
|
+
return config.__dict__ if hasattr(config, '__dict__') else {}
|
|
607
|
+
except ImportError:
|
|
608
|
+
# 模拟配置
|
|
609
|
+
return {"mock_config": True}
|
|
465
610
|
|
|
466
611
|
def setup_project_context(self) -> None:
|
|
467
612
|
"""设置项目上下文"""
|
|
@@ -475,20 +620,45 @@ class AutoCoderBridge:
|
|
|
475
620
|
def cleanup(self) -> None:
|
|
476
621
|
"""清理资源"""
|
|
477
622
|
try:
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
stop()
|
|
484
|
-
except ImportError:
|
|
485
|
-
pass
|
|
486
|
-
|
|
623
|
+
if self.allow_chdir:
|
|
624
|
+
with temporary_chdir(self.project_root):
|
|
625
|
+
self._cleanup_internal()
|
|
626
|
+
else:
|
|
627
|
+
self._cleanup_internal()
|
|
487
628
|
except Exception as e:
|
|
488
629
|
# 清理失败不应该阻止程序继续运行,只记录错误
|
|
489
630
|
print(f"Warning: Failed to cleanup resources: {str(e)}")
|
|
490
|
-
|
|
491
|
-
|
|
631
|
+
|
|
632
|
+
def _cleanup_internal(self) -> None:
|
|
633
|
+
"""内部清理实现"""
|
|
634
|
+
try:
|
|
635
|
+
from autocoder.auto_coder_runner import stop
|
|
636
|
+
stop()
|
|
637
|
+
except ImportError:
|
|
638
|
+
pass
|
|
639
|
+
|
|
640
|
+
def configure_agentic_max_rounds(self, max_rounds: int = 10000) -> None:
|
|
641
|
+
"""
|
|
642
|
+
配置代理最大轮数
|
|
643
|
+
|
|
644
|
+
Args:
|
|
645
|
+
max_rounds: 最大轮数,默认为10000
|
|
646
|
+
"""
|
|
647
|
+
try:
|
|
648
|
+
configure(f"agentic_max_rounds:{max_rounds}", skip_print=True)
|
|
649
|
+
except Exception as e:
|
|
650
|
+
raise BridgeError(
|
|
651
|
+
f"Failed to configure agentic max rounds: {str(e)}", original_error=e)
|
|
652
|
+
|
|
653
|
+
def configure_model(self, model_name: str) -> None:
|
|
654
|
+
"""
|
|
655
|
+
配置模型
|
|
656
|
+
"""
|
|
657
|
+
try:
|
|
658
|
+
configure(f"model:{model_name}", skip_print=True)
|
|
659
|
+
except Exception as e:
|
|
660
|
+
raise BridgeError(
|
|
661
|
+
f"Failed to configure model '{model_name}': {str(e)}", original_error=e)
|
|
492
662
|
|
|
493
663
|
def __enter__(self):
|
|
494
664
|
"""上下文管理器入口"""
|
|
@@ -498,3 +668,13 @@ class AutoCoderBridge:
|
|
|
498
668
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
499
669
|
"""上下文管理器出口"""
|
|
500
670
|
self.cleanup()
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
class _nullcontext:
|
|
674
|
+
"""Python 3.7 兼容的 nullcontext"""
|
|
675
|
+
|
|
676
|
+
def __enter__(self):
|
|
677
|
+
return self
|
|
678
|
+
|
|
679
|
+
def __exit__(self, *args):
|
|
680
|
+
return False
|
autocoder/sdk/exceptions.py
CHANGED
|
@@ -5,16 +5,18 @@ Auto-Coder SDK 异常定义
|
|
|
5
5
|
定义所有自定义异常类,提供错误码和异常的映射关系,统一异常处理策略。
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
from autocoder.common.international import get_message_with_format
|
|
9
|
+
|
|
8
10
|
class AutoCoderSDKError(Exception):
|
|
9
11
|
"""SDK基础异常类"""
|
|
10
12
|
|
|
11
|
-
def __init__(self, message: str, error_code: str =
|
|
13
|
+
def __init__(self, message: str, error_code: str = "SDK_ERROR"):
|
|
12
14
|
super().__init__(message)
|
|
13
15
|
self.message = message
|
|
14
|
-
self.error_code = error_code
|
|
16
|
+
self.error_code = error_code
|
|
15
17
|
|
|
16
18
|
def __str__(self):
|
|
17
|
-
return
|
|
19
|
+
return get_message_with_format("sdk_error_with_code", error_code=self.error_code, message=self.message)
|
|
18
20
|
|
|
19
21
|
|
|
20
22
|
class SessionNotFoundError(AutoCoderSDKError):
|
|
@@ -22,7 +24,7 @@ class SessionNotFoundError(AutoCoderSDKError):
|
|
|
22
24
|
|
|
23
25
|
def __init__(self, session_id: str):
|
|
24
26
|
super().__init__(
|
|
25
|
-
|
|
27
|
+
get_message_with_format("session_not_found", session_id=session_id),
|
|
26
28
|
error_code="SESSION_NOT_FOUND"
|
|
27
29
|
)
|
|
28
30
|
self.session_id = session_id
|
|
@@ -33,7 +35,7 @@ class InvalidOptionsError(AutoCoderSDKError):
|
|
|
33
35
|
|
|
34
36
|
def __init__(self, message: str):
|
|
35
37
|
super().__init__(
|
|
36
|
-
|
|
38
|
+
get_message_with_format("invalid_options", message=message),
|
|
37
39
|
error_code="INVALID_OPTIONS"
|
|
38
40
|
)
|
|
39
41
|
|
|
@@ -41,11 +43,15 @@ class InvalidOptionsError(AutoCoderSDKError):
|
|
|
41
43
|
class BridgeError(AutoCoderSDKError):
|
|
42
44
|
"""桥接层异常"""
|
|
43
45
|
|
|
44
|
-
def __init__(self, message: str, original_error: Exception = None):
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
def __init__(self, message: str, original_error: Exception | None = None):
|
|
47
|
+
if original_error:
|
|
48
|
+
formatted_message = get_message_with_format("bridge_error_with_original",
|
|
49
|
+
message=message,
|
|
50
|
+
original_error=str(original_error))
|
|
51
|
+
else:
|
|
52
|
+
formatted_message = get_message_with_format("bridge_error", message=message)
|
|
53
|
+
|
|
54
|
+
super().__init__(formatted_message, error_code="BRIDGE_ERROR")
|
|
49
55
|
self.original_error = original_error
|
|
50
56
|
|
|
51
57
|
|
|
@@ -54,7 +60,7 @@ class CLIError(AutoCoderSDKError):
|
|
|
54
60
|
|
|
55
61
|
def __init__(self, message: str, exit_code: int = 1):
|
|
56
62
|
super().__init__(
|
|
57
|
-
|
|
63
|
+
get_message_with_format("cli_error", message=message),
|
|
58
64
|
error_code="CLI_ERROR"
|
|
59
65
|
)
|
|
60
66
|
self.exit_code = exit_code
|
|
@@ -65,7 +71,7 @@ class ValidationError(AutoCoderSDKError):
|
|
|
65
71
|
|
|
66
72
|
def __init__(self, field: str, message: str):
|
|
67
73
|
super().__init__(
|
|
68
|
-
|
|
74
|
+
get_message_with_format("validation_error_field", field=field, message=message),
|
|
69
75
|
error_code="VALIDATION_ERROR"
|
|
70
76
|
)
|
|
71
77
|
self.field = field
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Auto-Coder SDK 格式化模块
|
|
3
|
+
|
|
4
|
+
统一提供各种输入输出格式化功能。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .output import OutputFormatter, format_output, format_table_output, format_error_output, format_progress_output
|
|
8
|
+
from .input import InputFormatter
|
|
9
|
+
from .stream import format_stream_output
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"OutputFormatter",
|
|
13
|
+
"InputFormatter",
|
|
14
|
+
"format_output",
|
|
15
|
+
"format_stream_output",
|
|
16
|
+
"format_table_output",
|
|
17
|
+
"format_error_output",
|
|
18
|
+
"format_progress_output",
|
|
19
|
+
]
|