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
|
@@ -5,15 +5,20 @@ SdkRunner 提供生成器接口,适用于SDK环境下的代理运行。
|
|
|
5
5
|
它是三种运行模式中最轻量级的一种,适合集成到其他应用程序中。
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
from typing import Generator, Any
|
|
8
|
+
from loguru import logger
|
|
9
|
+
from typing import Generator, Any, Optional
|
|
10
|
+
import os
|
|
11
|
+
import time
|
|
10
12
|
|
|
11
13
|
from autocoder.common.v2.agent.agentic_edit_types import (
|
|
12
|
-
AgenticEditRequest, AgentEvent, CompletionEvent
|
|
14
|
+
AgenticEditRequest, AgentEvent, CompletionEvent, PullRequestEvent,
|
|
15
|
+
PullRequestResult, CommitEvent,PreCommitEvent
|
|
13
16
|
)
|
|
14
|
-
from .
|
|
17
|
+
from autocoder.common import git_utils
|
|
18
|
+
from autocoder.common.git_utils import CommitResult
|
|
19
|
+
from autocoder.common.pull_requests import create_pull_request
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
from .base_runner import BaseRunner
|
|
17
22
|
|
|
18
23
|
class SdkRunner(BaseRunner):
|
|
19
24
|
"""
|
|
@@ -22,17 +27,154 @@ class SdkRunner(BaseRunner):
|
|
|
22
27
|
这个运行器返回一个事件生成器,允许外部代码迭代处理代理事件。
|
|
23
28
|
它是三种运行模式中最轻量级的一种,适合集成到其他应用程序中。
|
|
24
29
|
"""
|
|
30
|
+
|
|
31
|
+
def apply_pre_changes(self)->Optional[CommitResult]:
|
|
32
|
+
# get the file name
|
|
33
|
+
file_name = os.path.basename(self.args.file)
|
|
34
|
+
if not self.args.skip_commit:
|
|
35
|
+
try:
|
|
36
|
+
commit_result = git_utils.commit_changes(
|
|
37
|
+
self.args.source_dir, f"auto_coder_pre_{file_name}")
|
|
38
|
+
return commit_result
|
|
39
|
+
|
|
40
|
+
except Exception as e:
|
|
41
|
+
self.printer.print_in_terminal("git_init_required",
|
|
42
|
+
source_dir=self.args.source_dir, error=str(e))
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def apply_changes(self) -> tuple[Optional[CommitResult], Optional[PullRequestResult]]:
|
|
46
|
+
"""
|
|
47
|
+
应用变更并可选地创建 Pull Request
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
tuple: (commit_result, pull_request_result)
|
|
51
|
+
"""
|
|
52
|
+
if not self.args.skip_commit:
|
|
53
|
+
try:
|
|
54
|
+
file_name = os.path.basename(self.args.file)
|
|
55
|
+
commit_result = git_utils.commit_changes(
|
|
56
|
+
self.args.source_dir,
|
|
57
|
+
f"{self.args.query}\nauto_coder_{file_name}",
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
pull_request_result = None
|
|
61
|
+
# 检查是否需要创建 Pull Request
|
|
62
|
+
if self.conversation_config and self.conversation_config.pull_request:
|
|
63
|
+
pr_result = self._create_pull_request(commit_result)
|
|
64
|
+
if pr_result:
|
|
65
|
+
# 将 PRResult 转换为 PullRequestResult
|
|
66
|
+
pull_request_result = PullRequestResult.from_pr_result(pr_result)
|
|
67
|
+
|
|
68
|
+
return commit_result, pull_request_result
|
|
69
|
+
|
|
70
|
+
except Exception as e:
|
|
71
|
+
self.printer.print_str_in_terminal(
|
|
72
|
+
str(e),
|
|
73
|
+
style="red"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
return None, None
|
|
77
|
+
|
|
78
|
+
def _create_pull_request(self, commit_result):
|
|
79
|
+
"""
|
|
80
|
+
创建 Pull Request 的内部方法
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
commit_result: Git commit 结果对象
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
PRResult: Pull Request 创建结果
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
|
|
90
|
+
# 获取当前分支名
|
|
91
|
+
current_branch = git_utils.get_current_branch(self.args.source_dir)
|
|
92
|
+
if not current_branch:
|
|
93
|
+
logger.warning("无法获取当前分支名")
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
# 准备 PR 标题和描述
|
|
97
|
+
query = self.args.query or "Auto-coder generated changes"
|
|
98
|
+
pr_title = f"Auto-coder: {query[:40]}..."
|
|
99
|
+
|
|
100
|
+
# 构建 PR 描述
|
|
101
|
+
file_list = ""
|
|
102
|
+
if commit_result.changed_files:
|
|
103
|
+
for file_path in commit_result.changed_files:
|
|
104
|
+
file_list += f"- `{file_path}`\n"
|
|
105
|
+
|
|
106
|
+
pr_description = f"""## 自动生成的代码变更
|
|
107
|
+
|
|
108
|
+
**查询内容**: {query}
|
|
109
|
+
|
|
110
|
+
**变更文件数量**: {len(commit_result.changed_files or [])}
|
|
111
|
+
|
|
112
|
+
**Commit Hash**: {commit_result.commit_hash}
|
|
113
|
+
|
|
114
|
+
### 变更文件列表:
|
|
115
|
+
{file_list.strip()}
|
|
116
|
+
|
|
117
|
+
**源分支**: {current_branch}
|
|
118
|
+
**目标分支**: main
|
|
119
|
+
**生成时间**: {time.strftime('%Y-%m-%d %H:%M:%S')}
|
|
120
|
+
---
|
|
121
|
+
此 Pull Request 由 Auto-coder 自动生成
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
# 创建 Pull Request
|
|
125
|
+
logger.info(f"正在创建 Pull Request: {pr_title}")
|
|
126
|
+
|
|
127
|
+
result = create_pull_request(
|
|
128
|
+
repo_path=self.args.source_dir,
|
|
129
|
+
title=pr_title,
|
|
130
|
+
description=pr_description,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
if result.success:
|
|
134
|
+
logger.info("Pull Request 创建成功")
|
|
135
|
+
logger.info(f"PR URL: {result.pr_url}")
|
|
136
|
+
logger.info(f"PR 编号: {result.pr_number}")
|
|
137
|
+
|
|
138
|
+
return result
|
|
139
|
+
|
|
140
|
+
except Exception as e:
|
|
141
|
+
logger.exception(f"创建 Pull Request 时发生异常: {str(e)}")
|
|
142
|
+
# 返回一个失败的 PRResult
|
|
143
|
+
try:
|
|
144
|
+
from autocoder.common.pull_requests.models import PRResult
|
|
145
|
+
return PRResult(
|
|
146
|
+
success=False,
|
|
147
|
+
error_message=f"创建 Pull Request 失败: {str(e)}"
|
|
148
|
+
)
|
|
149
|
+
except ImportError:
|
|
150
|
+
return None
|
|
25
151
|
|
|
26
152
|
def run(self, request: AgenticEditRequest) -> Generator[AgentEvent, None, None]:
|
|
27
153
|
"""
|
|
28
154
|
Runs the agentic edit process and yields events for external processing.
|
|
29
155
|
"""
|
|
30
156
|
try:
|
|
31
|
-
|
|
157
|
+
if self.conversation_config and self.conversation_config.pre_commit:
|
|
158
|
+
pre_commit_result = self.apply_pre_changes()
|
|
159
|
+
yield PreCommitEvent(commit_result=pre_commit_result)
|
|
160
|
+
|
|
161
|
+
event_stream = self.analyze(request)
|
|
32
162
|
for agent_event in event_stream:
|
|
33
163
|
if isinstance(agent_event, CompletionEvent):
|
|
34
|
-
self.
|
|
35
|
-
|
|
164
|
+
if self.conversation_config and self.conversation_config.post_commit:
|
|
165
|
+
commit_result, pull_request_result = self.apply_changes()
|
|
166
|
+
# 发射 commit 事件
|
|
167
|
+
if commit_result:
|
|
168
|
+
yield CommitEvent(commit_result=commit_result)
|
|
169
|
+
|
|
170
|
+
# 发射 pull request 事件(如果有)
|
|
171
|
+
if pull_request_result:
|
|
172
|
+
yield PullRequestEvent(pull_request_result=pull_request_result)
|
|
173
|
+
|
|
174
|
+
# 总是发射 completion 事件
|
|
175
|
+
yield agent_event
|
|
176
|
+
else:
|
|
177
|
+
yield agent_event
|
|
36
178
|
|
|
37
179
|
except Exception as e:
|
|
38
180
|
logger.exception(
|
|
@@ -17,18 +17,21 @@ from rich.markdown import Markdown
|
|
|
17
17
|
from rich.syntax import Syntax
|
|
18
18
|
|
|
19
19
|
from autocoder.common.auto_coder_lang import get_message
|
|
20
|
+
from byzerllm.utils.types import SingleOutputMeta
|
|
20
21
|
from autocoder.utils import llms as llm_utils
|
|
21
22
|
from autocoder.common.v2.agent.agentic_edit_types import (
|
|
22
23
|
AgenticEditRequest, AgentEvent, CompletionEvent,
|
|
23
24
|
LLMOutputEvent, LLMThinkingEvent, ToolCallEvent,
|
|
24
25
|
ToolResultEvent, TokenUsageEvent, ErrorEvent,
|
|
25
26
|
WindowLengthChangeEvent, ConversationIdEvent,
|
|
26
|
-
PlanModeRespondEvent,
|
|
27
|
+
PlanModeRespondEvent, AttemptCompletionTool,
|
|
28
|
+
ConversationAction, TodoReadTool, TodoWriteTool,
|
|
29
|
+
ConversationMessageIdsWriteTool, ConversationMessageIdsReadTool
|
|
27
30
|
)
|
|
28
|
-
from .tool_display import get_tool_display_message
|
|
31
|
+
from .tool_display import get_tool_display_message, get_tool_title, get_tool_result_title
|
|
29
32
|
from .base_runner import BaseRunner
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
from autocoder.common.wrap_llm_hint.utils import extract_content_from_text, has_hint_in_text
|
|
34
|
+
from loguru import logger
|
|
32
35
|
|
|
33
36
|
class TerminalRunner(BaseRunner):
|
|
34
37
|
"""
|
|
@@ -38,37 +41,55 @@ class TerminalRunner(BaseRunner):
|
|
|
38
41
|
并以用户友好的方式在终端中显示。
|
|
39
42
|
"""
|
|
40
43
|
|
|
41
|
-
def
|
|
44
|
+
def _safe_console_print(self, console: Console, renderable, fallback_content: Optional[str] = None, error_prefix: str = "Rich display"):
|
|
45
|
+
"""
|
|
46
|
+
安全地在控制台打印内容,如果Rich markup失败则回退到纯文本。
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
console: Rich Console对象
|
|
50
|
+
renderable: 要渲染的Rich对象(如Panel、Markdown等)
|
|
51
|
+
fallback_content: 回退时显示的内容,如果为None则从renderable中提取
|
|
52
|
+
error_prefix: 错误日志的前缀
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
console.print(renderable)
|
|
56
|
+
except Exception as display_error:
|
|
57
|
+
logger.warning(f"{error_prefix} error, falling back to plain text: {display_error}")
|
|
58
|
+
|
|
59
|
+
# 如果没有提供fallback_content,尝试从renderable中提取
|
|
60
|
+
if fallback_content is None:
|
|
61
|
+
if hasattr(renderable, 'renderable') and hasattr(renderable.renderable, 'markup'):
|
|
62
|
+
# Panel with Markdown
|
|
63
|
+
fallback_content = str(renderable.renderable.markup)
|
|
64
|
+
elif hasattr(renderable, 'renderable'):
|
|
65
|
+
# Panel with other content
|
|
66
|
+
fallback_content = str(renderable.renderable)
|
|
67
|
+
else:
|
|
68
|
+
fallback_content = str(renderable)
|
|
69
|
+
|
|
70
|
+
# 转义Rich markup字符
|
|
71
|
+
safe_content = fallback_content.replace('[', '\\[').replace(']', '\\]')
|
|
72
|
+
|
|
73
|
+
# 如果原来是Panel,保持Panel结构
|
|
74
|
+
if hasattr(renderable, 'title') and hasattr(renderable, 'border_style'):
|
|
75
|
+
console.print(Panel(
|
|
76
|
+
safe_content,
|
|
77
|
+
title=renderable.title,
|
|
78
|
+
border_style=renderable.border_style,
|
|
79
|
+
title_align=getattr(renderable, 'title_align', 'center')
|
|
80
|
+
))
|
|
81
|
+
else:
|
|
82
|
+
console.print(safe_content)
|
|
83
|
+
|
|
84
|
+
def run(self, request: AgenticEditRequest) -> str:
|
|
42
85
|
"""
|
|
43
86
|
Runs the agentic edit process based on the request and displays
|
|
44
87
|
the interaction streamingly in the terminal using Rich.
|
|
45
|
-
"""
|
|
46
|
-
|
|
88
|
+
"""
|
|
89
|
+
self.attempt_result = ""
|
|
47
90
|
console = Console()
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if self.conversation_config.action == "list":
|
|
51
|
-
conversations = self.agent.conversation_manager.list_conversations()
|
|
52
|
-
# 只保留 conversation_id 和 name 字段
|
|
53
|
-
filtered_conversations = []
|
|
54
|
-
for conv in conversations:
|
|
55
|
-
filtered_conv = {
|
|
56
|
-
"conversation_id": conv.get("conversation_id"),
|
|
57
|
-
"name": conv.get("name")
|
|
58
|
-
}
|
|
59
|
-
filtered_conversations.append(filtered_conv)
|
|
60
|
-
|
|
61
|
-
# 格式化 JSON 输出,使用 JSON 格式渲染而不是 Markdown
|
|
62
|
-
json_str = json.dumps(filtered_conversations, ensure_ascii=False, indent=4)
|
|
63
|
-
console.print(Panel(json_str,
|
|
64
|
-
title="🏁 Task Completion", border_style="green", title_align="left"))
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if self.conversation_config.action == "new" and not request.user_input.strip():
|
|
69
|
-
console.print(Panel(Markdown(f"New conversation created: {self.agent.conversation_manager.get_current_conversation_id()}"),
|
|
70
|
-
title="🏁 Task Completion", border_style="green", title_align="left"))
|
|
71
|
-
return
|
|
91
|
+
source_dir = self.args.source_dir or "."
|
|
92
|
+
project_name = os.path.basename(os.path.abspath(source_dir))
|
|
72
93
|
|
|
73
94
|
console.rule(f"[bold cyan]Starting Agentic Edit: {project_name}[/]")
|
|
74
95
|
console.print(Panel(
|
|
@@ -83,10 +104,10 @@ class TerminalRunner(BaseRunner):
|
|
|
83
104
|
"output_cost": 0.0
|
|
84
105
|
}
|
|
85
106
|
|
|
86
|
-
try:
|
|
87
|
-
self.apply_pre_changes()
|
|
88
|
-
event_stream = self.analyze(request)
|
|
89
|
-
for event in event_stream:
|
|
107
|
+
try:
|
|
108
|
+
self.apply_pre_changes()
|
|
109
|
+
event_stream = self.analyze(request)
|
|
110
|
+
for event in event_stream:
|
|
90
111
|
if isinstance(event, ConversationIdEvent):
|
|
91
112
|
console.print(f"[dim]Conversation ID: {event.conversation_id}[/dim]")
|
|
92
113
|
continue
|
|
@@ -121,7 +142,10 @@ class TerminalRunner(BaseRunner):
|
|
|
121
142
|
elif isinstance(event, WindowLengthChangeEvent):
|
|
122
143
|
# 显示当前会话的token数量
|
|
123
144
|
logger.info(f"当前会话总 tokens: {event.tokens_used}")
|
|
124
|
-
|
|
145
|
+
if event.tokens_used > event.pruned_tokens_used:
|
|
146
|
+
console.print(f"[dim]conversation tokens: {event.tokens_used} -> {event.pruned_tokens_used} (conversation round: {event.conversation_round})[/dim]")
|
|
147
|
+
else:
|
|
148
|
+
console.print(f"[dim]conversation tokens: {event.tokens_used} (conversation round: {event.conversation_round})[/dim]")
|
|
125
149
|
|
|
126
150
|
elif isinstance(event, LLMThinkingEvent):
|
|
127
151
|
# Render thinking within a less prominent style, maybe grey?
|
|
@@ -134,11 +158,38 @@ class TerminalRunner(BaseRunner):
|
|
|
134
158
|
if isinstance(event.tool, AttemptCompletionTool):
|
|
135
159
|
continue # Do not display AttemptCompletionTool tool call
|
|
136
160
|
|
|
137
|
-
|
|
161
|
+
# Special handling for ConversationMessageIds tools - only show compacting message
|
|
162
|
+
if isinstance(event.tool, (ConversationMessageIdsWriteTool, ConversationMessageIdsReadTool)):
|
|
163
|
+
# Use internationalization module to get the compacting message
|
|
164
|
+
compacting_message = get_message("conversation_compacting")
|
|
165
|
+
compacting_title = get_message("conversation_compacting_title")
|
|
166
|
+
|
|
167
|
+
self._safe_console_print(
|
|
168
|
+
console,
|
|
169
|
+
Panel(f"[dim]{compacting_message}[/dim]", title=f"🗜️ {compacting_title}", border_style="yellow", title_align="left"),
|
|
170
|
+
fallback_content=compacting_message,
|
|
171
|
+
error_prefix="Compacting display"
|
|
172
|
+
)
|
|
173
|
+
continue
|
|
174
|
+
|
|
175
|
+
# Get the descriptive title for the tool
|
|
176
|
+
title = get_tool_title(event.tool)
|
|
177
|
+
|
|
138
178
|
# Use the new internationalized display function
|
|
139
179
|
display_content = get_tool_display_message(event.tool)
|
|
140
|
-
|
|
141
|
-
|
|
180
|
+
|
|
181
|
+
# Use cyan border for todo tools, blue for others
|
|
182
|
+
if isinstance(event.tool, (TodoReadTool, TodoWriteTool)):
|
|
183
|
+
border_style = "cyan"
|
|
184
|
+
else:
|
|
185
|
+
border_style = "blue"
|
|
186
|
+
|
|
187
|
+
self._safe_console_print(
|
|
188
|
+
console,
|
|
189
|
+
Panel(display_content, title=f"📝 {title}", border_style=border_style, title_align="left"),
|
|
190
|
+
fallback_content=str(display_content),
|
|
191
|
+
error_prefix="Tool display"
|
|
192
|
+
)
|
|
142
193
|
|
|
143
194
|
elif isinstance(event, ToolResultEvent):
|
|
144
195
|
# Skip displaying AttemptCompletionTool's result
|
|
@@ -148,11 +199,44 @@ class TerminalRunner(BaseRunner):
|
|
|
148
199
|
if event.tool_name == "PlanModeRespondTool":
|
|
149
200
|
continue
|
|
150
201
|
|
|
202
|
+
# Skip displaying ConversationMessageIds tools' results - they are handled by the compacting message
|
|
203
|
+
if event.tool_name in ["ConversationMessageIdsWriteTool", "ConversationMessageIdsReadTool"]:
|
|
204
|
+
continue
|
|
205
|
+
|
|
151
206
|
result = event.result
|
|
152
|
-
|
|
207
|
+
|
|
208
|
+
# Use friendly result title instead of tool name
|
|
209
|
+
result_title = get_tool_result_title(event.tool_name, result.success)
|
|
210
|
+
title_icon = "✅" if result.success else "❌"
|
|
211
|
+
title = f"{title_icon} {result_title}"
|
|
153
212
|
border_style = "green" if result.success else "red"
|
|
154
|
-
|
|
155
|
-
|
|
213
|
+
|
|
214
|
+
# Special handling for TodoReadTool and TodoWriteTool
|
|
215
|
+
if event.tool_name in ["TodoReadTool", "TodoWriteTool","SessionStartTool","SessionInteractiveTool","SessionStopTool"]:
|
|
216
|
+
# For todo tools, display content directly without syntax highlighting
|
|
217
|
+
if result.content:
|
|
218
|
+
# The content is already nicely formatted by the resolver
|
|
219
|
+
self._safe_console_print(
|
|
220
|
+
console,
|
|
221
|
+
Panel(result.content, title=title, border_style=border_style, title_align="left"),
|
|
222
|
+
fallback_content=str(result.content),
|
|
223
|
+
error_prefix="Todo content display"
|
|
224
|
+
)
|
|
225
|
+
else:
|
|
226
|
+
# If no content, just show the message
|
|
227
|
+
status_message = f"[bold]Status:[/bold] {'Success' if result.success else 'Failure'}\n[bold]Message:[/bold] {result.message}"
|
|
228
|
+
fallback_message = f"Status: {'Success' if result.success else 'Failure'}\nMessage: {result.message}"
|
|
229
|
+
self._safe_console_print(
|
|
230
|
+
console,
|
|
231
|
+
Panel(status_message, title=title, border_style=border_style, title_align="left"),
|
|
232
|
+
fallback_content=fallback_message,
|
|
233
|
+
error_prefix="Todo message display"
|
|
234
|
+
)
|
|
235
|
+
continue # Skip the rest of the processing for todo tools
|
|
236
|
+
|
|
237
|
+
# Regular processing for other tools
|
|
238
|
+
base_content = f"[bold]Status:[/bold] {'Success' if result.success else 'Failure'}"
|
|
239
|
+
base_content += f"\n[bold]Message:[/bold] {result.message}"
|
|
156
240
|
|
|
157
241
|
def _format_content(content):
|
|
158
242
|
if len(content) > 200:
|
|
@@ -167,13 +251,19 @@ class TerminalRunner(BaseRunner):
|
|
|
167
251
|
if result.content is not None:
|
|
168
252
|
content_str = ""
|
|
169
253
|
try:
|
|
170
|
-
|
|
171
|
-
|
|
254
|
+
# Remove hints from content before processing
|
|
255
|
+
processed_content = result.content
|
|
256
|
+
if isinstance(result.content, str) and has_hint_in_text(result.content):
|
|
257
|
+
processed_content = extract_content_from_text(result.content)
|
|
258
|
+
|
|
259
|
+
if isinstance(processed_content, (dict, list)):
|
|
260
|
+
if not processed_content:
|
|
261
|
+
continue
|
|
172
262
|
content_str = json.dumps(
|
|
173
|
-
|
|
263
|
+
processed_content, indent=2, ensure_ascii=False)
|
|
174
264
|
syntax_content = Syntax(
|
|
175
265
|
content_str, "json", theme="default", line_numbers=False)
|
|
176
|
-
elif isinstance(
|
|
266
|
+
elif isinstance(processed_content, str) and ('\n' in processed_content or processed_content.strip().startswith('<')):
|
|
177
267
|
# Heuristic for code or XML/HTML
|
|
178
268
|
lexer = "python" # Default guess
|
|
179
269
|
if event.tool_name == "ReadFileTool" and isinstance(event.result.message, str):
|
|
@@ -202,9 +292,9 @@ class TerminalRunner(BaseRunner):
|
|
|
202
292
|
lexer = "text"
|
|
203
293
|
|
|
204
294
|
syntax_content = Syntax(
|
|
205
|
-
_format_content(
|
|
295
|
+
_format_content(processed_content), lexer, theme="default", line_numbers=True)
|
|
206
296
|
else:
|
|
207
|
-
content_str = str(
|
|
297
|
+
content_str = str(processed_content)
|
|
208
298
|
# Append simple string content directly
|
|
209
299
|
panel_content.append(
|
|
210
300
|
_format_content(content_str))
|
|
@@ -215,16 +305,32 @@ class TerminalRunner(BaseRunner):
|
|
|
215
305
|
# Fallback
|
|
216
306
|
_format_content(str(result.content)))
|
|
217
307
|
|
|
218
|
-
# Print the base info panel
|
|
219
|
-
|
|
220
|
-
|
|
308
|
+
# Print the base info panel with error handling for Rich markup
|
|
309
|
+
panel_content_str = "\n".join(panel_content)
|
|
310
|
+
self._safe_console_print(
|
|
311
|
+
console,
|
|
312
|
+
Panel(panel_content_str, title=title, border_style=border_style, title_align="left"),
|
|
313
|
+
fallback_content=panel_content_str,
|
|
314
|
+
error_prefix="Tool result panel"
|
|
315
|
+
)
|
|
316
|
+
|
|
221
317
|
# Print syntax highlighted content separately if it exists
|
|
222
318
|
if syntax_content:
|
|
223
|
-
|
|
319
|
+
content_fallback = f"[bold]Content:[/bold]\n{result.content}"
|
|
320
|
+
self._safe_console_print(
|
|
321
|
+
console,
|
|
322
|
+
syntax_content,
|
|
323
|
+
fallback_content=content_fallback,
|
|
324
|
+
error_prefix="Syntax highlighting"
|
|
325
|
+
)
|
|
224
326
|
|
|
225
327
|
elif isinstance(event, PlanModeRespondEvent):
|
|
226
|
-
|
|
227
|
-
|
|
328
|
+
self._safe_console_print(
|
|
329
|
+
console,
|
|
330
|
+
Panel(Markdown(event.completion.response), title="🏁 Task Completion", border_style="green", title_align="left"),
|
|
331
|
+
fallback_content=event.completion.response,
|
|
332
|
+
error_prefix="Plan mode response"
|
|
333
|
+
)
|
|
228
334
|
|
|
229
335
|
elif isinstance(event, CompletionEvent):
|
|
230
336
|
# 在这里完成实际合并
|
|
@@ -234,8 +340,13 @@ class TerminalRunner(BaseRunner):
|
|
|
234
340
|
logger.exception(
|
|
235
341
|
f"Error merging shadow changes to project: {e}")
|
|
236
342
|
|
|
237
|
-
|
|
238
|
-
|
|
343
|
+
self._safe_console_print(
|
|
344
|
+
console,
|
|
345
|
+
Panel(Markdown(event.completion.result), title="🏁 Task Completion", border_style="green", title_align="left"),
|
|
346
|
+
fallback_content=event.completion.result,
|
|
347
|
+
error_prefix="Task completion"
|
|
348
|
+
)
|
|
349
|
+
self.attempt_result = event.completion.result
|
|
239
350
|
if event.completion.command:
|
|
240
351
|
console.print(
|
|
241
352
|
f"[dim]Suggested command:[/dim] [bold cyan]{event.completion.command}[/]")
|
|
@@ -257,7 +368,7 @@ class TerminalRunner(BaseRunner):
|
|
|
257
368
|
speed=0.0,
|
|
258
369
|
model_names=accumulated_token_usage["model_name"],
|
|
259
370
|
sampling_count=1
|
|
260
|
-
)
|
|
371
|
+
)
|
|
261
372
|
|
|
262
373
|
except Exception as e:
|
|
263
374
|
# 在处理异常时也打印累计的token使用情况
|
|
@@ -281,3 +392,5 @@ class TerminalRunner(BaseRunner):
|
|
|
281
392
|
raise e
|
|
282
393
|
finally:
|
|
283
394
|
console.rule("[bold cyan]Agentic Edit Finished[/]")
|
|
395
|
+
|
|
396
|
+
return self.attempt_result
|