auto-coder 1.0.0__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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.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 +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 +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +970 -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 +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/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 +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 +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 +349 -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 +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 +116 -124
- 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 +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 +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 +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-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.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
import json
|
|
3
|
+
from loguru import logger
|
|
4
|
+
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import (
|
|
6
|
+
BaseToolResolver,
|
|
7
|
+
)
|
|
8
|
+
from autocoder.common.v2.agent.agentic_edit_types import (
|
|
9
|
+
ToolResult,
|
|
10
|
+
ExecuteWorkflowTool,
|
|
11
|
+
)
|
|
12
|
+
from autocoder.common import AutoCoderArgs
|
|
13
|
+
import typing
|
|
14
|
+
|
|
15
|
+
from autocoder.workflow_agents.exceptions import (
|
|
16
|
+
WorkflowValidationError,
|
|
17
|
+
WorkflowFileNotFoundError,
|
|
18
|
+
WorkflowParseError,
|
|
19
|
+
WorkflowDependencyError,
|
|
20
|
+
WorkflowAgentNotFoundError,
|
|
21
|
+
WorkflowTemplateError,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if typing.TYPE_CHECKING:
|
|
25
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _generate_error_feedback(error: Exception, workflow_name: str) -> str:
|
|
29
|
+
"""
|
|
30
|
+
根据异常类型生成英文反馈指导
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
error: 捕获的异常
|
|
34
|
+
workflow_name: workflow 名称
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
英文反馈指导文本
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
error_type = type(error).__name__
|
|
41
|
+
|
|
42
|
+
if isinstance(error, WorkflowFileNotFoundError):
|
|
43
|
+
return f"""
|
|
44
|
+
**Error Type**: Workflow File Not Found
|
|
45
|
+
|
|
46
|
+
**What happened**: The workflow '{workflow_name}' could not be located in the standard search directories.
|
|
47
|
+
|
|
48
|
+
**Quick Fix**:
|
|
49
|
+
1. Verify the workflow name is spelled correctly
|
|
50
|
+
2. Check if the workflow file exists in one of these directories:
|
|
51
|
+
- `.autocoderworkflow/` (project-level, recommended)
|
|
52
|
+
- `.auto-coder/.autocoderworkflow/` (project-level)
|
|
53
|
+
- `~/.auto-coder/.autocoderworkflow/` (global-level)
|
|
54
|
+
3. Ensure the file has a `.yaml` or `.yml` extension
|
|
55
|
+
|
|
56
|
+
**Example**:
|
|
57
|
+
If your workflow is named 'my-workflow', create:
|
|
58
|
+
- `.autocoderworkflow/my-workflow.yaml` in your project root
|
|
59
|
+
|
|
60
|
+
**Use load_extra_document tool** to get the workflow YAML specification if you need to create a new workflow.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
elif isinstance(error, WorkflowParseError):
|
|
64
|
+
line_info = (
|
|
65
|
+
f" at line {error.line_number}"
|
|
66
|
+
if hasattr(error, "line_number") and error.line_number
|
|
67
|
+
else ""
|
|
68
|
+
)
|
|
69
|
+
return f"""
|
|
70
|
+
**Error Type**: YAML Syntax Error{line_info}
|
|
71
|
+
|
|
72
|
+
**What happened**: The workflow YAML file contains syntax errors that prevent parsing.
|
|
73
|
+
|
|
74
|
+
**Common YAML Mistakes**:
|
|
75
|
+
1. **Indentation**: YAML requires consistent spaces (NOT tabs)
|
|
76
|
+
- Wrong: ` agents:` (using tabs)
|
|
77
|
+
- Right: ` agents:` (using 2 or 4 spaces consistently)
|
|
78
|
+
|
|
79
|
+
2. **Missing colons**: Every key must have a colon
|
|
80
|
+
- Wrong: `name coder`
|
|
81
|
+
- Right: `name: coder`
|
|
82
|
+
|
|
83
|
+
3. **Unquoted special characters**: Strings with `:`, `{{`, `}}`, `#` need quotes
|
|
84
|
+
- Wrong: `query: Fix: the bug`
|
|
85
|
+
- Right: `query: "Fix: the bug"`
|
|
86
|
+
|
|
87
|
+
4. **List syntax**: Lists must use `-` prefix
|
|
88
|
+
- Wrong: `steps: [step1, step2]` (use this only for inline arrays)
|
|
89
|
+
- Right:
|
|
90
|
+
```yaml
|
|
91
|
+
steps:
|
|
92
|
+
- id: step1
|
|
93
|
+
- id: step2
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Quick Fix**:
|
|
97
|
+
- Copy your YAML content to an online YAML validator
|
|
98
|
+
- Use a YAML-aware editor (VS Code, etc.) with syntax highlighting
|
|
99
|
+
- Check the specific line mentioned in the error (if available)
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
elif isinstance(error, WorkflowValidationError):
|
|
103
|
+
field = error.field_path if hasattr(error, "field_path") else "unknown field"
|
|
104
|
+
expected = error.expected if hasattr(error, "expected") else "see documentation"
|
|
105
|
+
return f"""
|
|
106
|
+
**Error Type**: Configuration Validation Error
|
|
107
|
+
|
|
108
|
+
**What happened**: The workflow configuration contains invalid or missing values.
|
|
109
|
+
|
|
110
|
+
**Problem Field**: `{field}`
|
|
111
|
+
**Expected**: {expected}
|
|
112
|
+
|
|
113
|
+
**Common Configuration Issues**:
|
|
114
|
+
1. **Missing required fields**: Ensure all required fields are present
|
|
115
|
+
- Required in workflow: `apiVersion`, `kind`, `metadata.name`, `spec.agents`, `spec.steps`
|
|
116
|
+
- Required in agents: `id`, `path`
|
|
117
|
+
- Required in steps: `id`, `agent`
|
|
118
|
+
|
|
119
|
+
2. **Invalid enum values**:
|
|
120
|
+
- `runner` must be: `sdk` or `terminal`
|
|
121
|
+
- `conversation.action` must be: `new`, `resume`, or `continue`
|
|
122
|
+
- `attempt.format` must be: `json` or `text`
|
|
123
|
+
|
|
124
|
+
3. **Type mismatches**:
|
|
125
|
+
- `max_turns`, `retries`, `timeout_sec` must be positive integers
|
|
126
|
+
- `include_rules` must be boolean (`true` or `false`)
|
|
127
|
+
- `agents` and `steps` must be arrays (lists)
|
|
128
|
+
|
|
129
|
+
4. **Duplicate IDs**: All agent IDs and step IDs must be unique
|
|
130
|
+
|
|
131
|
+
**Quick Fix**:
|
|
132
|
+
- Review the specific field path mentioned above
|
|
133
|
+
- Check the workflow specification using `load_extra_document` tool with name 'workflow_subagents'
|
|
134
|
+
- Compare your configuration with working examples
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
elif isinstance(error, WorkflowDependencyError):
|
|
138
|
+
return f"""
|
|
139
|
+
**Error Type**: Step Dependency Error
|
|
140
|
+
|
|
141
|
+
**What happened**: The workflow has dependency-related issues (circular dependencies or missing step references).
|
|
142
|
+
|
|
143
|
+
**Dependency Rules**:
|
|
144
|
+
1. **No circular dependencies**: Step A cannot depend on Step B if Step B depends on Step A
|
|
145
|
+
- Wrong:
|
|
146
|
+
```yaml
|
|
147
|
+
- id: step1
|
|
148
|
+
needs: [step2]
|
|
149
|
+
- id: step2
|
|
150
|
+
needs: [step1] # Circular!
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
2. **Referenced steps must exist**: Steps in `needs` field must be defined
|
|
154
|
+
- Wrong: `needs: [nonexistent_step]`
|
|
155
|
+
- Right: `needs: [gather_context]` (where gather_context is a valid step id)
|
|
156
|
+
|
|
157
|
+
3. **Execution order**: Steps are executed in topological order based on dependencies
|
|
158
|
+
- Dependencies are executed first
|
|
159
|
+
- Steps without dependencies can run in any order
|
|
160
|
+
|
|
161
|
+
**Quick Fix**:
|
|
162
|
+
1. Check the dependency chain shown in the error message
|
|
163
|
+
2. Verify all step IDs referenced in `needs` fields exist
|
|
164
|
+
3. Draw a dependency graph on paper to visualize the flow
|
|
165
|
+
4. Remove or fix circular dependencies
|
|
166
|
+
|
|
167
|
+
**Example of correct dependencies**:
|
|
168
|
+
```yaml
|
|
169
|
+
steps:
|
|
170
|
+
- id: gather
|
|
171
|
+
agent: context
|
|
172
|
+
# No dependencies, runs first
|
|
173
|
+
|
|
174
|
+
- id: implement
|
|
175
|
+
needs: [gather] # Depends on 'gather', runs after it
|
|
176
|
+
agent: coder
|
|
177
|
+
```
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
elif isinstance(error, WorkflowAgentNotFoundError):
|
|
181
|
+
agent_id = error.agent_id if hasattr(error, "agent_id") else "unknown"
|
|
182
|
+
available = error.available_agents if hasattr(error, "available_agents") else []
|
|
183
|
+
return f"""
|
|
184
|
+
**Error Type**: Agent Reference Error
|
|
185
|
+
|
|
186
|
+
**What happened**: A step references an agent '{agent_id}' that is not defined in `spec.agents`.
|
|
187
|
+
|
|
188
|
+
**Available Agents**: {', '.join(available) if available else 'none'}
|
|
189
|
+
|
|
190
|
+
**How to Fix**:
|
|
191
|
+
1. **Option A - Fix the typo**: If you meant to use an existing agent, correct the spelling
|
|
192
|
+
- Check step's `agent` field matches an `id` in `spec.agents`
|
|
193
|
+
|
|
194
|
+
2. **Option B - Define the missing agent**: If '{agent_id}' is a new agent, add it to `spec.agents`
|
|
195
|
+
```yaml
|
|
196
|
+
spec:
|
|
197
|
+
agents:
|
|
198
|
+
- id: {agent_id}
|
|
199
|
+
path: {agent_id}.md # Path to agent prompt file
|
|
200
|
+
runner: sdk # or terminal
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
3. **Verify agent files exist**:
|
|
204
|
+
- Agent prompt files should be in `.autocoderagents/` directory
|
|
205
|
+
- Use `ac_mod_list` tool to check available agent definitions
|
|
206
|
+
|
|
207
|
+
**Quick Fix**:
|
|
208
|
+
- Review your `spec.agents` section
|
|
209
|
+
- Ensure each step's `agent` field matches an agent `id`
|
|
210
|
+
- Create missing agent definition files if needed
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
elif isinstance(error, WorkflowTemplateError):
|
|
214
|
+
expr = error.expression if hasattr(error, "expression") else "unknown"
|
|
215
|
+
return f"""
|
|
216
|
+
**Error Type**: Template Rendering Error
|
|
217
|
+
|
|
218
|
+
**What happened**: Unable to resolve the template expression `${{{expr}}}` in the workflow configuration.
|
|
219
|
+
|
|
220
|
+
**Template Syntax**:
|
|
221
|
+
- `${{vars.key}}` - Access global variables from `spec.vars`
|
|
222
|
+
- `${{steps.stepId.outputs.key}}` - Access outputs from previous steps
|
|
223
|
+
- `${{attempt_result}}` - Access the raw result from the previous step
|
|
224
|
+
- `\\$` - Escape literal dollar sign
|
|
225
|
+
|
|
226
|
+
**Common Template Issues**:
|
|
227
|
+
1. **Referencing undefined variables**:
|
|
228
|
+
- Ensure the variable is defined in `spec.vars`
|
|
229
|
+
- Example: `${{vars.query}}` requires `vars: {{ query: "..." }}`
|
|
230
|
+
|
|
231
|
+
2. **Referencing outputs from steps not yet executed**:
|
|
232
|
+
- Can only reference outputs from steps that have already run
|
|
233
|
+
- Check step execution order (use `needs` to ensure dependencies)
|
|
234
|
+
|
|
235
|
+
3. **Typos in step IDs or output keys**:
|
|
236
|
+
- Verify step ID spelling: `${{steps.gather_context.outputs.files}}`
|
|
237
|
+
- Ensure the output key was defined in that step's `outputs` section
|
|
238
|
+
|
|
239
|
+
4. **Wrong template path structure**:
|
|
240
|
+
- Must follow exact format: `steps.<step_id>.outputs.<output_key>`
|
|
241
|
+
|
|
242
|
+
**Quick Fix**:
|
|
243
|
+
1. Review the context keys available (shown in error message)
|
|
244
|
+
2. Verify the referenced step has executed before this step
|
|
245
|
+
3. Check the `outputs` section of the referenced step
|
|
246
|
+
4. Ensure proper nesting: `steps` → `step_id` → `outputs` → `key`
|
|
247
|
+
|
|
248
|
+
**Example of correct template usage**:
|
|
249
|
+
```yaml
|
|
250
|
+
steps:
|
|
251
|
+
- id: gather
|
|
252
|
+
outputs:
|
|
253
|
+
files: "${{attempt_result}}" # Save the result
|
|
254
|
+
|
|
255
|
+
- id: implement
|
|
256
|
+
needs: [gather] # Ensure 'gather' runs first
|
|
257
|
+
with:
|
|
258
|
+
user_input: "Process these files: ${{steps.gather.outputs.files}}"
|
|
259
|
+
```
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
else:
|
|
263
|
+
# 通用错误反馈
|
|
264
|
+
return f"""
|
|
265
|
+
**Error Type**: {error_type}
|
|
266
|
+
|
|
267
|
+
**What happened**: An error occurred while executing the workflow '{workflow_name}'.
|
|
268
|
+
|
|
269
|
+
**Error Details**: {str(error)}
|
|
270
|
+
|
|
271
|
+
**General Troubleshooting Steps**:
|
|
272
|
+
1. **Review the error message** carefully for specific details
|
|
273
|
+
2. **Check the workflow YAML** configuration for common issues:
|
|
274
|
+
- Syntax errors (indentation, missing colons, quotes)
|
|
275
|
+
- Missing required fields
|
|
276
|
+
- Invalid enum values
|
|
277
|
+
- Type mismatches
|
|
278
|
+
|
|
279
|
+
3. **Validate step by step**:
|
|
280
|
+
- Verify each agent is defined
|
|
281
|
+
- Check all step dependencies are valid
|
|
282
|
+
- Ensure template expressions are correct
|
|
283
|
+
|
|
284
|
+
4. **Use diagnostic tools**:
|
|
285
|
+
- Use `load_extra_document` tool with name 'workflow_subagents' to see the specification
|
|
286
|
+
- Review working workflow examples
|
|
287
|
+
- Enable debug logging to see detailed execution flow
|
|
288
|
+
|
|
289
|
+
5. **Simplify and test**:
|
|
290
|
+
- Start with a minimal workflow (1-2 steps)
|
|
291
|
+
- Test each component individually
|
|
292
|
+
- Gradually add complexity
|
|
293
|
+
|
|
294
|
+
**Need Help?**:
|
|
295
|
+
- Check the workflow documentation for examples
|
|
296
|
+
- Review error message structure for specific guidance
|
|
297
|
+
- Use load_extra_document tool to get the workflow YAML specification
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class ExecuteWorkflowToolResolver(BaseToolResolver):
|
|
302
|
+
"""执行 Workflow 工具解析器
|
|
303
|
+
|
|
304
|
+
参考 terminal/command_processor.py 中 handle_workflow 的逻辑,
|
|
305
|
+
调用 run_workflow_from_yaml 来执行指定名称的 workflow。
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
def __init__(
|
|
309
|
+
self,
|
|
310
|
+
agent: Optional["AgenticEdit"],
|
|
311
|
+
tool: ExecuteWorkflowTool,
|
|
312
|
+
args: AutoCoderArgs,
|
|
313
|
+
):
|
|
314
|
+
super().__init__(agent, tool, args)
|
|
315
|
+
self.tool: ExecuteWorkflowTool = tool
|
|
316
|
+
|
|
317
|
+
def resolve(self) -> ToolResult:
|
|
318
|
+
try:
|
|
319
|
+
from autocoder.workflow_agents.runner import (
|
|
320
|
+
run_workflow_from_yaml,
|
|
321
|
+
print_workflow_result,
|
|
322
|
+
list_available_workflows,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
workflow_name = self.tool.name.strip()
|
|
326
|
+
source_dir = self.args.source_dir or "."
|
|
327
|
+
|
|
328
|
+
# 解析 vars_override
|
|
329
|
+
vars_override = None
|
|
330
|
+
if self.tool.vars_override:
|
|
331
|
+
try:
|
|
332
|
+
vars_override = json.loads(self.tool.vars_override)
|
|
333
|
+
if not isinstance(vars_override, dict):
|
|
334
|
+
return ToolResult(
|
|
335
|
+
success=False,
|
|
336
|
+
message=f"vars_override must be a JSON object, got: {type(vars_override).__name__}",
|
|
337
|
+
)
|
|
338
|
+
except json.JSONDecodeError as e:
|
|
339
|
+
return ToolResult(
|
|
340
|
+
success=False,
|
|
341
|
+
message=f"Invalid JSON in vars_override: {str(e)}",
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# 调用 run_workflow_from_yaml(参考 handle_workflow)
|
|
345
|
+
logger.info(
|
|
346
|
+
f"Executing workflow: {workflow_name} with vars_override={vars_override}"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
result = run_workflow_from_yaml(
|
|
350
|
+
yaml_path=workflow_name,
|
|
351
|
+
source_dir=source_dir,
|
|
352
|
+
vars_override=vars_override,
|
|
353
|
+
cancel_token=None, # 由外层 agent 管理 cancel
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# 构建可读的结果消息
|
|
357
|
+
if result.success:
|
|
358
|
+
message_lines = [f"✅ Workflow '{workflow_name}' executed successfully"]
|
|
359
|
+
message_lines.append(
|
|
360
|
+
f"Total steps: {len(result.step_results)}, Success: {sum(1 for s in result.step_results if s.status.value == 'success')}"
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# 添加每个步骤的简要信息
|
|
364
|
+
for step_result in result.step_results:
|
|
365
|
+
status_icon = (
|
|
366
|
+
"✅"
|
|
367
|
+
if step_result.status.value == "success"
|
|
368
|
+
else ("❌" if step_result.status.value == "failed" else "⏭️")
|
|
369
|
+
)
|
|
370
|
+
message_lines.append(
|
|
371
|
+
f" {status_icon} {step_result.step_id}: {step_result.status.value}"
|
|
372
|
+
)
|
|
373
|
+
if step_result.error:
|
|
374
|
+
message_lines.append(f" Error: {step_result.error}")
|
|
375
|
+
|
|
376
|
+
message = "\n".join(message_lines)
|
|
377
|
+
|
|
378
|
+
# content 包含详细的结构化结果
|
|
379
|
+
content = {
|
|
380
|
+
"workflow_name": workflow_name,
|
|
381
|
+
"success": result.success,
|
|
382
|
+
"step_count": len(result.step_results),
|
|
383
|
+
"steps": [
|
|
384
|
+
{
|
|
385
|
+
"step_id": s.step_id,
|
|
386
|
+
"status": s.status.value,
|
|
387
|
+
"error": s.error,
|
|
388
|
+
"attempt_result": s.attempt_result,
|
|
389
|
+
"outputs": s.outputs,
|
|
390
|
+
}
|
|
391
|
+
for s in result.step_results
|
|
392
|
+
],
|
|
393
|
+
"context": result.context,
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return ToolResult(success=True, message=message, content=content)
|
|
397
|
+
else:
|
|
398
|
+
# 失败情况
|
|
399
|
+
error_msg = result.error or "Unknown error"
|
|
400
|
+
message_lines = [f"❌ Workflow '{workflow_name}' failed: {error_msg}"]
|
|
401
|
+
|
|
402
|
+
# 列出可用的 workflow(帮助用户找到正确的名称)
|
|
403
|
+
if "未找到 workflow" in error_msg or "not found" in error_msg.lower():
|
|
404
|
+
message_lines.append("\nAvailable workflows:")
|
|
405
|
+
workflows = list_available_workflows(source_dir)
|
|
406
|
+
if workflows:
|
|
407
|
+
for name, path in workflows.items():
|
|
408
|
+
message_lines.append(f" - {name}: {path}")
|
|
409
|
+
else:
|
|
410
|
+
message_lines.append(" (no workflows found)")
|
|
411
|
+
|
|
412
|
+
message = "\n".join(message_lines)
|
|
413
|
+
|
|
414
|
+
# 生成错误反馈指导(如果错误来自workflow异常)
|
|
415
|
+
feedback = None
|
|
416
|
+
try:
|
|
417
|
+
# 尝试从 result.error 中提取原始异常
|
|
418
|
+
# 注意:这里需要在 runner.py 中传递原始异常对象,或者根据错误消息判断类型
|
|
419
|
+
# 当前简化处理:根据错误消息关键词生成反馈
|
|
420
|
+
if (
|
|
421
|
+
"未找到 workflow" in error_msg
|
|
422
|
+
or "not found" in error_msg.lower()
|
|
423
|
+
):
|
|
424
|
+
from autocoder.workflow_agents.exceptions import (
|
|
425
|
+
WorkflowFileNotFoundError,
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
dummy_error = WorkflowFileNotFoundError(workflow_name)
|
|
429
|
+
feedback = _generate_error_feedback(dummy_error, workflow_name)
|
|
430
|
+
elif (
|
|
431
|
+
"解析" in error_msg
|
|
432
|
+
or "parse" in error_msg.lower()
|
|
433
|
+
or "yaml" in error_msg.lower()
|
|
434
|
+
):
|
|
435
|
+
from autocoder.workflow_agents.exceptions import (
|
|
436
|
+
WorkflowParseError,
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
dummy_error = WorkflowParseError(
|
|
440
|
+
workflow_name, Exception(error_msg)
|
|
441
|
+
)
|
|
442
|
+
feedback = _generate_error_feedback(dummy_error, workflow_name)
|
|
443
|
+
elif "循环依赖" in error_msg or "circular" in error_msg.lower():
|
|
444
|
+
from autocoder.workflow_agents.exceptions import (
|
|
445
|
+
WorkflowDependencyError,
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
dummy_error = WorkflowDependencyError(error_msg)
|
|
449
|
+
feedback = _generate_error_feedback(dummy_error, workflow_name)
|
|
450
|
+
except Exception:
|
|
451
|
+
pass # 忽略反馈生成错误
|
|
452
|
+
|
|
453
|
+
return ToolResult(
|
|
454
|
+
success=False,
|
|
455
|
+
message=message,
|
|
456
|
+
content={
|
|
457
|
+
"workflow_name": workflow_name,
|
|
458
|
+
"error": error_msg,
|
|
459
|
+
"feedback": feedback, # 添加反馈指导
|
|
460
|
+
"step_results": [
|
|
461
|
+
{
|
|
462
|
+
"step_id": s.step_id,
|
|
463
|
+
"status": s.status.value,
|
|
464
|
+
"error": s.error,
|
|
465
|
+
}
|
|
466
|
+
for s in result.step_results
|
|
467
|
+
],
|
|
468
|
+
},
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
except Exception as e:
|
|
472
|
+
logger.exception(f"ExecuteWorkflowTool failed: {e}")
|
|
473
|
+
|
|
474
|
+
# 生成错误反馈指导
|
|
475
|
+
feedback = _generate_error_feedback(e, self.tool.name)
|
|
476
|
+
|
|
477
|
+
return ToolResult(
|
|
478
|
+
success=False,
|
|
479
|
+
message=f"Workflow execution error: {str(e)}",
|
|
480
|
+
content={
|
|
481
|
+
"error": str(e),
|
|
482
|
+
"error_type": type(e).__name__,
|
|
483
|
+
"feedback": feedback, # 添加反馈指导
|
|
484
|
+
},
|
|
485
|
+
)
|