auto-coder 0.1.337__tar.gz → 0.1.340__tar.gz
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-0.1.337 → auto_coder-0.1.340}/PKG-INFO +1 -1
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/auto_coder_runner.py +16 -9
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/auto_coder_lang.py +36 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit.py +163 -88
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_conversation.py +74 -8
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +17 -8
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_types.py +5 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_tool_display.py +2 -2
- auto_coder-0.1.340/src/autocoder/version.py +1 -0
- auto_coder-0.1.337/src/autocoder/version.py +0 -1
- {auto_coder-0.1.337 → auto_coder-0.1.340}/LICENSE +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/README.md +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/setup.cfg +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/setup.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/SOURCES.txt +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/auto_coder.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/model_speed_test.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/utils_code_auto_generate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/python_linter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/reactjs_linter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/linters/vue_linter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/long_context_rag.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_planner.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.337 → auto_coder-0.1.340}/tests/test_symbols_utils.py +0 -0
|
@@ -2821,8 +2821,9 @@ def generate_new_yaml(query: str):
|
|
|
2821
2821
|
def auto_command(query: str,extra_args: Dict[str,Any]={}):
|
|
2822
2822
|
"""处理/auto指令"""
|
|
2823
2823
|
args = get_final_config()
|
|
2824
|
-
memory = get_memory()
|
|
2825
|
-
if args.enable_agentic_edit:
|
|
2824
|
+
memory = get_memory()
|
|
2825
|
+
if args.enable_agentic_edit:
|
|
2826
|
+
from autocoder.run_context import get_run_context,RunMode
|
|
2826
2827
|
execute_file,args = generate_new_yaml(query)
|
|
2827
2828
|
args.file = execute_file
|
|
2828
2829
|
current_files = memory.get("current_files",{}).get("files",[])
|
|
@@ -2831,14 +2832,20 @@ def auto_command(query: str,extra_args: Dict[str,Any]={}):
|
|
|
2831
2832
|
with open(file,"r",encoding="utf-8") as f:
|
|
2832
2833
|
sources.append(SourceCode(module_name=file,source_code=f.read()))
|
|
2833
2834
|
|
|
2834
|
-
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
|
|
2838
|
-
|
|
2835
|
+
llm = get_single_llm(args.code_model or args.model,product_mode=args.product_mode)
|
|
2836
|
+
conversation_history = extra_args.get("conversations",[])
|
|
2837
|
+
agent = AgenticEdit(llm=llm,args=args,files=SourceCodeList(sources=sources),
|
|
2838
|
+
conversation_history=conversation_history,
|
|
2839
|
+
memory_config=MemoryConfig(memory=memory,
|
|
2840
|
+
save_memory_func=save_memory), command_config=CommandConfig,
|
|
2841
|
+
conversation_name="current"
|
|
2842
|
+
)
|
|
2843
|
+
if get_run_context() == RunMode.TERMINAL:
|
|
2839
2844
|
agent.run_in_terminal(AgenticEditRequest(user_input=query))
|
|
2840
|
-
|
|
2841
|
-
|
|
2845
|
+
else:
|
|
2846
|
+
agent.run_with_events(AgenticEditRequest(user_input=query))
|
|
2847
|
+
return
|
|
2848
|
+
|
|
2842
2849
|
args = get_final_config()
|
|
2843
2850
|
# 准备请求参数
|
|
2844
2851
|
request = AutoCommandRequest(
|
|
@@ -837,6 +837,42 @@ MESSAGES = {
|
|
|
837
837
|
}
|
|
838
838
|
|
|
839
839
|
|
|
840
|
+
# 新增 ReplaceInFileToolResolver 国际化消息
|
|
841
|
+
MESSAGES.update({
|
|
842
|
+
"replace_in_file.access_denied": {
|
|
843
|
+
"en": "Error: Access denied. Attempted to modify file outside the project directory: {{file_path}}",
|
|
844
|
+
"zh": "错误:拒绝访问。尝试修改项目目录之外的文件:{{file_path}}"
|
|
845
|
+
},
|
|
846
|
+
"replace_in_file.file_not_found": {
|
|
847
|
+
"en": "Error: File not found at path: {{file_path}}",
|
|
848
|
+
"zh": "错误:未找到文件路径:{{file_path}}"
|
|
849
|
+
},
|
|
850
|
+
"replace_in_file.read_error": {
|
|
851
|
+
"en": "An error occurred while reading the file for replacement: {{error}}",
|
|
852
|
+
"zh": "读取待替换文件时发生错误:{{error}}"
|
|
853
|
+
},
|
|
854
|
+
"replace_in_file.no_valid_blocks": {
|
|
855
|
+
"en": "Error: No valid SEARCH/REPLACE blocks found in the provided diff.",
|
|
856
|
+
"zh": "错误:在提供的diff中未找到有效的SEARCH/REPLACE代码块。"
|
|
857
|
+
},
|
|
858
|
+
"replace_in_file.apply_failed": {
|
|
859
|
+
"en": "Failed to apply any changes. Errors:\n{{errors}}",
|
|
860
|
+
"zh": "未能应用任何更改。错误信息:\n{{errors}}"
|
|
861
|
+
},
|
|
862
|
+
"replace_in_file.apply_success": {
|
|
863
|
+
"en": "Successfully applied {{applied}}/{{total}} changes to file: {{file_path}}.",
|
|
864
|
+
"zh": "成功应用了 {{applied}}/{{total}} 个更改到文件:{{file_path}}。"
|
|
865
|
+
},
|
|
866
|
+
"replace_in_file.apply_success_with_warnings": {
|
|
867
|
+
"en": "Successfully applied {{applied}}/{{total}} changes to file: {{file_path}}.\nWarnings:\n{{errors}}",
|
|
868
|
+
"zh": "成功应用了 {{applied}}/{{total}} 个更改到文件:{{file_path}}。\n警告信息:\n{{errors}}"
|
|
869
|
+
},
|
|
870
|
+
"replace_in_file.write_error": {
|
|
871
|
+
"en": "An error occurred while writing the modified file: {{error}}",
|
|
872
|
+
"zh": "写入修改后的文件时发生错误:{{error}}"
|
|
873
|
+
}
|
|
874
|
+
})
|
|
875
|
+
|
|
840
876
|
def get_system_language():
|
|
841
877
|
try:
|
|
842
878
|
return locale.getdefaultlocale()[0][:2]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from autocoder.common.v2.agent.agentic_edit_conversation import AgenticConversation
|
|
1
2
|
from enum import Enum
|
|
2
3
|
from enum import Enum
|
|
3
4
|
import json
|
|
@@ -10,6 +11,7 @@ from autocoder.common.printer import Printer
|
|
|
10
11
|
from rich.console import Console
|
|
11
12
|
from rich.panel import Panel
|
|
12
13
|
from pydantic import SkipValidation
|
|
14
|
+
from byzerllm.utils.types import SingleOutputMeta
|
|
13
15
|
|
|
14
16
|
# Removed ResultManager, stream_out, git_utils, AutoCommandTools, count_tokens, global_cancel, ActionYmlFileManager, get_event_manager, EventContentCreator, get_run_context, AgenticFilterStreamOutType
|
|
15
17
|
from autocoder.common import AutoCoderArgs, git_utils, SourceCodeList, SourceCode
|
|
@@ -64,7 +66,7 @@ from autocoder.common.v2.agent.agentic_edit_types import (AgenticEditRequest, To
|
|
|
64
66
|
TOOL_MODEL_MAP,
|
|
65
67
|
# Event Types
|
|
66
68
|
LLMOutputEvent, LLMThinkingEvent, ToolCallEvent,
|
|
67
|
-
ToolResultEvent, CompletionEvent, ErrorEvent,TokenUsageEvent,
|
|
69
|
+
ToolResultEvent, CompletionEvent, PlanModeRespondEvent, ErrorEvent, TokenUsageEvent,
|
|
68
70
|
# Import specific tool types for display mapping
|
|
69
71
|
ReadFileTool, WriteToFileTool, ReplaceInFileTool, ExecuteCommandTool,
|
|
70
72
|
ListFilesTool, SearchFilesTool, ListCodeDefinitionNamesTool,
|
|
@@ -87,6 +89,7 @@ TOOL_RESOLVER_MAP: Dict[Type[BaseTool], Type[BaseToolResolver]] = {
|
|
|
87
89
|
UseMcpTool: UseMcpToolResolver,
|
|
88
90
|
}
|
|
89
91
|
|
|
92
|
+
|
|
90
93
|
# --- Tool Display Customization is now handled by agentic_tool_display.py ---
|
|
91
94
|
|
|
92
95
|
|
|
@@ -99,6 +102,7 @@ class AgenticEdit:
|
|
|
99
102
|
args: AutoCoderArgs,
|
|
100
103
|
memory_config: MemoryConfig,
|
|
101
104
|
command_config: Optional[CommandConfig] = None,
|
|
105
|
+
conversation_name: str = "current"
|
|
102
106
|
):
|
|
103
107
|
self.llm = llm
|
|
104
108
|
self.args = args
|
|
@@ -113,27 +117,32 @@ class AgenticEdit:
|
|
|
113
117
|
self.project_type_analyzer = ProjectTypeAnalyzer(
|
|
114
118
|
args=args, llm=self.llm)
|
|
115
119
|
|
|
120
|
+
self.conversation_manager = AgenticConversation(
|
|
121
|
+
args, self.conversation_history, conversation_name=conversation_name)
|
|
122
|
+
# 当前不开启历史记录,所以清空
|
|
123
|
+
self.conversation_manager.clear_history()
|
|
124
|
+
|
|
116
125
|
self.shadow_manager = ShadowManager(
|
|
117
126
|
args.source_dir, args.event_file, args.ignore_clean_shadows)
|
|
118
127
|
self.shadow_linter = ShadowLinter(self.shadow_manager, verbose=False)
|
|
119
128
|
self.shadow_compiler = ShadowCompiler(
|
|
120
|
-
self.shadow_manager, verbose=False)
|
|
121
|
-
|
|
129
|
+
self.shadow_manager, verbose=False)
|
|
130
|
+
|
|
122
131
|
self.mcp_server_info = ""
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
try:
|
|
133
|
+
self.mcp_server = get_mcp_server()
|
|
134
|
+
mcp_server_info_response = self.mcp_server.send_request(
|
|
135
|
+
McpServerInfoRequest(
|
|
136
|
+
model=args.inference_model or args.model,
|
|
137
|
+
product_mode=args.product_mode,
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
self.mcp_server_info = mcp_server_info_response.result
|
|
141
|
+
except Exception as e:
|
|
142
|
+
logger.error(f"Error getting MCP server info: {str(e)}")
|
|
134
143
|
|
|
135
144
|
# 变更跟踪信息
|
|
136
|
-
# 格式: { file_path: FileChangeEntry(...) }
|
|
145
|
+
# 格式: { file_path: FileChangeEntry(...) }
|
|
137
146
|
self.file_changes: Dict[str, FileChangeEntry] = {}
|
|
138
147
|
|
|
139
148
|
def record_file_change(self, file_path: str, change_type: str, diff: Optional[str] = None, content: Optional[str] = None):
|
|
@@ -148,7 +157,8 @@ class AgenticEdit:
|
|
|
148
157
|
"""
|
|
149
158
|
entry = self.file_changes.get(file_path)
|
|
150
159
|
if entry is None:
|
|
151
|
-
entry = FileChangeEntry(
|
|
160
|
+
entry = FileChangeEntry(
|
|
161
|
+
type=change_type, diffs=[], content=content)
|
|
152
162
|
self.file_changes[file_path] = entry
|
|
153
163
|
else:
|
|
154
164
|
# 文件已经存在,可能之前是 added,现在又被 modified,或者多次 modified
|
|
@@ -185,8 +195,10 @@ class AgenticEdit:
|
|
|
185
195
|
for fname in files:
|
|
186
196
|
shadow_file_path = os.path.join(root, fname)
|
|
187
197
|
try:
|
|
188
|
-
project_file_path = self.shadow_manager.from_shadow_path(
|
|
189
|
-
|
|
198
|
+
project_file_path = self.shadow_manager.from_shadow_path(
|
|
199
|
+
shadow_file_path)
|
|
200
|
+
rel_path = os.path.relpath(
|
|
201
|
+
project_file_path, self.args.source_dir)
|
|
190
202
|
changed_files.append(rel_path)
|
|
191
203
|
except Exception:
|
|
192
204
|
# 非映射关系,忽略
|
|
@@ -377,7 +389,7 @@ class AgenticEdit:
|
|
|
377
389
|
</options>
|
|
378
390
|
</plan_mode_respond>
|
|
379
391
|
|
|
380
|
-
##
|
|
392
|
+
## mcp_tool
|
|
381
393
|
Description: Request to execute a tool via the Model Context Protocol (MCP) server. Use this when you need to execute a tool that is not natively supported by the agentic edit tools.
|
|
382
394
|
Parameters:
|
|
383
395
|
- server_name: (optional) The name of the MCP server to use. If not provided, the tool will automatically choose the best server based on the query.
|
|
@@ -391,7 +403,7 @@ class AgenticEdit:
|
|
|
391
403
|
Your query here
|
|
392
404
|
</query>
|
|
393
405
|
</use_mcp_tool>
|
|
394
|
-
|
|
406
|
+
|
|
395
407
|
{%if mcp_server_info %}
|
|
396
408
|
### MCP_SERVER_LIST
|
|
397
409
|
{{mcp_server_info}}
|
|
@@ -463,24 +475,13 @@ class AgenticEdit:
|
|
|
463
475
|
</diff>
|
|
464
476
|
</replace_in_file>
|
|
465
477
|
|
|
466
|
-
## Example 4: Another example of using an MCP tool (where the server name is a unique identifier
|
|
478
|
+
## Example 4: Another example of using an MCP tool (where the server name is a unique identifier listed in MCP_SERVER_LIST)
|
|
467
479
|
|
|
468
480
|
<use_mcp_tool>
|
|
469
|
-
<server_name>github
|
|
481
|
+
<server_name>github</server_name>
|
|
470
482
|
<tool_name>create_issue</tool_name>
|
|
471
|
-
<
|
|
472
|
-
|
|
473
|
-
"owner": "octocat",
|
|
474
|
-
"repo": "hello-world",
|
|
475
|
-
"title": "Found a bug",
|
|
476
|
-
"body": "I'm having a problem with this.",
|
|
477
|
-
"labels": ["bug", "help wanted"],
|
|
478
|
-
"assignees": ["octocat"]
|
|
479
|
-
}
|
|
480
|
-
</arguments>
|
|
481
|
-
</use_mcp_tool>`
|
|
482
|
-
: ""
|
|
483
|
-
}
|
|
483
|
+
<query>ower is octocat, repo is hello-world, title is Found a bug, body is I'm having a problem with this. labels is "bug" and "help wanted",assignees is "octocat"</query>
|
|
484
|
+
</use_mcp_tool>
|
|
484
485
|
|
|
485
486
|
# Tool Use Guidelines
|
|
486
487
|
|
|
@@ -660,12 +661,12 @@ class AgenticEdit:
|
|
|
660
661
|
4. Once you've completed the user's task, you must use the attempt_completion tool to present the result of the task to the user. You may also provide a CLI command to showcase the result of your task; this can be particularly useful for web development tasks, where you can run e.g. \`open index.html\` to show the website you've built.
|
|
661
662
|
5. The user may provide feedback, which you can use to make improvements and try again. But DO NOT continue in pointless back and forth conversations, i.e. don't end your responses with questions or offers for further assistance.
|
|
662
663
|
|
|
663
|
-
{
|
|
664
|
+
{% if enable_active_context %}
|
|
664
665
|
**Very Important Notice**
|
|
665
666
|
Each directory has a description file stored separately. For example, the description for the directory `{{ current_project }}/src/abc/bbc` can be found in the file `{{ current_project }}/.auto-coder/active-context/src/abc/bbc/active.md`.
|
|
666
667
|
You can use the tool `read_file` to read these description files, which helps you decide exactly which files need detailed attention. Note that the `active.md` file does not contain information about all files within the directory—it only includes information
|
|
667
668
|
about the files that were recently changed.
|
|
668
|
-
{
|
|
669
|
+
{% endif %}
|
|
669
670
|
"""
|
|
670
671
|
env_info = detect_env()
|
|
671
672
|
shell_type = "bash"
|
|
@@ -735,31 +736,36 @@ class AgenticEdit:
|
|
|
735
736
|
Analyzes the user request, interacts with the LLM, parses responses,
|
|
736
737
|
executes tools, and yields structured events for visualization until completion or error.
|
|
737
738
|
"""
|
|
738
|
-
system_prompt = self._analyze.prompt(request)
|
|
739
|
+
system_prompt = self._analyze.prompt(request)
|
|
740
|
+
# print(system_prompt)
|
|
739
741
|
conversations = [
|
|
740
742
|
{"role": "system", "content": system_prompt},
|
|
741
|
-
|
|
742
|
-
|
|
743
|
+
] + self.conversation_manager.get_history()
|
|
744
|
+
conversations.append({
|
|
745
|
+
"role": "user", "content": request.user_input
|
|
746
|
+
})
|
|
747
|
+
self.conversation_manager.add_user_message(request.user_input)
|
|
743
748
|
logger.debug(
|
|
744
749
|
f"Initial conversation history size: {len(conversations)}")
|
|
745
|
-
|
|
750
|
+
|
|
751
|
+
tool_executed = False
|
|
746
752
|
while True:
|
|
747
753
|
global_cancel.check_and_raise()
|
|
748
754
|
logger.info(
|
|
749
755
|
f"Starting LLM interaction cycle. History size: {len(conversations)}")
|
|
750
|
-
tool_executed = False
|
|
751
|
-
assistant_buffer = ""
|
|
752
756
|
|
|
757
|
+
assistant_buffer = ""
|
|
758
|
+
|
|
753
759
|
llm_response_gen = stream_chat_with_continue(
|
|
754
760
|
llm=self.llm,
|
|
755
761
|
conversations=conversations,
|
|
756
762
|
llm_config={}, # Placeholder for future LLM configs
|
|
757
763
|
args=self.args
|
|
758
764
|
)
|
|
759
|
-
|
|
765
|
+
|
|
760
766
|
meta_holder = byzerllm.MetaHolder()
|
|
761
767
|
parsed_events = self.stream_and_parse_llm_response(
|
|
762
|
-
llm_response_gen,meta_holder)
|
|
768
|
+
llm_response_gen, meta_holder)
|
|
763
769
|
|
|
764
770
|
for event in parsed_events:
|
|
765
771
|
global_cancel.check_and_raise()
|
|
@@ -777,6 +783,8 @@ class AgenticEdit:
|
|
|
777
783
|
"role": "assistant",
|
|
778
784
|
"content": assistant_buffer + tool_xml
|
|
779
785
|
})
|
|
786
|
+
self.conversation_manager.add_assistant_message(
|
|
787
|
+
assistant_buffer + tool_xml)
|
|
780
788
|
assistant_buffer = "" # Reset buffer after tool call
|
|
781
789
|
|
|
782
790
|
yield event # Yield the ToolCallEvent for display
|
|
@@ -790,6 +798,14 @@ class AgenticEdit:
|
|
|
790
798
|
"AgenticEdit analyze loop finished due to AttemptCompletion.")
|
|
791
799
|
return
|
|
792
800
|
|
|
801
|
+
if isinstance(tool_obj, PlanModeRespondTool):
|
|
802
|
+
logger.info(
|
|
803
|
+
"PlanModeRespondTool received. Finalizing session.")
|
|
804
|
+
yield PlanModeRespondEvent(completion=tool_obj, completion_xml=tool_xml)
|
|
805
|
+
logger.info(
|
|
806
|
+
"AgenticEdit analyze loop finished due to PlanModeRespond.")
|
|
807
|
+
return
|
|
808
|
+
|
|
793
809
|
# Resolve the tool
|
|
794
810
|
resolver_cls = TOOL_RESOLVER_MAP.get(type(tool_obj))
|
|
795
811
|
if not resolver_cls:
|
|
@@ -844,6 +860,7 @@ class AgenticEdit:
|
|
|
844
860
|
"role": "user", # Simulating the user providing the tool result
|
|
845
861
|
"content": error_xml
|
|
846
862
|
})
|
|
863
|
+
self.conversation_manager.add_user_message(error_xml)
|
|
847
864
|
logger.debug(
|
|
848
865
|
f"Added tool result to conversations for tool {type(tool_obj).__name__}")
|
|
849
866
|
break # After tool execution and result, break to start a new LLM cycle
|
|
@@ -862,6 +879,8 @@ class AgenticEdit:
|
|
|
862
879
|
if assistant_buffer:
|
|
863
880
|
conversations.append(
|
|
864
881
|
{"role": "assistant", "content": assistant_buffer})
|
|
882
|
+
self.conversation_manager.add_assistant_message(
|
|
883
|
+
assistant_buffer)
|
|
865
884
|
# If the loop ends without AttemptCompletion, it means the LLM finished talking
|
|
866
885
|
# without signaling completion. We might just stop or yield a final message.
|
|
867
886
|
# Let's assume it stops here.
|
|
@@ -870,7 +889,7 @@ class AgenticEdit:
|
|
|
870
889
|
logger.info("AgenticEdit analyze loop finished.")
|
|
871
890
|
|
|
872
891
|
def stream_and_parse_llm_response(
|
|
873
|
-
self, generator: Generator[Tuple[str, Any], None, None],meta_holder: byzerllm.MetaHolder
|
|
892
|
+
self, generator: Generator[Tuple[str, Any], None, None], meta_holder: byzerllm.MetaHolder
|
|
874
893
|
) -> Generator[Union[LLMOutputEvent, LLMThinkingEvent, ToolCallEvent, ErrorEvent], None, None]:
|
|
875
894
|
"""
|
|
876
895
|
Streamingly parses the LLM response generator, distinguishing between
|
|
@@ -920,19 +939,18 @@ class AgenticEdit:
|
|
|
920
939
|
params['requires_approval'] = params['requires_approval'].lower(
|
|
921
940
|
) == 'true'
|
|
922
941
|
# Attempt to handle JSON parsing for arguments in use_mcp_tool
|
|
923
|
-
if tool_tag == 'use_mcp_tool' and '
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
942
|
+
# if tool_tag == 'use_mcp_tool' and 'query' in params:
|
|
943
|
+
# try:
|
|
944
|
+
# params['arguments'] = json.loads(
|
|
945
|
+
# params['arguments'])
|
|
946
|
+
# except json.JSONDecodeError:
|
|
947
|
+
# logger.warning(
|
|
948
|
+
# f"Could not decode JSON arguments for use_mcp_tool: {params['arguments']}")
|
|
949
|
+
# # Keep as string or handle error? Let's keep as string for now.
|
|
950
|
+
# pass
|
|
932
951
|
# Handle recursive for list_files
|
|
933
952
|
if tool_tag == 'list_files' and 'recursive' in params:
|
|
934
|
-
params['recursive'] = params['recursive'].lower() == 'true'
|
|
935
|
-
|
|
953
|
+
params['recursive'] = params['recursive'].lower() == 'true'
|
|
936
954
|
return tool_cls(**params)
|
|
937
955
|
else:
|
|
938
956
|
logger.error(f"Tool class not found for tag: {tool_tag}")
|
|
@@ -970,7 +988,7 @@ class AgenticEdit:
|
|
|
970
988
|
break
|
|
971
989
|
|
|
972
990
|
# 2. Check for </tool_tag> if inside tool block
|
|
973
|
-
elif in_tool_block:
|
|
991
|
+
elif in_tool_block:
|
|
974
992
|
end_tag = f"</{current_tool_tag}>"
|
|
975
993
|
end_tool_pos = buffer.find(end_tag)
|
|
976
994
|
if end_tool_pos != -1:
|
|
@@ -1081,17 +1099,17 @@ class AgenticEdit:
|
|
|
1081
1099
|
Runs the agentic edit process, converting internal events to the
|
|
1082
1100
|
standard event system format and writing them using the event manager.
|
|
1083
1101
|
"""
|
|
1084
|
-
event_manager = get_event_manager(self.args.event_file)
|
|
1102
|
+
event_manager = get_event_manager(self.args.event_file)
|
|
1085
1103
|
|
|
1086
1104
|
try:
|
|
1087
1105
|
event_stream = self.analyze(request)
|
|
1088
1106
|
for agent_event in event_stream:
|
|
1089
1107
|
content = None
|
|
1090
1108
|
metadata = EventMetadata(
|
|
1091
|
-
action_file=self.args.event_file,
|
|
1092
|
-
is_streaming=False,
|
|
1109
|
+
action_file=self.args.event_file,
|
|
1110
|
+
is_streaming=False,
|
|
1093
1111
|
stream_out_type="/agent/edit")
|
|
1094
|
-
|
|
1112
|
+
|
|
1095
1113
|
if isinstance(agent_event, LLMThinkingEvent):
|
|
1096
1114
|
content = EventContentCreator.create_stream_thinking(
|
|
1097
1115
|
content=agent_event.text)
|
|
@@ -1128,23 +1146,62 @@ class AgenticEdit:
|
|
|
1128
1146
|
metadata={}
|
|
1129
1147
|
)
|
|
1130
1148
|
event_manager.write_result(
|
|
1131
|
-
content=content.to_dict(), metadata=metadata)
|
|
1149
|
+
content=content.to_dict(), metadata=metadata.to_dict())
|
|
1150
|
+
elif isinstance(agent_event, PlanModeRespondEvent):
|
|
1151
|
+
metadata.path = "/agent/edit/plan_mode_respond"
|
|
1152
|
+
content = EventContentCreator.create_markdown_result(
|
|
1153
|
+
content=agent_event.completion.response,
|
|
1154
|
+
metadata={}
|
|
1155
|
+
)
|
|
1156
|
+
event_manager.write_result(
|
|
1157
|
+
content=content.to_dict(), metadata=metadata.to_dict())
|
|
1158
|
+
|
|
1159
|
+
elif isinstance(agent_event, TokenUsageEvent):
|
|
1160
|
+
last_meta: SingleOutputMeta = agent_event.usage
|
|
1161
|
+
# Get model info for pricing
|
|
1162
|
+
from autocoder.utils import llms as llm_utils
|
|
1163
|
+
model_name = ",".join(llm_utils.get_llm_names(self.llm))
|
|
1164
|
+
model_info = llm_utils.get_model_info(
|
|
1165
|
+
model_name, self.args.product_mode) or {}
|
|
1166
|
+
input_price = model_info.get(
|
|
1167
|
+
"input_price", 0.0) if model_info else 0.0
|
|
1168
|
+
output_price = model_info.get(
|
|
1169
|
+
"output_price", 0.0) if model_info else 0.0
|
|
1170
|
+
|
|
1171
|
+
# Calculate costs
|
|
1172
|
+
input_cost = (last_meta.input_tokens_count *
|
|
1173
|
+
input_price) / 1000000 # Convert to millions
|
|
1174
|
+
# Convert to millions
|
|
1175
|
+
output_cost = (
|
|
1176
|
+
last_meta.generated_tokens_count * output_price) / 1000000
|
|
1177
|
+
|
|
1178
|
+
get_event_manager(self.args.event_file).write_result(
|
|
1179
|
+
EventContentCreator.create_result(content=EventContentCreator.ResultTokenStatContent(
|
|
1180
|
+
model_name=model_name,
|
|
1181
|
+
elapsed_time=0.0,
|
|
1182
|
+
first_token_time=last_meta.first_token_time,
|
|
1183
|
+
input_tokens=last_meta.input_tokens_count,
|
|
1184
|
+
output_tokens=last_meta.generated_tokens_count,
|
|
1185
|
+
).to_dict()),metadata=metadata.to_dict())
|
|
1186
|
+
|
|
1132
1187
|
elif isinstance(agent_event, CompletionEvent):
|
|
1133
1188
|
# 在这里完成实际合并
|
|
1134
1189
|
try:
|
|
1135
1190
|
self.apply_changes()
|
|
1136
1191
|
except Exception as e:
|
|
1137
|
-
logger.exception(
|
|
1192
|
+
logger.exception(
|
|
1193
|
+
f"Error merging shadow changes to project: {e}")
|
|
1138
1194
|
|
|
1139
1195
|
metadata.path = "/agent/edit/completion"
|
|
1140
1196
|
content = EventContentCreator.create_completion(
|
|
1141
1197
|
success_code="AGENT_COMPLETE",
|
|
1142
1198
|
success_message="Agent attempted task completion.",
|
|
1143
1199
|
result={
|
|
1144
|
-
|
|
1200
|
+
"response": agent_event.completion.result
|
|
1145
1201
|
}
|
|
1146
1202
|
)
|
|
1147
|
-
event_manager.write_completion(
|
|
1203
|
+
event_manager.write_completion(
|
|
1204
|
+
content=content.to_dict(), metadata=metadata.to_dict())
|
|
1148
1205
|
elif isinstance(agent_event, ErrorEvent):
|
|
1149
1206
|
metadata.path = "/agent/edit/error"
|
|
1150
1207
|
content = EventContentCreator.create_error(
|
|
@@ -1152,7 +1209,8 @@ class AgenticEdit:
|
|
|
1152
1209
|
error_message=agent_event.message,
|
|
1153
1210
|
details={"agent_event_type": "ErrorEvent"}
|
|
1154
1211
|
)
|
|
1155
|
-
event_manager.write_error(
|
|
1212
|
+
event_manager.write_error(
|
|
1213
|
+
content=content.to_dict(), metadata=metadata.to_dict())
|
|
1156
1214
|
else:
|
|
1157
1215
|
metadata.path = "/agent/edit/error"
|
|
1158
1216
|
logger.warning(
|
|
@@ -1163,7 +1221,8 @@ class AgenticEdit:
|
|
|
1163
1221
|
details={"agent_event_type": type(
|
|
1164
1222
|
agent_event).__name__}
|
|
1165
1223
|
)
|
|
1166
|
-
event_manager.write_error(
|
|
1224
|
+
event_manager.write_error(
|
|
1225
|
+
content=content.to_dict(), metadata=metadata.to_dict())
|
|
1167
1226
|
|
|
1168
1227
|
except Exception as e:
|
|
1169
1228
|
logger.exception(
|
|
@@ -1174,15 +1233,16 @@ class AgenticEdit:
|
|
|
1174
1233
|
error_message=f"An unexpected error occurred: {str(e)}",
|
|
1175
1234
|
details={"exception_type": type(e).__name__}
|
|
1176
1235
|
)
|
|
1177
|
-
event_manager.write_error(
|
|
1236
|
+
event_manager.write_error(
|
|
1237
|
+
content=error_content.to_dict(), metadata=metadata.to_dict())
|
|
1178
1238
|
# Re-raise the exception if needed, or handle appropriately
|
|
1179
1239
|
raise e
|
|
1180
1240
|
|
|
1181
1241
|
def apply_changes(self):
|
|
1182
1242
|
"""
|
|
1183
1243
|
Apply all tracked file changes to the original project directory.
|
|
1184
|
-
"""
|
|
1185
|
-
for (file_path,change) in self.get_all_file_changes().items():
|
|
1244
|
+
"""
|
|
1245
|
+
for (file_path, change) in self.get_all_file_changes().items():
|
|
1186
1246
|
with open(file_path, 'w', encoding='utf-8') as f:
|
|
1187
1247
|
f.write(change.content)
|
|
1188
1248
|
|
|
@@ -1194,33 +1254,40 @@ class AgenticEdit:
|
|
|
1194
1254
|
self.args.source_dir,
|
|
1195
1255
|
f"{self.args.query}\nauto_coder_{file_name}",
|
|
1196
1256
|
)
|
|
1197
|
-
|
|
1198
|
-
action_yml_file_manager = ActionYmlFileManager(
|
|
1257
|
+
|
|
1258
|
+
action_yml_file_manager = ActionYmlFileManager(
|
|
1259
|
+
self.args.source_dir)
|
|
1199
1260
|
action_file_name = os.path.basename(self.args.file)
|
|
1200
1261
|
add_updated_urls = []
|
|
1201
1262
|
commit_result.changed_files
|
|
1202
1263
|
for file in commit_result.changed_files:
|
|
1203
|
-
add_updated_urls.append(
|
|
1264
|
+
add_updated_urls.append(
|
|
1265
|
+
os.path.join(self.args.source_dir, file))
|
|
1204
1266
|
|
|
1205
1267
|
self.args.add_updated_urls = add_updated_urls
|
|
1206
|
-
update_yaml_success = action_yml_file_manager.update_yaml_field(
|
|
1207
|
-
|
|
1208
|
-
|
|
1268
|
+
update_yaml_success = action_yml_file_manager.update_yaml_field(
|
|
1269
|
+
action_file_name, "add_updated_urls", add_updated_urls)
|
|
1270
|
+
if not update_yaml_success:
|
|
1271
|
+
self.printer.print_in_terminal(
|
|
1272
|
+
"yaml_save_error", style="red", yaml_file=action_file_name)
|
|
1209
1273
|
|
|
1210
1274
|
if self.args.enable_active_context:
|
|
1211
|
-
active_context_manager = ActiveContextManager(
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1275
|
+
active_context_manager = ActiveContextManager(
|
|
1276
|
+
self.llm, self.args.source_dir)
|
|
1277
|
+
task_id = active_context_manager.process_changes(
|
|
1278
|
+
self.args)
|
|
1279
|
+
self.printer.print_in_terminal("active_context_background_task",
|
|
1280
|
+
style="blue",
|
|
1281
|
+
task_id=task_id)
|
|
1216
1282
|
git_utils.print_commit_info(commit_result=commit_result)
|
|
1217
1283
|
except Exception as e:
|
|
1218
1284
|
self.printer.print_str_in_terminal(
|
|
1219
|
-
self.git_require_msg(
|
|
1285
|
+
self.git_require_msg(
|
|
1286
|
+
source_dir=self.args.source_dir, error=str(e)),
|
|
1220
1287
|
style="red"
|
|
1221
|
-
)
|
|
1288
|
+
)
|
|
1222
1289
|
else:
|
|
1223
|
-
self.printer.print_in_terminal("no_changes_made")
|
|
1290
|
+
self.printer.print_in_terminal("no_changes_made")
|
|
1224
1291
|
|
|
1225
1292
|
def run_in_terminal(self, request: AgenticEditRequest):
|
|
1226
1293
|
"""
|
|
@@ -1258,6 +1325,9 @@ class AgenticEdit:
|
|
|
1258
1325
|
if event.tool_name == "AttemptCompletionTool":
|
|
1259
1326
|
continue # Do not display AttemptCompletionTool result
|
|
1260
1327
|
|
|
1328
|
+
if event.tool_name == "PlanModeRespondTool":
|
|
1329
|
+
continue
|
|
1330
|
+
|
|
1261
1331
|
result = event.result
|
|
1262
1332
|
title = f"✅ Tool Result: {event.tool_name}" if result.success else f"❌ Tool Result: {event.tool_name}"
|
|
1263
1333
|
border_style = "green" if result.success else "red"
|
|
@@ -1274,7 +1344,7 @@ class AgenticEdit:
|
|
|
1274
1344
|
panel_content = [base_content]
|
|
1275
1345
|
syntax_content = None
|
|
1276
1346
|
|
|
1277
|
-
if result.content is not None:
|
|
1347
|
+
if result.content is not None:
|
|
1278
1348
|
content_str = ""
|
|
1279
1349
|
try:
|
|
1280
1350
|
if isinstance(result.content, (dict, list)):
|
|
@@ -1316,7 +1386,8 @@ class AgenticEdit:
|
|
|
1316
1386
|
else:
|
|
1317
1387
|
content_str = str(result.content)
|
|
1318
1388
|
# Append simple string content directly
|
|
1319
|
-
panel_content.append(
|
|
1389
|
+
panel_content.append(
|
|
1390
|
+
_format_content(content_str))
|
|
1320
1391
|
except Exception as e:
|
|
1321
1392
|
logger.warning(
|
|
1322
1393
|
f"Error formatting tool result content: {e}")
|
|
@@ -1329,13 +1400,17 @@ class AgenticEdit:
|
|
|
1329
1400
|
# Print syntax highlighted content separately if it exists
|
|
1330
1401
|
if syntax_content:
|
|
1331
1402
|
console.print(syntax_content)
|
|
1403
|
+
elif isinstance(event, PlanModeRespondEvent):
|
|
1404
|
+
console.print(Panel(Markdown(event.completion.response),
|
|
1405
|
+
title="🏁 Task Completion", border_style="green", title_align="left"))
|
|
1332
1406
|
|
|
1333
1407
|
elif isinstance(event, CompletionEvent):
|
|
1334
1408
|
# 在这里完成实际合并
|
|
1335
1409
|
try:
|
|
1336
1410
|
self.apply_changes()
|
|
1337
1411
|
except Exception as e:
|
|
1338
|
-
logger.exception(
|
|
1412
|
+
logger.exception(
|
|
1413
|
+
f"Error merging shadow changes to project: {e}")
|
|
1339
1414
|
|
|
1340
1415
|
console.print(Panel(Markdown(event.completion.result),
|
|
1341
1416
|
title="🏁 Task Completion", border_style="green", title_align="left"))
|