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
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session interactive tool resolver for interacting with active sessions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from loguru import logger
|
|
7
|
+
|
|
8
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
9
|
+
from autocoder.common.v2.agent.agentic_edit_types import SessionInteractiveTool, ToolResult
|
|
10
|
+
from autocoder.common.shell_commands import get_session_manager
|
|
11
|
+
from autocoder.common import AutoCoderArgs
|
|
12
|
+
|
|
13
|
+
import typing
|
|
14
|
+
if typing.TYPE_CHECKING:
|
|
15
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SessionInteractiveToolResolver(BaseToolResolver):
|
|
19
|
+
"""Resolver for interacting with active command sessions."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: SessionInteractiveTool, args: AutoCoderArgs):
|
|
22
|
+
super().__init__(agent, tool, args)
|
|
23
|
+
self.tool: SessionInteractiveTool = tool
|
|
24
|
+
self.session_manager = get_session_manager()
|
|
25
|
+
|
|
26
|
+
def resolve(self) -> ToolResult:
|
|
27
|
+
"""
|
|
28
|
+
Send input to a session and read output.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
ToolResult with session output
|
|
32
|
+
"""
|
|
33
|
+
session_id = self.tool.session_id
|
|
34
|
+
input_text = self.tool.input
|
|
35
|
+
read_timeout = self.tool.read_timeout
|
|
36
|
+
max_bytes = self.tool.max_bytes
|
|
37
|
+
expect_prompt = self.tool.expect_prompt
|
|
38
|
+
prompt_regex = self.tool.prompt_regex
|
|
39
|
+
|
|
40
|
+
logger.debug(
|
|
41
|
+
f"Sending input to session {session_id}: {input_text[:50]}...")
|
|
42
|
+
|
|
43
|
+
# Send input to session
|
|
44
|
+
result = self.session_manager.send_input(
|
|
45
|
+
session_id=session_id,
|
|
46
|
+
input_text=input_text,
|
|
47
|
+
read_timeout=read_timeout,
|
|
48
|
+
max_bytes=max_bytes,
|
|
49
|
+
expect_prompt=expect_prompt,
|
|
50
|
+
prompt_regex=prompt_regex
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if result.success:
|
|
54
|
+
# Handle both dict and string content
|
|
55
|
+
output = ''
|
|
56
|
+
raw_output = ''
|
|
57
|
+
cleaned_length = 0
|
|
58
|
+
|
|
59
|
+
if isinstance(result.content, dict):
|
|
60
|
+
output = result.content.get('output', '')
|
|
61
|
+
raw_output = result.content.get('raw_output', '')
|
|
62
|
+
cleaned_length = result.content.get('cleaned_length', 0)
|
|
63
|
+
elif isinstance(result.content, str):
|
|
64
|
+
output = result.content
|
|
65
|
+
raw_output = result.content
|
|
66
|
+
cleaned_length = len(result.content)
|
|
67
|
+
|
|
68
|
+
logger.debug(
|
|
69
|
+
f"Session {session_id} output: {len(output)} characters")
|
|
70
|
+
|
|
71
|
+
# Format content as readable text
|
|
72
|
+
if output.strip():
|
|
73
|
+
lines = output.strip().split('\n')
|
|
74
|
+
line_count = len(lines)
|
|
75
|
+
|
|
76
|
+
# Create formatted text output
|
|
77
|
+
formatted_content = f"""Session ID: {session_id}
|
|
78
|
+
Input: {input_text}
|
|
79
|
+
Output ({line_count} lines):
|
|
80
|
+
{'-' * 50}
|
|
81
|
+
{output}
|
|
82
|
+
{'-' * 50}
|
|
83
|
+
Status: Success - Received {line_count} lines of output"""
|
|
84
|
+
|
|
85
|
+
return ToolResult(
|
|
86
|
+
success=True,
|
|
87
|
+
message=f"Input sent successfully. Received {line_count} lines of output",
|
|
88
|
+
content=formatted_content
|
|
89
|
+
)
|
|
90
|
+
else:
|
|
91
|
+
# No output case
|
|
92
|
+
formatted_content = f"""Session ID: {session_id}
|
|
93
|
+
Input: {input_text}
|
|
94
|
+
Output: (no output)
|
|
95
|
+
Status: Success - No output received"""
|
|
96
|
+
|
|
97
|
+
return ToolResult(
|
|
98
|
+
success=True,
|
|
99
|
+
message="Input sent successfully. No output received.",
|
|
100
|
+
content=formatted_content
|
|
101
|
+
)
|
|
102
|
+
else:
|
|
103
|
+
# Error case - format as text as well
|
|
104
|
+
formatted_content = f"""Session ID: {session_id}
|
|
105
|
+
Input: {input_text}
|
|
106
|
+
Status: Error - {result.message}"""
|
|
107
|
+
|
|
108
|
+
logger.error(
|
|
109
|
+
f"Failed to interact with session {session_id}: {result.message}")
|
|
110
|
+
|
|
111
|
+
return ToolResult(
|
|
112
|
+
success=False,
|
|
113
|
+
message=result.message,
|
|
114
|
+
content=formatted_content
|
|
115
|
+
)
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session start tool resolver for starting interactive command sessions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from typing import Optional
|
|
7
|
+
from loguru import logger
|
|
8
|
+
|
|
9
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
10
|
+
from autocoder.common.v2.agent.agentic_edit_types import SessionStartTool, ToolResult
|
|
11
|
+
from autocoder.common.shell_commands import get_session_manager
|
|
12
|
+
from autocoder.common.v2.agent.agentic_edit_tools.dangerous_command_checker import DangerousCommandChecker
|
|
13
|
+
from autocoder.common import AutoCoderArgs
|
|
14
|
+
|
|
15
|
+
import typing
|
|
16
|
+
if typing.TYPE_CHECKING:
|
|
17
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class SessionStartToolResolver(BaseToolResolver):
|
|
21
|
+
"""Resolver for starting interactive command sessions."""
|
|
22
|
+
|
|
23
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: SessionStartTool, args: AutoCoderArgs):
|
|
24
|
+
super().__init__(agent, tool, args)
|
|
25
|
+
self.tool: SessionStartTool = tool
|
|
26
|
+
self.session_manager = get_session_manager()
|
|
27
|
+
self.danger_checker = DangerousCommandChecker()
|
|
28
|
+
|
|
29
|
+
def resolve(self) -> ToolResult:
|
|
30
|
+
"""
|
|
31
|
+
Start a new interactive session.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
ToolResult with session information
|
|
35
|
+
"""
|
|
36
|
+
command = self.tool.command
|
|
37
|
+
timeout = self.tool.timeout
|
|
38
|
+
cwd = self.tool.cwd or self.args.source_dir
|
|
39
|
+
env = self.tool.env
|
|
40
|
+
|
|
41
|
+
# Security check for dangerous commands
|
|
42
|
+
if self.args.enable_agentic_dangerous_command_check:
|
|
43
|
+
is_safe, danger_reason = self.danger_checker.check_command_safety(
|
|
44
|
+
command, allow_whitelist_bypass=True)
|
|
45
|
+
|
|
46
|
+
if not is_safe:
|
|
47
|
+
recommendations = self.danger_checker.get_safety_recommendations(command)
|
|
48
|
+
error_message = f"检测到危险命令: {danger_reason}"
|
|
49
|
+
if recommendations:
|
|
50
|
+
error_message += f"\n安全建议:\n" + "\n".join(f"- {rec}" for rec in recommendations)
|
|
51
|
+
|
|
52
|
+
logger.warning(f"阻止启动危险交互式命令: {command}, 原因: {danger_reason}")
|
|
53
|
+
return ToolResult(success=False, message=error_message, content=f"""Command: {command}
|
|
54
|
+
Status: Error - Dangerous command detected
|
|
55
|
+
Reason: {danger_reason}
|
|
56
|
+
Safety Recommendations: {recommendations if recommendations else 'None'}""")
|
|
57
|
+
|
|
58
|
+
# Create the session
|
|
59
|
+
logger.info(f"Starting interactive session: {command}")
|
|
60
|
+
|
|
61
|
+
result = self.session_manager.create_session(
|
|
62
|
+
command=command,
|
|
63
|
+
cwd=cwd,
|
|
64
|
+
env=env,
|
|
65
|
+
timeout=timeout,
|
|
66
|
+
use_pexpect=True
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
if result.success:
|
|
70
|
+
# Extract session_id from content - handle both dict and string content
|
|
71
|
+
session_id = 'unknown'
|
|
72
|
+
if isinstance(result.content, dict):
|
|
73
|
+
session_id = result.content.get('session_id', 'unknown')
|
|
74
|
+
elif isinstance(result.content, str):
|
|
75
|
+
# Try to parse session_id from string if possible
|
|
76
|
+
import re
|
|
77
|
+
match = re.search(r'session_id[:\s]+(\w+)', result.content)
|
|
78
|
+
if match:
|
|
79
|
+
session_id = match.group(1)
|
|
80
|
+
|
|
81
|
+
logger.info(f"Interactive session started successfully: {session_id}")
|
|
82
|
+
|
|
83
|
+
# Wait 10 seconds for initial output
|
|
84
|
+
logger.debug(f"Waiting 10 seconds for initial output from session {session_id}")
|
|
85
|
+
time.sleep(10)
|
|
86
|
+
|
|
87
|
+
# Read initial output using progressive method
|
|
88
|
+
initial_output = ""
|
|
89
|
+
try:
|
|
90
|
+
initial_result = self.session_manager.read_output_progressive(
|
|
91
|
+
session_id=session_id,
|
|
92
|
+
read_timeout=5, # Initial timeout of 5 seconds
|
|
93
|
+
max_bytes=4096,
|
|
94
|
+
expect_prompt=False,
|
|
95
|
+
prompt_regex=None
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if initial_result.success and initial_result.content:
|
|
99
|
+
# Handle both dict and string content
|
|
100
|
+
if isinstance(initial_result.content, dict):
|
|
101
|
+
initial_output = initial_result.content.get('output', '')
|
|
102
|
+
read_cycles = initial_result.content.get('read_cycles', 0)
|
|
103
|
+
total_duration = initial_result.content.get('total_duration', 0)
|
|
104
|
+
else:
|
|
105
|
+
initial_output = str(initial_result.content)
|
|
106
|
+
read_cycles = 0
|
|
107
|
+
total_duration = 0
|
|
108
|
+
|
|
109
|
+
logger.debug(f"Progressive read completed: {len(initial_output)} characters, "
|
|
110
|
+
f"{read_cycles} cycles, {total_duration:.1f}s total")
|
|
111
|
+
else:
|
|
112
|
+
logger.debug("No initial output available")
|
|
113
|
+
|
|
114
|
+
except Exception as e:
|
|
115
|
+
logger.warning(f"Failed to read initial output: {e}")
|
|
116
|
+
initial_output = f"Error reading initial output: {e}"
|
|
117
|
+
|
|
118
|
+
# Format as readable text
|
|
119
|
+
if initial_output.strip():
|
|
120
|
+
lines = initial_output.strip().split('\n')
|
|
121
|
+
line_count = len(lines)
|
|
122
|
+
|
|
123
|
+
# Extract potential prompt pattern from the last line
|
|
124
|
+
last_line = lines[-1] if lines else ""
|
|
125
|
+
prompt_hint = ""
|
|
126
|
+
if last_line.strip():
|
|
127
|
+
# Pre-calculate values for the hint
|
|
128
|
+
clean_last_line = last_line.strip()
|
|
129
|
+
escaped_prompt = clean_last_line.replace('$', '\\$').replace('>', '\\>').replace('?', '\\?')
|
|
130
|
+
|
|
131
|
+
# Build multi-line prompt hint
|
|
132
|
+
prompt_hint = (
|
|
133
|
+
f"\n\n📌 IMPORTANT: The last line appears to be a prompt: '{clean_last_line}'\n"
|
|
134
|
+
f" When using session_interactive tool later, consider setting:\n"
|
|
135
|
+
f" - expect_prompt: true\n"
|
|
136
|
+
f" - prompt_regex: '{escaped_prompt} ?$'\n"
|
|
137
|
+
f" \n"
|
|
138
|
+
f" 💡 TIP: For better output capture, consider using read_output_progressive method\n"
|
|
139
|
+
f" which intelligently waits for all content to be available."
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
formatted_content = f"""Session ID: {session_id}
|
|
143
|
+
Command: {command}
|
|
144
|
+
Working Directory: {cwd}
|
|
145
|
+
Environment: {env if env else 'Default'}
|
|
146
|
+
Initial Output ({line_count} lines):
|
|
147
|
+
{'-' * 50}
|
|
148
|
+
{initial_output}
|
|
149
|
+
{'-' * 50}
|
|
150
|
+
Status: Success - Session started and initial output captured{prompt_hint}"""
|
|
151
|
+
|
|
152
|
+
return ToolResult(
|
|
153
|
+
success=True,
|
|
154
|
+
message=f"Interactive session started successfully. Initial output: {line_count} lines",
|
|
155
|
+
content=formatted_content
|
|
156
|
+
)
|
|
157
|
+
else:
|
|
158
|
+
formatted_content = f"""Session ID: {session_id}
|
|
159
|
+
Command: {command}
|
|
160
|
+
Working Directory: {cwd}
|
|
161
|
+
Environment: {env if env else 'Default'}
|
|
162
|
+
Initial Output: (no output after 10 seconds)
|
|
163
|
+
Status: Success - Session started but no initial output
|
|
164
|
+
|
|
165
|
+
📌 IMPORTANT: No initial output detected. When using session_interactive tool later:
|
|
166
|
+
- Try sending a simple command first to see the prompt
|
|
167
|
+
- Then set expect_prompt and prompt_regex accordingly
|
|
168
|
+
|
|
169
|
+
💡 TIP: Use read_output_progressive method for better output capture
|
|
170
|
+
which intelligently waits for all content and handles timing automatically."""
|
|
171
|
+
|
|
172
|
+
return ToolResult(
|
|
173
|
+
success=True,
|
|
174
|
+
message="Interactive session started successfully. No initial output.",
|
|
175
|
+
content=formatted_content
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
else:
|
|
179
|
+
logger.error(f"Failed to start interactive session: {result.message}")
|
|
180
|
+
# Format error as readable text
|
|
181
|
+
formatted_content = f"""Command: {command}
|
|
182
|
+
Working Directory: {cwd}
|
|
183
|
+
Environment: {env if env else 'Default'}
|
|
184
|
+
Status: Error - {result.message}"""
|
|
185
|
+
|
|
186
|
+
return ToolResult(
|
|
187
|
+
success=False,
|
|
188
|
+
message=result.message,
|
|
189
|
+
content=formatted_content
|
|
190
|
+
)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session stop tool resolver for stopping interactive command sessions.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from loguru import logger
|
|
7
|
+
|
|
8
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
9
|
+
from autocoder.common.v2.agent.agentic_edit_types import SessionStopTool, ToolResult
|
|
10
|
+
from autocoder.common.shell_commands import get_session_manager
|
|
11
|
+
from autocoder.common import AutoCoderArgs
|
|
12
|
+
|
|
13
|
+
import typing
|
|
14
|
+
if typing.TYPE_CHECKING:
|
|
15
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SessionStopToolResolver(BaseToolResolver):
|
|
19
|
+
"""Resolver for stopping interactive command sessions."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: SessionStopTool, args: AutoCoderArgs):
|
|
22
|
+
super().__init__(agent, tool, args)
|
|
23
|
+
self.tool: SessionStopTool = tool
|
|
24
|
+
self.session_manager = get_session_manager()
|
|
25
|
+
|
|
26
|
+
def resolve(self) -> ToolResult:
|
|
27
|
+
"""
|
|
28
|
+
Stop an interactive session.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
ToolResult indicating success with formatted text output
|
|
32
|
+
"""
|
|
33
|
+
session_id = self.tool.session_id
|
|
34
|
+
force = self.tool.force or False
|
|
35
|
+
|
|
36
|
+
logger.info(f"Stopping interactive session {session_id} (force={force})")
|
|
37
|
+
|
|
38
|
+
# Terminate the session
|
|
39
|
+
result = self.session_manager.terminate_session(
|
|
40
|
+
session_id=session_id,
|
|
41
|
+
force=force
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Format the result as readable text and return new ToolResult
|
|
45
|
+
if result.success:
|
|
46
|
+
logger.info(f"Interactive session {session_id} stopped successfully")
|
|
47
|
+
|
|
48
|
+
# Create formatted text output
|
|
49
|
+
force_text = "Force termination" if force else "Graceful termination"
|
|
50
|
+
content = f"""Session ID: {session_id}
|
|
51
|
+
Termination Method: {force_text}
|
|
52
|
+
Status: Successfully stopped
|
|
53
|
+
|
|
54
|
+
✅ Session successfully terminated and cleaned up"""
|
|
55
|
+
|
|
56
|
+
return ToolResult(
|
|
57
|
+
success=True,
|
|
58
|
+
message=f"Interactive session {session_id} stopped successfully",
|
|
59
|
+
content=content
|
|
60
|
+
)
|
|
61
|
+
else:
|
|
62
|
+
logger.error(f"Failed to stop interactive session {session_id}: {result.message}")
|
|
63
|
+
|
|
64
|
+
# Create formatted error text
|
|
65
|
+
force_text = "Force termination" if force else "Graceful termination"
|
|
66
|
+
content = f"""Session ID: {session_id}
|
|
67
|
+
Termination Method: {force_text}
|
|
68
|
+
Status: Failed to stop
|
|
69
|
+
|
|
70
|
+
❌ Error Message: {result.message}"""
|
|
71
|
+
|
|
72
|
+
return ToolResult(
|
|
73
|
+
success=False,
|
|
74
|
+
message=result.message,
|
|
75
|
+
content=content
|
|
76
|
+
)
|