auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +1029 -2310
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +1021 -372
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +26 -9
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/file_monitor/test_file_monitor.py +307 -0
- autocoder/common/git_utils.py +51 -10
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
- autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
- autocoder/common/pruner/test_context_pruner.py +546 -0
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/__init__.py +15 -0
- autocoder/common/tokens/counter.py +44 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2729 -2052
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +386 -10
- autocoder/common/v2/agent/runner/__init__.py +31 -0
- autocoder/common/v2/agent/runner/base_runner.py +92 -0
- autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
- autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
- autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
- autocoder/common/v2/agent/runner/tool_display.py +589 -0
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +323 -334
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +156 -37
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/run_context.py +9 -0
- autocoder/sdk/__init__.py +50 -161
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +158 -170
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -267
- autocoder/sdk/core/bridge.py +298 -118
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-0.1.400.dist-info/METADATA +0 -396
- auto_coder-0.1.400.dist-info/RECORD +0 -425
- auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Dict, Any, Optional
|
|
2
|
+
from typing import Dict, Any, Optional, List, Tuple
|
|
3
3
|
from autocoder.common import AutoCoderArgs,SourceCode
|
|
4
|
+
from autocoder.common.autocoderargs_parser import AutoCoderArgsParser
|
|
4
5
|
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
5
6
|
from autocoder.common.v2.agent.agentic_edit_types import ReadFileTool, ToolResult
|
|
6
|
-
from autocoder.common.context_pruner import PruneContext
|
|
7
|
+
from autocoder.common.pruner.context_pruner import PruneContext
|
|
7
8
|
from autocoder.common import SourceCode
|
|
8
|
-
from autocoder.
|
|
9
|
+
from autocoder.common.tokens import count_string_tokens as count_tokens
|
|
9
10
|
from loguru import logger
|
|
10
11
|
import typing
|
|
12
|
+
import json
|
|
11
13
|
from autocoder.rag.loaders import (
|
|
12
14
|
extract_text_from_pdf,
|
|
13
15
|
extract_text_from_docx,
|
|
14
16
|
extract_text_from_ppt
|
|
15
17
|
)
|
|
18
|
+
from autocoder.common.llms.manager import LLMManager
|
|
19
|
+
from autocoder.common.wrap_llm_hint.utils import add_hint_to_text
|
|
16
20
|
|
|
17
21
|
if typing.TYPE_CHECKING:
|
|
18
22
|
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
@@ -22,13 +26,131 @@ class ReadFileToolResolver(BaseToolResolver):
|
|
|
22
26
|
def __init__(self, agent: Optional['AgenticEdit'], tool: ReadFileTool, args: AutoCoderArgs):
|
|
23
27
|
super().__init__(agent, tool, args)
|
|
24
28
|
self.tool: ReadFileTool = tool # For type hinting
|
|
25
|
-
|
|
29
|
+
|
|
30
|
+
# Initialize AutoCoderArgs parser for flexible parameter parsing
|
|
31
|
+
self.args_parser = AutoCoderArgsParser()
|
|
32
|
+
|
|
33
|
+
# 解析 context_prune_safe_zone_tokens 参数
|
|
34
|
+
parsed_safe_zone_tokens = self._get_parsed_safe_zone_tokens()
|
|
35
|
+
|
|
26
36
|
self.context_pruner = PruneContext(
|
|
27
|
-
max_tokens=
|
|
37
|
+
max_tokens=parsed_safe_zone_tokens,
|
|
28
38
|
args=self.args,
|
|
29
39
|
llm=self.agent.context_prune_llm
|
|
40
|
+
) if self.agent and self.agent.context_prune_llm else None
|
|
41
|
+
|
|
42
|
+
# LLM manager for model context window queries
|
|
43
|
+
self.llm_manager = LLMManager()
|
|
44
|
+
|
|
45
|
+
def _get_parsed_safe_zone_tokens(self) -> int:
|
|
46
|
+
"""
|
|
47
|
+
解析 context_prune_safe_zone_tokens 参数,支持多种格式
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
解析后的 token 数量
|
|
51
|
+
"""
|
|
52
|
+
return self.args_parser.parse_context_prune_safe_zone_tokens(
|
|
53
|
+
self.args.context_prune_safe_zone_tokens,
|
|
54
|
+
self.args.code_model
|
|
30
55
|
)
|
|
31
56
|
|
|
57
|
+
def _extract_lines_by_range(self, content: str, start_line: Optional[int], end_line: Optional[int]) -> str:
|
|
58
|
+
"""根据行号范围提取文件内容
|
|
59
|
+
|
|
60
|
+
参数说明:
|
|
61
|
+
- start_line: 起始行号。正数表示从第N行开始(1-based),负数表示从倒数第N行开始
|
|
62
|
+
- end_line: 结束行号。正数表示到第N行结束(1-based),-1表示到文件末尾
|
|
63
|
+
"""
|
|
64
|
+
if start_line is None and end_line is None:
|
|
65
|
+
return content
|
|
66
|
+
|
|
67
|
+
lines = content.split('\n')
|
|
68
|
+
total_lines = len(lines)
|
|
69
|
+
|
|
70
|
+
# 处理行号参数(转换为0-based索引)
|
|
71
|
+
start_idx = 0
|
|
72
|
+
end_idx = total_lines
|
|
73
|
+
|
|
74
|
+
if start_line is not None:
|
|
75
|
+
if start_line < 0:
|
|
76
|
+
# 负数表示从倒数第N行开始
|
|
77
|
+
start_idx = max(0, total_lines + start_line)
|
|
78
|
+
else:
|
|
79
|
+
# 正数表示从第N行开始(1-based)
|
|
80
|
+
start_idx = max(0, start_line - 1)
|
|
81
|
+
|
|
82
|
+
if end_line is not None:
|
|
83
|
+
if end_line == -1:
|
|
84
|
+
# -1 表示到文件末尾
|
|
85
|
+
end_idx = total_lines
|
|
86
|
+
elif end_line < -1:
|
|
87
|
+
# 其他负数表示到倒数第N行结束
|
|
88
|
+
end_idx = max(0, total_lines + end_line + 1)
|
|
89
|
+
else:
|
|
90
|
+
# 正数表示到第N行结束(1-based)
|
|
91
|
+
end_idx = min(total_lines, end_line)
|
|
92
|
+
|
|
93
|
+
# 验证行号范围
|
|
94
|
+
if start_line is not None and start_line > 0 and start_idx >= total_lines:
|
|
95
|
+
return f"Error: start_line {start_line} exceeds total lines {total_lines}"
|
|
96
|
+
|
|
97
|
+
if start_line is not None and start_line < 0 and abs(start_line) > total_lines:
|
|
98
|
+
return f"Error: start_line {start_line} (倒数第{abs(start_line)}行) exceeds total lines {total_lines}"
|
|
99
|
+
|
|
100
|
+
if start_idx >= end_idx and not (end_line == -1 and start_idx == total_lines):
|
|
101
|
+
if start_line is not None and start_line < 0:
|
|
102
|
+
start_desc = f"倒数第{abs(start_line)}行"
|
|
103
|
+
else:
|
|
104
|
+
start_desc = f"第{start_line}行"
|
|
105
|
+
|
|
106
|
+
if end_line == -1:
|
|
107
|
+
end_desc = "文件末尾"
|
|
108
|
+
elif end_line is not None and end_line < -1:
|
|
109
|
+
end_desc = f"倒数第{abs(end_line)}行"
|
|
110
|
+
else:
|
|
111
|
+
end_desc = f"第{end_line}行"
|
|
112
|
+
|
|
113
|
+
return f"Error: start_line ({start_desc}) should be before end_line ({end_desc})"
|
|
114
|
+
|
|
115
|
+
# 提取指定行范围
|
|
116
|
+
extracted_lines = lines[start_idx:end_idx]
|
|
117
|
+
return '\n'.join(extracted_lines)
|
|
118
|
+
|
|
119
|
+
def _extract_content_by_query(self, content: str, query: str, file_path: str) -> str:
|
|
120
|
+
"""根据查询描述提取最相关的内容"""
|
|
121
|
+
if not query or not self.context_pruner:
|
|
122
|
+
return content
|
|
123
|
+
|
|
124
|
+
# 使用 context_pruner 的查询功能提取相关内容
|
|
125
|
+
try:
|
|
126
|
+
# 创建一个包含查询的伪对话
|
|
127
|
+
query_conversation = {
|
|
128
|
+
"role": "user",
|
|
129
|
+
"content": query
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
source_code = SourceCode(
|
|
133
|
+
module_name=file_path,
|
|
134
|
+
source_code=content,
|
|
135
|
+
tokens=count_tokens(content)
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# 使用 context_pruner 根据查询提取相关内容
|
|
139
|
+
pruned_sources = self.context_pruner.handle_overflow(
|
|
140
|
+
file_sources=[source_code],
|
|
141
|
+
conversations=[query_conversation],
|
|
142
|
+
strategy=self.args.context_prune_strategy
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
if pruned_sources:
|
|
146
|
+
return pruned_sources[0].source_code
|
|
147
|
+
else:
|
|
148
|
+
return content
|
|
149
|
+
|
|
150
|
+
except Exception as e:
|
|
151
|
+
logger.warning(f"Error extracting content by query '{query}': {str(e)}")
|
|
152
|
+
return content
|
|
153
|
+
|
|
32
154
|
def _prune_file_content(self, content: str, file_path: str) -> str:
|
|
33
155
|
"""对文件内容进行剪枝处理"""
|
|
34
156
|
if not self.context_pruner:
|
|
@@ -36,7 +158,8 @@ class ReadFileToolResolver(BaseToolResolver):
|
|
|
36
158
|
|
|
37
159
|
# 计算 token 数量
|
|
38
160
|
tokens = count_tokens(content)
|
|
39
|
-
|
|
161
|
+
parsed_safe_zone_tokens = self._get_parsed_safe_zone_tokens()
|
|
162
|
+
if tokens <= parsed_safe_zone_tokens:
|
|
40
163
|
return content
|
|
41
164
|
|
|
42
165
|
# 创建 SourceCode 对象
|
|
@@ -58,6 +181,68 @@ class ReadFileToolResolver(BaseToolResolver):
|
|
|
58
181
|
|
|
59
182
|
return pruned_sources[0].source_code
|
|
60
183
|
|
|
184
|
+
def _get_model_context_window(self) -> int:
|
|
185
|
+
"""获取当前代码模型的上下文窗口大小,默认 128000"""
|
|
186
|
+
try:
|
|
187
|
+
model_name = self.args.code_model or self.args.model
|
|
188
|
+
model = self.llm_manager.get_model(model_name)
|
|
189
|
+
if model and model.context_window:
|
|
190
|
+
return int(model.context_window)
|
|
191
|
+
except Exception as e:
|
|
192
|
+
logger.warning(f"Failed to get model context window: {e}")
|
|
193
|
+
return 128000
|
|
194
|
+
|
|
195
|
+
def _get_pruned_conversations(self) -> List[Dict[str, Any]]:
|
|
196
|
+
"""获取已按 agent 逻辑剪枝后的对话,用于计算 token 开销"""
|
|
197
|
+
try:
|
|
198
|
+
if not self.agent:
|
|
199
|
+
return []
|
|
200
|
+
conversations = self.agent.current_conversations or []
|
|
201
|
+
# 复用 Agentic 对话修剪器,保持与主循环一致
|
|
202
|
+
agentic_pruner = self.agent.agentic_pruner
|
|
203
|
+
if agentic_pruner and conversations:
|
|
204
|
+
from copy import deepcopy
|
|
205
|
+
return agentic_pruner.prune_conversations(deepcopy(conversations))
|
|
206
|
+
return conversations
|
|
207
|
+
except Exception as e:
|
|
208
|
+
logger.warning(f"Failed to get pruned conversations: {e}")
|
|
209
|
+
return []
|
|
210
|
+
|
|
211
|
+
def _prune_file_to_fit_context_window(self, content: str, file_path: str) -> Tuple[bool, str]:
|
|
212
|
+
"""
|
|
213
|
+
如果 对话token + 文件token 可能超出模型上下文窗口,不在此处裁剪文件,
|
|
214
|
+
而是返回带有提示信息的结果,提示大模型应先对会话进行删减后再读取文件。
|
|
215
|
+
"""
|
|
216
|
+
if not self.agent:
|
|
217
|
+
return False, content
|
|
218
|
+
|
|
219
|
+
try:
|
|
220
|
+
model_window = self._get_model_context_window()
|
|
221
|
+
pruned_convs = self._get_pruned_conversations()
|
|
222
|
+
conv_tokens = count_tokens(json.dumps(pruned_convs, ensure_ascii=False))
|
|
223
|
+
file_tokens = count_tokens(content)
|
|
224
|
+
|
|
225
|
+
if conv_tokens + file_tokens <= model_window:
|
|
226
|
+
return False, content
|
|
227
|
+
|
|
228
|
+
# 构造提示信息,指导大模型优先裁剪会话(如使用 conversation_message_ids_write),然后再调用 read_file
|
|
229
|
+
hint = (
|
|
230
|
+
"The combined size of current conversation and requested file likely exceeds the model context window. "
|
|
231
|
+
"Please prune the conversation first (e.g., delete unnecessary tool_result messages using conversation_message_ids_write), "
|
|
232
|
+
"then call read_file again. "
|
|
233
|
+
f"Details: conversation_tokens={conv_tokens}, file_tokens={file_tokens}, window={model_window}, file={file_path}"
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
logger.info(
|
|
237
|
+
f"Conversation + file tokens exceed window ({conv_tokens}+{file_tokens}>{model_window}). Returning hint instead of file content.")
|
|
238
|
+
|
|
239
|
+
# 返回包含提示的包装文本,前置文件前500字符作为上下文
|
|
240
|
+
prefix = content[:500] if content else ""
|
|
241
|
+
return True, add_hint_to_text(prefix, hint)
|
|
242
|
+
except Exception as e:
|
|
243
|
+
logger.warning(f"Failed to calculate context window overflow: {e}")
|
|
244
|
+
return False, content
|
|
245
|
+
|
|
61
246
|
def _read_file_content(self, file_path_to_read: str) -> str:
|
|
62
247
|
content = ""
|
|
63
248
|
ext = os.path.splitext(file_path_to_read)[1].lower()
|
|
@@ -79,48 +264,64 @@ class ReadFileToolResolver(BaseToolResolver):
|
|
|
79
264
|
with open(file_path_to_read, 'r', encoding='utf-8', errors='replace') as f:
|
|
80
265
|
content = f.read()
|
|
81
266
|
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
except Exception as e_shadow:
|
|
96
|
-
logger.warning(f"Failed to read shadow file {shadow_path} with _read_file_content: {str(e_shadow)}. Falling back to original file.")
|
|
97
|
-
|
|
98
|
-
# If shadow file doesn't exist or reading failed, try original file
|
|
99
|
-
if not os.path.exists(abs_file_path):
|
|
100
|
-
return ToolResult(success=False, message=f"Error: File not found at path: {file_path}")
|
|
101
|
-
if not os.path.isfile(abs_file_path):
|
|
102
|
-
return ToolResult(success=False, message=f"Error: Path is not a file: {file_path}")
|
|
103
|
-
|
|
104
|
-
content = self._read_file_content(abs_file_path)
|
|
105
|
-
logger.info(f"Successfully processed file: {file_path}")
|
|
106
|
-
return ToolResult(success=True, message=f"{file_path}", content=content)
|
|
267
|
+
# 处理新参数
|
|
268
|
+
# 1. 先根据行号范围提取内容
|
|
269
|
+
if self.tool.start_line is not None or self.tool.end_line is not None:
|
|
270
|
+
content = self._extract_lines_by_range(content, self.tool.start_line, self.tool.end_line)
|
|
271
|
+
|
|
272
|
+
# 2. 如果有查询,根据查询提取相关内容
|
|
273
|
+
if self.tool.query:
|
|
274
|
+
content = self._extract_content_by_query(content, self.tool.query, file_path_to_read)
|
|
275
|
+
|
|
276
|
+
# 3. 检查当前对话 + 文件是否超出模型窗口,若需要提示会话剪枝则直接返回带提示内容
|
|
277
|
+
should_prune, maybe_hinted_content = self._prune_file_to_fit_context_window(content, file_path_to_read)
|
|
278
|
+
if should_prune:
|
|
279
|
+
return maybe_hinted_content
|
|
107
280
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
logger.exception(e)
|
|
111
|
-
return ToolResult(success=False, message=f"An error occurred while processing the file '{file_path}': {str(e)}")
|
|
281
|
+
# 4. 最后进行常规的剪枝处理(基于 safe_zone_tokens 的兜底)
|
|
282
|
+
return self._prune_file_content(maybe_hinted_content, file_path_to_read)
|
|
112
283
|
|
|
113
|
-
def read_file_normal(self, file_path: str
|
|
284
|
+
def read_file_normal(self, file_path: str) -> ToolResult:
|
|
114
285
|
"""Read file directly without using shadow manager"""
|
|
115
286
|
try:
|
|
116
|
-
if not os.path.exists(
|
|
287
|
+
if not os.path.exists(file_path):
|
|
117
288
|
return ToolResult(success=False, message=f"Error: File not found at path: {file_path}")
|
|
118
|
-
if not os.path.isfile(
|
|
289
|
+
if not os.path.isfile(file_path):
|
|
119
290
|
return ToolResult(success=False, message=f"Error: Path is not a file: {file_path}")
|
|
120
291
|
|
|
121
|
-
content = self._read_file_content(
|
|
122
|
-
|
|
123
|
-
|
|
292
|
+
content = self._read_file_content(file_path)
|
|
293
|
+
|
|
294
|
+
# 构建详细的成功消息
|
|
295
|
+
message_parts = [f"{file_path}"]
|
|
296
|
+
if self.tool.start_line is not None or self.tool.end_line is not None:
|
|
297
|
+
# 构建起始行描述
|
|
298
|
+
if self.tool.start_line is not None:
|
|
299
|
+
if self.tool.start_line < 0:
|
|
300
|
+
start = f"-{abs(self.tool.start_line)}" # 负数行号显示为 -N
|
|
301
|
+
else:
|
|
302
|
+
start = str(self.tool.start_line)
|
|
303
|
+
else:
|
|
304
|
+
start = "1"
|
|
305
|
+
|
|
306
|
+
# 构建结束行描述
|
|
307
|
+
if self.tool.end_line == -1:
|
|
308
|
+
end = "end"
|
|
309
|
+
elif self.tool.end_line is not None:
|
|
310
|
+
if self.tool.end_line < -1:
|
|
311
|
+
end = str(self.tool.end_line) # 其他负数行号直接显示
|
|
312
|
+
else:
|
|
313
|
+
end = str(self.tool.end_line)
|
|
314
|
+
else:
|
|
315
|
+
end = "end"
|
|
316
|
+
|
|
317
|
+
message_parts.append(f"lines {start}-{end}")
|
|
318
|
+
if self.tool.query:
|
|
319
|
+
message_parts.append(f"filtered by query: '{self.tool.query}'")
|
|
320
|
+
|
|
321
|
+
message = " ".join(message_parts)
|
|
322
|
+
|
|
323
|
+
logger.info(f"Successfully processed file: {message}")
|
|
324
|
+
return ToolResult(success=True, message=message, content=content)
|
|
124
325
|
|
|
125
326
|
except Exception as e:
|
|
126
327
|
logger.warning(f"Error processing file '{file_path}': {str(e)}")
|
|
@@ -129,13 +330,5 @@ class ReadFileToolResolver(BaseToolResolver):
|
|
|
129
330
|
|
|
130
331
|
def resolve(self) -> ToolResult:
|
|
131
332
|
"""Resolve the read file tool by calling the appropriate implementation"""
|
|
132
|
-
file_path = self.tool.path
|
|
133
|
-
|
|
134
|
-
abs_project_dir = os.path.abspath(source_dir)
|
|
135
|
-
abs_file_path = os.path.abspath(os.path.join(source_dir, file_path))
|
|
136
|
-
|
|
137
|
-
# Choose the appropriate implementation based on whether shadow_manager is available
|
|
138
|
-
if self.shadow_manager:
|
|
139
|
-
return self.read_file_with_shadow(file_path, source_dir, abs_project_dir, abs_file_path)
|
|
140
|
-
else:
|
|
141
|
-
return self.read_file_normal(file_path, source_dir, abs_project_dir, abs_file_path)
|
|
333
|
+
file_path = self.tool.path
|
|
334
|
+
return self.read_file_normal(file_path)
|