auto-coder 1.0.0__py3-none-any.whl → 2.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.1.dist-info/LICENSE +158 -0
- auto_coder-2.0.1.dist-info/METADATA +558 -0
- auto_coder-2.0.1.dist-info/RECORD +795 -0
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +77 -73
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +962 -2345
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +409 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/git_utils.py +44 -8
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +316 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/counter.py +24 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1094 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +400 -129
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +923 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +65 -46
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/sdk/__init__.py +46 -190
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +665 -0
- autocoder/workflow_agents/loader.py +749 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +173 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Auto Coder Terminal - 新的终端入口
|
|
3
|
+
|
|
4
|
+
这是重构后的终端交互入口,代码结构更清晰,职责更分明。
|
|
5
|
+
原有的 chat_auto_coder.py 保持不变以保证向后兼容。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from loguru import logger
|
|
9
|
+
|
|
10
|
+
logger.remove() # 把默认 sink 去掉,彻底静音
|
|
11
|
+
|
|
12
|
+
from autocoder.run_context import get_run_context, RunMode
|
|
13
|
+
|
|
14
|
+
# 设置运行模式为终端模式
|
|
15
|
+
get_run_context().set_mode(RunMode.TERMINAL)
|
|
16
|
+
|
|
17
|
+
from autocoder.terminal.bootstrap import run_cli
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def main():
|
|
21
|
+
"""主入口函数"""
|
|
22
|
+
run_cli()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
main()
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Auto Coder Chat V3 - 入口文件
|
|
3
|
+
|
|
4
|
+
这是重构后的终端交互入口,使用模块化的设计。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from loguru import logger
|
|
8
|
+
|
|
9
|
+
logger.remove() # 把默认 sink 去掉,彻底静音
|
|
10
|
+
|
|
11
|
+
from autocoder.run_context import get_run_context, RunMode
|
|
12
|
+
|
|
13
|
+
# 设置运行模式为终端模式
|
|
14
|
+
get_run_context().set_mode(RunMode.TERMINAL)
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
import argparse
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from autocoder.auto_coder_runner import (
|
|
20
|
+
load_tokenizer,
|
|
21
|
+
initialize_system,
|
|
22
|
+
InitializeSystemRequest,
|
|
23
|
+
configure,
|
|
24
|
+
start as start_engine,
|
|
25
|
+
completer,
|
|
26
|
+
ask,
|
|
27
|
+
coding,
|
|
28
|
+
chat,
|
|
29
|
+
design,
|
|
30
|
+
voice_input,
|
|
31
|
+
auto_command,
|
|
32
|
+
run_agentic,
|
|
33
|
+
execute_shell_command,
|
|
34
|
+
active_context,
|
|
35
|
+
get_mcp_server,
|
|
36
|
+
stop as stop_engine,
|
|
37
|
+
)
|
|
38
|
+
from autocoder.chat_auto_coder_lang import (
|
|
39
|
+
get_message,
|
|
40
|
+
get_message_with_format as get_message_with_format_local,
|
|
41
|
+
)
|
|
42
|
+
from autocoder.plugins import PluginManager
|
|
43
|
+
from autocoder.terminal_v3 import AutoCoderChatApp
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def parse_arguments():
|
|
47
|
+
parser = argparse.ArgumentParser(
|
|
48
|
+
description="Auto-Coder V3 - Claude-style Chat Interface"
|
|
49
|
+
)
|
|
50
|
+
parser.add_argument("--debug", action="store_true", help="Enable debug mode")
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"--quick",
|
|
53
|
+
action="store_true",
|
|
54
|
+
help="Enter the auto-coder.chat without initializing the system",
|
|
55
|
+
)
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
"--skip_provider_selection",
|
|
58
|
+
action="store_true",
|
|
59
|
+
help="Skip the provider selection",
|
|
60
|
+
)
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"--product_mode",
|
|
63
|
+
type=str,
|
|
64
|
+
default="lite",
|
|
65
|
+
help="The mode of the auto-coder.chat, lite/pro default is lite",
|
|
66
|
+
)
|
|
67
|
+
parser.add_argument("--lite", action="store_true", help="Lite mode")
|
|
68
|
+
parser.add_argument("--pro", action="store_true", help="Pro mode")
|
|
69
|
+
return parser.parse_args()
|
|
70
|
+
|
|
71
|
+
def load_builtin_plugins(plugin_manager):
|
|
72
|
+
"""加载内置插件"""
|
|
73
|
+
try:
|
|
74
|
+
# 发现所有可用的插件
|
|
75
|
+
discovered_plugins = plugin_manager.discover_plugins()
|
|
76
|
+
|
|
77
|
+
# 排除的示例插件列表
|
|
78
|
+
excluded_plugins = {
|
|
79
|
+
"autocoder.plugins.dynamic_completion_example",
|
|
80
|
+
"autocoder.plugins.sample_plugin",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# 自动加载内置插件(在autocoder.plugins模块中的插件)
|
|
84
|
+
builtin_loaded = 0
|
|
85
|
+
for plugin_class in discovered_plugins:
|
|
86
|
+
module_name = plugin_class.__module__
|
|
87
|
+
if (
|
|
88
|
+
module_name.startswith("autocoder.plugins.")
|
|
89
|
+
and not module_name.endswith(".__init__")
|
|
90
|
+
and module_name not in excluded_plugins
|
|
91
|
+
):
|
|
92
|
+
try:
|
|
93
|
+
if plugin_manager.load_plugin(plugin_class):
|
|
94
|
+
builtin_loaded += 1
|
|
95
|
+
print(f"✓ Loaded builtin plugin: {plugin_class.plugin_name()}")
|
|
96
|
+
except Exception as e:
|
|
97
|
+
print(
|
|
98
|
+
f"✗ Failed to load builtin plugin {plugin_class.plugin_name()}: {e}"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if builtin_loaded > 0:
|
|
102
|
+
print(
|
|
103
|
+
get_message_with_format_local(
|
|
104
|
+
"loaded_plugins_builtin", count=builtin_loaded
|
|
105
|
+
)
|
|
106
|
+
)
|
|
107
|
+
else:
|
|
108
|
+
print(get_message("no_builtin_plugins_loaded"))
|
|
109
|
+
|
|
110
|
+
except Exception as e:
|
|
111
|
+
print(f"Error loading builtin plugins: {e}")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def async_main():
|
|
115
|
+
"""异步主函数"""
|
|
116
|
+
load_tokenizer()
|
|
117
|
+
args = parse_arguments()
|
|
118
|
+
|
|
119
|
+
if args.lite:
|
|
120
|
+
args.product_mode = "lite"
|
|
121
|
+
|
|
122
|
+
if args.pro:
|
|
123
|
+
args.product_mode = "pro"
|
|
124
|
+
|
|
125
|
+
if not args.quick:
|
|
126
|
+
initialize_system(
|
|
127
|
+
InitializeSystemRequest(
|
|
128
|
+
product_mode=args.product_mode,
|
|
129
|
+
skip_provider_selection=args.skip_provider_selection,
|
|
130
|
+
debug=args.debug,
|
|
131
|
+
quick=args.quick,
|
|
132
|
+
lite=args.lite,
|
|
133
|
+
pro=args.pro,
|
|
134
|
+
)
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# 启动引擎
|
|
140
|
+
start_engine()
|
|
141
|
+
|
|
142
|
+
# 初始化插件系统
|
|
143
|
+
plugin_manager = PluginManager()
|
|
144
|
+
plugin_manager.load_global_plugin_dirs()
|
|
145
|
+
|
|
146
|
+
# 添加内置插件目录
|
|
147
|
+
plugins_dir = Path(__file__).parent.parent / "plugins"
|
|
148
|
+
plugin_manager.add_global_plugin_directory(str(plugins_dir))
|
|
149
|
+
|
|
150
|
+
# 加载保存的运行时配置
|
|
151
|
+
plugin_manager.load_runtime_cfg()
|
|
152
|
+
|
|
153
|
+
# 自动加载内置插件
|
|
154
|
+
load_builtin_plugins(plugin_manager)
|
|
155
|
+
|
|
156
|
+
# 配置 product_mode
|
|
157
|
+
configure(f"product_mode:{args.product_mode}")
|
|
158
|
+
|
|
159
|
+
# 创建原始函数字典
|
|
160
|
+
original_functions = {
|
|
161
|
+
"ask": ask,
|
|
162
|
+
"coding": coding,
|
|
163
|
+
"chat": chat,
|
|
164
|
+
"design": design,
|
|
165
|
+
"voice_input": voice_input,
|
|
166
|
+
"auto_command": auto_command,
|
|
167
|
+
"run_agentic": run_agentic,
|
|
168
|
+
"execute_shell_command": execute_shell_command,
|
|
169
|
+
"active_context": active_context,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# 创建 wrapped functions
|
|
173
|
+
wrapped_functions = {}
|
|
174
|
+
for func_name, original_func in original_functions.items():
|
|
175
|
+
wrapped_functions[func_name] = plugin_manager.wrap_function(
|
|
176
|
+
original_func, func_name
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# 创建并运行聊天式 TUI 应用
|
|
180
|
+
chat_app = AutoCoderChatApp(plugin_manager=plugin_manager)
|
|
181
|
+
await chat_app.run()
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def main():
|
|
185
|
+
"""同步入口函数,供 console_scripts 使用"""
|
|
186
|
+
asyncio.run(async_main())
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
if __name__ == "__main__":
|
|
190
|
+
main()
|
autocoder/chat/conf_command.py
CHANGED
|
@@ -9,14 +9,18 @@ from rich.console import Console
|
|
|
9
9
|
from rich.panel import Panel
|
|
10
10
|
from rich.table import Table
|
|
11
11
|
from rich.text import Text
|
|
12
|
-
from autocoder.auto_coder_runner import save_memory # Import save_memory
|
|
13
12
|
from autocoder.common.conf_validator import ConfigValidator
|
|
14
|
-
from autocoder.common.
|
|
13
|
+
from autocoder.common.international import get_message, get_message_with_format
|
|
14
|
+
from autocoder.common.ac_style_command_parser import create_config, parse_typed_query
|
|
15
|
+
|
|
16
|
+
# Import core_config functions for direct configuration management
|
|
17
|
+
from autocoder.common.core_config import get_memory_manager
|
|
15
18
|
|
|
16
19
|
# Helper function to print the configuration table (internal implementation)
|
|
17
20
|
def _print_conf_table(content: Dict[str, Any], title: str = "Configuration Settings"):
|
|
18
21
|
"""Display configuration dictionary in a Rich table format."""
|
|
19
|
-
|
|
22
|
+
output_buffer = io.StringIO()
|
|
23
|
+
console = Console(file=output_buffer, force_terminal=True, color_system="truecolor") # Capture output
|
|
20
24
|
|
|
21
25
|
# Create a styled table with rounded borders
|
|
22
26
|
table = Table(
|
|
@@ -54,39 +58,40 @@ def _print_conf_table(content: Dict[str, Any], title: str = "Configuration Setti
|
|
|
54
58
|
subtitle=f"[italic]{get_message('conf_subtitle')}[/italic]",
|
|
55
59
|
border_style="blue"
|
|
56
60
|
))
|
|
57
|
-
return
|
|
61
|
+
return output_buffer.getvalue() # Return captured string
|
|
58
62
|
|
|
59
63
|
# --- Command Handlers ---
|
|
60
64
|
|
|
61
|
-
def _handle_list_conf(
|
|
65
|
+
def _handle_list_conf(args: List[str]) -> str:
|
|
62
66
|
"""Handles listing configuration settings, supports wildcard filtering."""
|
|
63
|
-
|
|
67
|
+
memory_manager = get_memory_manager()
|
|
68
|
+
conf = memory_manager.get_all_config()
|
|
64
69
|
pattern = args[0] if args else "*" # Default to all if no pattern
|
|
65
70
|
|
|
66
71
|
if pattern == "*":
|
|
67
72
|
title = get_message("conf_title")
|
|
68
73
|
filtered_conf = conf
|
|
69
74
|
else:
|
|
70
|
-
title =
|
|
75
|
+
title = get_message_with_format("conf_filtered_title", pattern=pattern)
|
|
71
76
|
filtered_conf = {k: v for k, v in conf.items() if fnmatch.fnmatch(k, pattern)}
|
|
72
77
|
if not filtered_conf:
|
|
73
|
-
return
|
|
78
|
+
return get_message_with_format("conf_no_pattern_matches", pattern=pattern)
|
|
74
79
|
|
|
75
80
|
if not filtered_conf and pattern == "*":
|
|
76
|
-
return "
|
|
81
|
+
return get_message("conf_no_configs_found")
|
|
77
82
|
|
|
78
83
|
return _print_conf_table(filtered_conf, title)
|
|
79
84
|
|
|
80
85
|
|
|
81
|
-
def _handle_get_conf(
|
|
86
|
+
def _handle_get_conf(args: List[str]) -> str:
|
|
82
87
|
"""Handles getting a specific configuration setting."""
|
|
83
88
|
if len(args) != 1:
|
|
84
|
-
return "
|
|
89
|
+
return get_message("conf_get_error_args")
|
|
85
90
|
key = args[0]
|
|
86
|
-
|
|
87
|
-
value =
|
|
91
|
+
memory_manager = get_memory_manager()
|
|
92
|
+
value = memory_manager.get_config(key)
|
|
88
93
|
if value is None:
|
|
89
|
-
return
|
|
94
|
+
return get_message_with_format("conf_get_error_not_found", key=key)
|
|
90
95
|
else:
|
|
91
96
|
# Format value for better readability
|
|
92
97
|
if isinstance(value, (list, dict)):
|
|
@@ -122,150 +127,245 @@ def _parse_value(value_str: str) -> Any:
|
|
|
122
127
|
# If none of the above, return as string
|
|
123
128
|
return value_str
|
|
124
129
|
|
|
125
|
-
def _handle_set_conf(
|
|
130
|
+
def _handle_set_conf(args: List[str]) -> str:
|
|
126
131
|
"""Handles setting or updating a configuration setting."""
|
|
127
132
|
if len(args) < 2:
|
|
128
|
-
return "
|
|
133
|
+
return get_message("conf_set_error_args")
|
|
129
134
|
key = args[0]
|
|
130
135
|
# Join the rest of the arguments to form the value string
|
|
131
136
|
value_str = " ".join(args[1:])
|
|
132
137
|
try:
|
|
133
138
|
parsed_value = _parse_value(value_str)
|
|
134
139
|
|
|
135
|
-
#
|
|
136
|
-
|
|
140
|
+
# Get memory manager and validate before setting
|
|
141
|
+
memory_manager = get_memory_manager()
|
|
142
|
+
product_mode = memory_manager.get_config("product_mode", "lite")
|
|
137
143
|
ConfigValidator.validate(key, str(parsed_value), product_mode) # Validate the parsed value as string initially if needed, or adjust validation
|
|
138
144
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
save_memory() # Save after modification
|
|
145
|
+
# Set configuration using MemoryManager
|
|
146
|
+
memory_manager.set_config(key, parsed_value)
|
|
147
|
+
|
|
143
148
|
# Use repr for confirmation message for clarity
|
|
144
|
-
return
|
|
149
|
+
return get_message_with_format("conf_set_success", key=key, value=repr(parsed_value))
|
|
145
150
|
except Exception as e:
|
|
146
|
-
return
|
|
151
|
+
return get_message_with_format("conf_set_error", key=key, error=str(e))
|
|
147
152
|
|
|
148
|
-
def _handle_delete_conf(
|
|
149
|
-
"""Handles deleting
|
|
153
|
+
def _handle_delete_conf(args: List[str]) -> str:
|
|
154
|
+
"""Handles deleting configuration settings. Supports multiple keys separated by commas."""
|
|
150
155
|
if len(args) != 1:
|
|
151
|
-
return "
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
156
|
+
return get_message("conf_delete_error_args")
|
|
157
|
+
|
|
158
|
+
# 支持逗号分隔的多个key
|
|
159
|
+
keys_str = args[0]
|
|
160
|
+
keys = [key.strip() for key in keys_str.split(',') if key.strip()]
|
|
161
|
+
|
|
162
|
+
if not keys:
|
|
163
|
+
return "Error: No valid keys provided for deletion."
|
|
164
|
+
|
|
165
|
+
memory_manager = get_memory_manager()
|
|
166
|
+
results = []
|
|
167
|
+
deleted_keys = []
|
|
168
|
+
not_found_keys = []
|
|
169
|
+
error_keys = []
|
|
170
|
+
|
|
171
|
+
for key in keys:
|
|
172
|
+
if memory_manager.has_config(key):
|
|
173
|
+
try:
|
|
174
|
+
memory_manager.delete_config(key)
|
|
175
|
+
deleted_keys.append(key)
|
|
176
|
+
except Exception as e:
|
|
177
|
+
error_keys.append(f"{key} ({str(e)})")
|
|
178
|
+
else:
|
|
179
|
+
not_found_keys.append(key)
|
|
180
|
+
|
|
181
|
+
# 构建返回消息
|
|
182
|
+
messages = []
|
|
183
|
+
if deleted_keys:
|
|
184
|
+
if len(deleted_keys) == 1:
|
|
185
|
+
messages.append(get_message_with_format("conf_delete_success", key=deleted_keys[0]))
|
|
186
|
+
else:
|
|
187
|
+
messages.append(f"Successfully deleted configurations: {', '.join(deleted_keys)}")
|
|
188
|
+
|
|
189
|
+
if not_found_keys:
|
|
190
|
+
if len(not_found_keys) == 1:
|
|
191
|
+
messages.append(get_message_with_format("conf_delete_not_found", key=not_found_keys[0]))
|
|
192
|
+
else:
|
|
193
|
+
messages.append(f"Configurations not found: {', '.join(not_found_keys)}")
|
|
194
|
+
|
|
195
|
+
if error_keys:
|
|
196
|
+
messages.append(f"Failed to delete: {', '.join(error_keys)}")
|
|
197
|
+
|
|
198
|
+
return '\n'.join(messages)
|
|
163
199
|
|
|
164
200
|
|
|
165
|
-
def _handle_help(
|
|
201
|
+
def _handle_help(args: List[str]) -> str:
|
|
166
202
|
"""Provides help text for the /conf command."""
|
|
167
203
|
if args:
|
|
168
|
-
return
|
|
204
|
+
return get_message("conf_help_args_error")
|
|
169
205
|
|
|
170
|
-
help_text = ""
|
|
171
|
-
|
|
172
|
-
/conf [pattern] - Show configurations. Optional wildcard pattern (e.g., *_model, api*).
|
|
173
|
-
/conf get <key> - Get the value of a specific configuration key.
|
|
174
|
-
/conf set <key>:<value> - Set or update a configuration key.
|
|
175
|
-
Value parsed (bool, int, float, None) or treated as string.
|
|
176
|
-
Use quotes ("value with spaces") for explicit strings.
|
|
177
|
-
/conf /drop <key> - Delete a configuration key.
|
|
178
|
-
/conf /export <path> - Export current configuration to a file.
|
|
179
|
-
/conf /import <path> - Import configuration from a file.
|
|
180
|
-
/conf help - Show this help message.
|
|
181
|
-
"""
|
|
182
|
-
return help_text.strip()
|
|
206
|
+
help_text = get_message("conf_help_text")
|
|
207
|
+
return help_text
|
|
183
208
|
|
|
184
209
|
# Command dispatch table
|
|
185
|
-
COMMAND_HANDLERS: Dict[str, Callable[[
|
|
186
|
-
"
|
|
187
|
-
"
|
|
188
|
-
"
|
|
189
|
-
"
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
"
|
|
193
|
-
"
|
|
194
|
-
"
|
|
210
|
+
COMMAND_HANDLERS: Dict[str, Callable[[List[str]], str]] = {
|
|
211
|
+
"list": _handle_list_conf,
|
|
212
|
+
"show": _handle_list_conf, # Alias
|
|
213
|
+
"get": _handle_get_conf,
|
|
214
|
+
"set": _handle_set_conf,
|
|
215
|
+
"delete": _handle_delete_conf,
|
|
216
|
+
"del": _handle_delete_conf, # Alias
|
|
217
|
+
"rm": _handle_delete_conf, # Alias
|
|
218
|
+
"drop": _handle_delete_conf, # Add this line for /drop command
|
|
219
|
+
"help": _handle_help,
|
|
195
220
|
}
|
|
196
221
|
|
|
197
|
-
def handle_conf_command(command_args: str
|
|
222
|
+
def handle_conf_command(command_args: str) -> str:
|
|
198
223
|
"""
|
|
199
|
-
|
|
224
|
+
处理配置命令,支持两种格式:
|
|
225
|
+
1. 双斜杠格式(/conf /command)
|
|
226
|
+
2. 键值对格式(/conf key:value)
|
|
227
|
+
|
|
228
|
+
支持的命令格式:
|
|
229
|
+
- /conf /list [pattern] - 列出配置(可带过滤模式)
|
|
230
|
+
- /conf /show [pattern] - 列出配置(list的别名)
|
|
231
|
+
- /conf /get <key> - 获取单个配置
|
|
232
|
+
- /conf /set <key> <value> - 设置配置
|
|
233
|
+
- /conf /delete <key> - 删除配置
|
|
234
|
+
- /conf /del <key> - 删除配置(别名)
|
|
235
|
+
- /conf /rm <key> - 删除配置(别名)
|
|
236
|
+
- /conf /drop <key> - 删除配置(别名)
|
|
237
|
+
- /conf /help - 显示帮助
|
|
238
|
+
- /conf /export <path> - 导出配置
|
|
239
|
+
- /conf /import <path> - 导入配置
|
|
240
|
+
- /conf key:value - 设置配置(简化格式)
|
|
200
241
|
|
|
201
242
|
Args:
|
|
202
|
-
command_args:
|
|
203
|
-
Example: "key:value", "get key", "set key value", "*_model", "/export path"
|
|
204
|
-
memory: The current session memory dictionary.
|
|
243
|
+
command_args: 命令参数字符串
|
|
205
244
|
|
|
206
245
|
Returns:
|
|
207
|
-
|
|
246
|
+
str: 返回给用户的响应字符串
|
|
208
247
|
"""
|
|
209
|
-
conf_str = command_args.strip()
|
|
210
|
-
|
|
211
|
-
#
|
|
212
|
-
if conf_str.startswith(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if
|
|
248
|
+
conf_str = command_args.strip()
|
|
249
|
+
|
|
250
|
+
# 检查是否为 key:value 格式
|
|
251
|
+
if ':' in conf_str and not conf_str.startswith('/'):
|
|
252
|
+
# 解析 key:value 格式
|
|
253
|
+
parts = conf_str.split(':', 1) # 只分割第一个冒号
|
|
254
|
+
if len(parts) == 2:
|
|
255
|
+
key = parts[0].strip()
|
|
256
|
+
value = parts[1].strip()
|
|
257
|
+
return _handle_set_conf([key, value])
|
|
258
|
+
else:
|
|
259
|
+
return f"Error: Invalid key:value format. Usage: /conf key:value"
|
|
260
|
+
|
|
261
|
+
# 创建配置解析器
|
|
262
|
+
config = (create_config()
|
|
263
|
+
.collect_remainder("query") # 收集剩余参数
|
|
264
|
+
.command("list")
|
|
265
|
+
.positional("pattern") # 可选的过滤模式
|
|
266
|
+
.max_args(1) # 列出配置
|
|
267
|
+
.command("show") # list的别名
|
|
268
|
+
.positional("pattern")
|
|
269
|
+
.max_args(1)
|
|
270
|
+
.command("get")
|
|
271
|
+
.positional("key", required=True)
|
|
272
|
+
.max_args(1) # 获取单个配置
|
|
273
|
+
.command("set")
|
|
274
|
+
.positional("key", required=True)
|
|
275
|
+
.positional("value", required=True)
|
|
276
|
+
.max_args(2) # 设置配置
|
|
277
|
+
.command("delete")
|
|
278
|
+
.collect_remainder("keys") # 收集所有剩余参数以支持逗号分隔的多个key
|
|
279
|
+
.command("del") # delete的别名
|
|
280
|
+
.collect_remainder("keys")
|
|
281
|
+
.command("rm") # delete的别名
|
|
282
|
+
.collect_remainder("keys")
|
|
283
|
+
.command("drop") # delete的别名
|
|
284
|
+
.collect_remainder("keys")
|
|
285
|
+
.command("help")
|
|
286
|
+
.max_args(0) # 显示帮助
|
|
287
|
+
.command("export")
|
|
288
|
+
.positional("path", required=True)
|
|
289
|
+
.max_args(1) # 导出配置
|
|
290
|
+
.command("import")
|
|
291
|
+
.positional("path", required=True)
|
|
292
|
+
.max_args(1) # 导入配置
|
|
293
|
+
.build()
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
if not conf_str:
|
|
297
|
+
# 默认显示所有配置
|
|
298
|
+
return _handle_list_conf([])
|
|
299
|
+
|
|
300
|
+
# 解析命令
|
|
301
|
+
result = parse_typed_query(conf_str, config)
|
|
302
|
+
|
|
303
|
+
# 检查各种子命令
|
|
304
|
+
if result.has_command("list"):
|
|
305
|
+
list_cmd = result.get_command("list")
|
|
306
|
+
pattern = list_cmd.args[0] if list_cmd.args else "*"
|
|
307
|
+
return _handle_list_conf([pattern] if pattern != "*" else [])
|
|
308
|
+
|
|
309
|
+
if result.has_command("show"):
|
|
310
|
+
show_cmd = result.get_command("show")
|
|
311
|
+
pattern = show_cmd.args[0] if show_cmd.args else "*"
|
|
312
|
+
return _handle_list_conf([pattern] if pattern != "*" else [])
|
|
313
|
+
|
|
314
|
+
if result.has_command("get"):
|
|
315
|
+
get_cmd = result.get_command("get")
|
|
316
|
+
if not get_cmd.args:
|
|
317
|
+
return "Error: 'get' command requires exactly one argument (the key). Usage: /conf /get <key>"
|
|
318
|
+
return _handle_get_conf([get_cmd.args[0]])
|
|
319
|
+
|
|
320
|
+
if result.has_command("set"):
|
|
321
|
+
set_cmd = result.get_command("set")
|
|
322
|
+
if len(set_cmd.args) < 2:
|
|
323
|
+
return "Error: 'set' command requires exactly two arguments (key and value). Usage: /conf /set <key> <value>"
|
|
324
|
+
return _handle_set_conf([set_cmd.args[0], set_cmd.args[1]])
|
|
325
|
+
|
|
326
|
+
if result.has_command("delete") or result.has_command("del") or result.has_command("rm") or result.has_command("drop"):
|
|
327
|
+
# 查找删除命令
|
|
328
|
+
delete_cmd = None
|
|
329
|
+
for cmd_name in ["delete", "del", "rm", "drop"]:
|
|
330
|
+
if result.has_command(cmd_name):
|
|
331
|
+
delete_cmd = result.get_command(cmd_name)
|
|
332
|
+
break
|
|
333
|
+
|
|
334
|
+
if not delete_cmd or not delete_cmd.remainder:
|
|
335
|
+
return "Error: 'delete' command requires at least one key. Usage: /conf /delete <key> or /conf /delete <key1,key2,key3>"
|
|
336
|
+
|
|
337
|
+
# remainder 已经是一个字符串,直接传递给处理函数
|
|
338
|
+
keys_str = delete_cmd.remainder
|
|
339
|
+
return _handle_delete_conf([keys_str])
|
|
340
|
+
|
|
341
|
+
if result.has_command("help"):
|
|
342
|
+
return _handle_help([])
|
|
343
|
+
|
|
344
|
+
if result.has_command("export"):
|
|
345
|
+
export_cmd = result.get_command("export")
|
|
346
|
+
if not export_cmd.args:
|
|
216
347
|
return "Error: Please specify a path for export. Usage: /conf /export <path>"
|
|
348
|
+
|
|
349
|
+
export_path = export_cmd.args[0]
|
|
217
350
|
try:
|
|
351
|
+
from autocoder.common.conf_import_export import export_conf
|
|
218
352
|
export_conf(os.getcwd(), export_path)
|
|
219
|
-
return
|
|
353
|
+
return get_message_with_format("conf_export_success", path=export_path)
|
|
220
354
|
except Exception as e:
|
|
221
|
-
return
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if not
|
|
355
|
+
return get_message_with_format("conf_export_error", error=str(e))
|
|
356
|
+
|
|
357
|
+
if result.has_command("import"):
|
|
358
|
+
import_cmd = result.get_command("import")
|
|
359
|
+
if not import_cmd.args:
|
|
226
360
|
return "Error: Please specify a path for import. Usage: /conf /import <path>"
|
|
361
|
+
|
|
362
|
+
import_path = import_cmd.args[0]
|
|
227
363
|
try:
|
|
364
|
+
from autocoder.common.conf_import_export import import_conf
|
|
228
365
|
import_conf(os.getcwd(), import_path)
|
|
229
|
-
|
|
230
|
-
# load_memory() # Consider if import_conf modifies the passed memory or global state
|
|
231
|
-
return f"Configuration imported successfully from {import_path}. Use '/conf' to see changes."
|
|
366
|
+
return get_message_with_format("conf_import_success", path=import_path)
|
|
232
367
|
except Exception as e:
|
|
233
|
-
return
|
|
234
|
-
|
|
235
|
-
#
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
if not args:
|
|
239
|
-
# Default action: list all configurations
|
|
240
|
-
return _handle_list_conf(memory, [])
|
|
241
|
-
else:
|
|
242
|
-
command = args[0].lower()
|
|
243
|
-
command_args_list = args[1:]
|
|
244
|
-
|
|
245
|
-
# Check if the first argument is a known command or potentially a pattern
|
|
246
|
-
handler = COMMAND_HANDLERS.get(command)
|
|
247
|
-
|
|
248
|
-
if handler:
|
|
249
|
-
# It's a known command (list, get, set, delete, help)
|
|
250
|
-
try:
|
|
251
|
-
return handler(memory, command_args_list)
|
|
252
|
-
except Exception as e:
|
|
253
|
-
return f"An unexpected error occurred while executing '/conf {command}': {e}"
|
|
254
|
-
elif "*" in command or "?" in command:
|
|
255
|
-
# Treat as a list/filter pattern if it contains wildcards and is not a known command
|
|
256
|
-
return _handle_list_conf(memory, [command]) # Pass the pattern as the argument to list
|
|
257
|
-
else:
|
|
258
|
-
# Handle legacy key:value format for setting (optional, can be removed if only set command is preferred)
|
|
259
|
-
if ":" in conf_str and len(args) == 1: # Check if it looks like key:value and is a single "word"
|
|
260
|
-
parts = conf_str.split(":", 1)
|
|
261
|
-
if len(parts) == 2:
|
|
262
|
-
key, value_str = parts[0].strip(), parts[1].strip()
|
|
263
|
-
if key and value_str:
|
|
264
|
-
return _handle_set_conf(memory, [key, value_str])
|
|
265
|
-
else:
|
|
266
|
-
return f"Error: Invalid key:value format in '{conf_str}'. Use '/conf set {key} {value_str}' or '/conf help'."
|
|
267
|
-
else:
|
|
268
|
-
return f"Error: Unknown command or invalid format '{conf_str}'. Type '/conf help' for available commands."
|
|
269
|
-
else:
|
|
270
|
-
# If it's not a known command, not a wildcard, and not key:value format
|
|
271
|
-
return f"Error: Unknown command '/conf {command}'. Type '/conf help' for available commands."
|
|
368
|
+
return get_message_with_format("conf_import_error", error=str(e))
|
|
369
|
+
|
|
370
|
+
# 未知命令
|
|
371
|
+
return f"Error: Unknown command '/conf {conf_str}'. Type '/conf /help' for available commands."
|