auto-coder 0.1.346__tar.gz → 0.1.348__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.
- {auto_coder-0.1.346 → auto_coder-0.1.348}/PKG-INFO +1 -1
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/SOURCES.txt +3 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/auto_coder_runner.py +5 -4
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/auto_coder_lang.py +8 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit.py +68 -22
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +2 -0
- auto_coder-0.1.348/src/autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +42 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/__init__.py +20 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/byzer_storage_cache.py +44 -74
- auto_coder-0.1.348/src/autocoder/rag/cache/failed_files_utils.py +39 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/file_monitor_cache.py +3 -1
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/local_byzer_storage_cache.py +45 -73
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +43 -13
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/simple_cache.py +40 -12
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/document_retriever.py +17 -8
- auto_coder-0.1.348/src/autocoder/rag/loaders/image_loader.py +551 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/long_context_rag.py +2 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/qa_conversation_strategy.py +26 -23
- auto_coder-0.1.348/src/autocoder/version.py +1 -0
- auto_coder-0.1.346/src/autocoder/version.py +0 -1
- {auto_coder-0.1.346 → auto_coder-0.1.348}/LICENSE +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/README.md +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/setup.cfg +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/setup.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/model_speed_test.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/utils_code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_conversation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/ignore_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/python_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/reactjs_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/linters/vue_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_planner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.348}/tests/test_symbols_utils.py +0 -0
|
@@ -129,6 +129,7 @@ src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py
|
|
|
129
129
|
src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py
|
|
130
130
|
src/autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py
|
|
131
131
|
src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py
|
|
132
|
+
src/autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py
|
|
132
133
|
src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py
|
|
133
134
|
src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py
|
|
134
135
|
src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py
|
|
@@ -223,6 +224,7 @@ src/autocoder/rag/cache/__init__.py
|
|
|
223
224
|
src/autocoder/rag/cache/base_cache.py
|
|
224
225
|
src/autocoder/rag/cache/byzer_storage_cache.py
|
|
225
226
|
src/autocoder/rag/cache/cache_result_merge.py
|
|
227
|
+
src/autocoder/rag/cache/failed_files_utils.py
|
|
226
228
|
src/autocoder/rag/cache/file_monitor_cache.py
|
|
227
229
|
src/autocoder/rag/cache/local_byzer_storage_cache.py
|
|
228
230
|
src/autocoder/rag/cache/local_duckdb_storage_cache.py
|
|
@@ -231,6 +233,7 @@ src/autocoder/rag/cache/simple_cache.py
|
|
|
231
233
|
src/autocoder/rag/loaders/__init__.py
|
|
232
234
|
src/autocoder/rag/loaders/docx_loader.py
|
|
233
235
|
src/autocoder/rag/loaders/excel_loader.py
|
|
236
|
+
src/autocoder/rag/loaders/image_loader.py
|
|
234
237
|
src/autocoder/rag/loaders/pdf_loader.py
|
|
235
238
|
src/autocoder/rag/loaders/ppt_loader.py
|
|
236
239
|
src/autocoder/rag/stream_event/__init__.py
|
|
@@ -2838,11 +2838,12 @@ def auto_command(query: str,extra_args: Dict[str,Any]={}):
|
|
|
2838
2838
|
memory_config=MemoryConfig(memory=memory,
|
|
2839
2839
|
save_memory_func=save_memory), command_config=CommandConfig,
|
|
2840
2840
|
conversation_name="current"
|
|
2841
|
-
)
|
|
2842
|
-
if get_run_context() == RunMode.
|
|
2843
|
-
agent.run_in_terminal(AgenticEditRequest(user_input=query))
|
|
2844
|
-
else:
|
|
2841
|
+
)
|
|
2842
|
+
if get_run_context().mode == RunMode.WEB:
|
|
2845
2843
|
agent.run_with_events(AgenticEditRequest(user_input=query))
|
|
2844
|
+
else:
|
|
2845
|
+
agent.run_in_terminal(AgenticEditRequest(user_input=query))
|
|
2846
|
+
|
|
2846
2847
|
return
|
|
2847
2848
|
|
|
2848
2849
|
args = get_final_config()
|
|
@@ -833,6 +833,14 @@ MESSAGES = {
|
|
|
833
833
|
"/agent/edit/user_query":{
|
|
834
834
|
"en":"User Query",
|
|
835
835
|
"zh":"用户查询"
|
|
836
|
+
},
|
|
837
|
+
"/agent/edit/apply_pre_changes":{
|
|
838
|
+
"en":"Commit user changes",
|
|
839
|
+
"zh":"检查用户是否有手动修改(如有,会自动提交)..."
|
|
840
|
+
},
|
|
841
|
+
"/agent/edit/apply_changes":{
|
|
842
|
+
"en":"Commit the changes in preview steps",
|
|
843
|
+
"zh":"提交前面步骤的修改"
|
|
836
844
|
}
|
|
837
845
|
}
|
|
838
846
|
|
|
@@ -52,8 +52,10 @@ from autocoder.common.v2.agent.agentic_edit_tools import ( # Import specific re
|
|
|
52
52
|
ExecuteCommandToolResolver, ReadFileToolResolver, WriteToFileToolResolver,
|
|
53
53
|
ReplaceInFileToolResolver, SearchFilesToolResolver, ListFilesToolResolver,
|
|
54
54
|
ListCodeDefinitionNamesToolResolver, AskFollowupQuestionToolResolver,
|
|
55
|
-
AttemptCompletionToolResolver, PlanModeRespondToolResolver, UseMcpToolResolver
|
|
55
|
+
AttemptCompletionToolResolver, PlanModeRespondToolResolver, UseMcpToolResolver,
|
|
56
|
+
ListPackageInfoToolResolver
|
|
56
57
|
)
|
|
58
|
+
|
|
57
59
|
from autocoder.common.v2.agent.agentic_edit_types import (AgenticEditRequest, ToolResult,
|
|
58
60
|
MemoryConfig, CommandConfig, BaseTool,
|
|
59
61
|
ExecuteCommandTool, ReadFileTool,
|
|
@@ -63,6 +65,7 @@ from autocoder.common.v2.agent.agentic_edit_types import (AgenticEditRequest, To
|
|
|
63
65
|
ListFilesTool,
|
|
64
66
|
ListCodeDefinitionNamesTool, AskFollowupQuestionTool,
|
|
65
67
|
AttemptCompletionTool, PlanModeRespondTool, UseMcpTool,
|
|
68
|
+
ListPackageInfoTool,
|
|
66
69
|
TOOL_MODEL_MAP,
|
|
67
70
|
# Event Types
|
|
68
71
|
LLMOutputEvent, LLMThinkingEvent, ToolCallEvent,
|
|
@@ -83,6 +86,7 @@ TOOL_RESOLVER_MAP: Dict[Type[BaseTool], Type[BaseToolResolver]] = {
|
|
|
83
86
|
SearchFilesTool: SearchFilesToolResolver,
|
|
84
87
|
ListFilesTool: ListFilesToolResolver,
|
|
85
88
|
ListCodeDefinitionNamesTool: ListCodeDefinitionNamesToolResolver,
|
|
89
|
+
ListPackageInfoTool: ListPackageInfoToolResolver,
|
|
86
90
|
AskFollowupQuestionTool: AskFollowupQuestionToolResolver,
|
|
87
91
|
AttemptCompletionTool: AttemptCompletionToolResolver, # Will stop the loop anyway
|
|
88
92
|
PlanModeRespondTool: PlanModeRespondToolResolver,
|
|
@@ -208,18 +212,7 @@ class AgenticEdit:
|
|
|
208
212
|
@byzerllm.prompt()
|
|
209
213
|
def _analyze(self, request: AgenticEditRequest) -> str:
|
|
210
214
|
"""
|
|
211
|
-
You are a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.
|
|
212
|
-
|
|
213
|
-
====
|
|
214
|
-
|
|
215
|
-
FILES CONTEXT
|
|
216
|
-
|
|
217
|
-
The following files are provided to you as context for the user's task. You can use these files to understand the project structure and codebase, and to make informed decisions about which files to modify.
|
|
218
|
-
If you need to read more files, you can use the tools to find and read more files.
|
|
219
|
-
|
|
220
|
-
<files>
|
|
221
|
-
{{files}}
|
|
222
|
-
</files>
|
|
215
|
+
You are a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.
|
|
223
216
|
|
|
224
217
|
====
|
|
225
218
|
|
|
@@ -245,6 +238,7 @@ class AgenticEdit:
|
|
|
245
238
|
|
|
246
239
|
Always adhere to this format for the tool use to ensure proper parsing and execution.
|
|
247
240
|
|
|
241
|
+
|
|
248
242
|
# Tools
|
|
249
243
|
|
|
250
244
|
## execute_command
|
|
@@ -258,6 +252,15 @@ class AgenticEdit:
|
|
|
258
252
|
<requires_approval>true or false</requires_approval>
|
|
259
253
|
</execute_command>
|
|
260
254
|
|
|
255
|
+
## list_package_info
|
|
256
|
+
Description: Request to retrieve information about a source code package, such as recent changes or documentation summary, to better understand the code context. It accepts a directory path (absolute or relative to the current project).
|
|
257
|
+
Parameters:
|
|
258
|
+
- path: (required) The source code package directory path.
|
|
259
|
+
Usage:
|
|
260
|
+
<list_package_info>
|
|
261
|
+
<path>relative/or/absolute/package/path</path>
|
|
262
|
+
</list_package_info>
|
|
263
|
+
|
|
261
264
|
## read_file
|
|
262
265
|
Description: Request to read the contents of a file at the specified path. Use this when you need to examine the contents of an existing file you do not know the contents of, for example to analyze code, review text files, or extract information from configuration files. Automatically extracts raw text from PDF and DOCX files. May not be suitable for other types of binary files, as it returns the raw content as a string.
|
|
263
266
|
Parameters:
|
|
@@ -670,20 +673,23 @@ class AgenticEdit:
|
|
|
670
673
|
|
|
671
674
|
{% if extra_docs %}
|
|
672
675
|
====
|
|
673
|
-
|
|
676
|
+
|
|
674
677
|
RULES PROVIDED BY USER
|
|
675
678
|
|
|
676
679
|
The following rules are provided by the user, and you must follow them strictly.
|
|
677
680
|
|
|
678
681
|
{% for key, value in extra_docs.items() %}
|
|
679
|
-
|
|
682
|
+
<user_rule>
|
|
683
|
+
##File: {{ key }}
|
|
680
684
|
{{ value }}
|
|
685
|
+
</user_rule>
|
|
681
686
|
{% endfor %}
|
|
682
687
|
{% endif %}
|
|
683
688
|
"""
|
|
684
689
|
import os
|
|
685
690
|
extra_docs = {}
|
|
686
|
-
rules_dir = os.path.join(self.args.source_dir,
|
|
691
|
+
rules_dir = os.path.join(self.args.source_dir,
|
|
692
|
+
".auto-coder", "autocoderrules")
|
|
687
693
|
if os.path.isdir(rules_dir):
|
|
688
694
|
for fname in os.listdir(rules_dir):
|
|
689
695
|
if fname.endswith(".md"):
|
|
@@ -691,7 +697,7 @@ class AgenticEdit:
|
|
|
691
697
|
try:
|
|
692
698
|
with open(fpath, "r", encoding="utf-8") as f:
|
|
693
699
|
content = f.read()
|
|
694
|
-
key =
|
|
700
|
+
key = fpath
|
|
695
701
|
extra_docs[key] = content
|
|
696
702
|
except Exception:
|
|
697
703
|
continue
|
|
@@ -769,11 +775,25 @@ class AgenticEdit:
|
|
|
769
775
|
# print(system_prompt)
|
|
770
776
|
conversations = [
|
|
771
777
|
{"role": "system", "content": system_prompt},
|
|
772
|
-
]
|
|
778
|
+
]
|
|
779
|
+
|
|
780
|
+
conversations.append({
|
|
781
|
+
"role":"user","content":f'''
|
|
782
|
+
Below are some files the user is focused on, and the content is up to date. These entries show the file paths along with their full text content, which can help you better understand the user's needs. If the information is insufficient, you can use tools such as read_file to retrieve more details.
|
|
783
|
+
<files>
|
|
784
|
+
{self.files.to_str()}
|
|
785
|
+
</files>'''
|
|
786
|
+
})
|
|
787
|
+
|
|
788
|
+
conversations.append({
|
|
789
|
+
"role":"assistant","content":"Ok"
|
|
790
|
+
})
|
|
791
|
+
conversations.extend(self.conversation_manager.get_history())
|
|
773
792
|
conversations.append({
|
|
774
793
|
"role": "user", "content": request.user_input
|
|
775
794
|
})
|
|
776
795
|
self.conversation_manager.add_user_message(request.user_input)
|
|
796
|
+
|
|
777
797
|
logger.debug(
|
|
778
798
|
f"Initial conversation history size: {len(conversations)}")
|
|
779
799
|
|
|
@@ -998,9 +1018,7 @@ class AgenticEdit:
|
|
|
998
1018
|
|
|
999
1019
|
for content_chunk, metadata in generator:
|
|
1000
1020
|
global_cancel.check_and_raise()
|
|
1001
|
-
|
|
1002
|
-
meta_holder.meta = metadata
|
|
1003
|
-
logger.info(f"metadata: {metadata.input_tokens_count}")
|
|
1021
|
+
meta_holder.meta = metadata
|
|
1004
1022
|
if not content_chunk:
|
|
1005
1023
|
continue
|
|
1006
1024
|
buffer += content_chunk
|
|
@@ -1137,6 +1155,7 @@ class AgenticEdit:
|
|
|
1137
1155
|
standard event system format and writing them using the event manager.
|
|
1138
1156
|
"""
|
|
1139
1157
|
event_manager = get_event_manager(self.args.event_file)
|
|
1158
|
+
self.apply_pre_changes()
|
|
1140
1159
|
|
|
1141
1160
|
try:
|
|
1142
1161
|
event_stream = self.analyze(request)
|
|
@@ -1280,6 +1299,25 @@ class AgenticEdit:
|
|
|
1280
1299
|
# Re-raise the exception if needed, or handle appropriately
|
|
1281
1300
|
raise e
|
|
1282
1301
|
|
|
1302
|
+
def apply_pre_changes(self):
|
|
1303
|
+
# get the file name
|
|
1304
|
+
file_name = os.path.basename(self.args.file)
|
|
1305
|
+
if not self.args.skip_commit:
|
|
1306
|
+
try:
|
|
1307
|
+
get_event_manager(self.args.event_file).write_result(
|
|
1308
|
+
EventContentCreator.create_result(
|
|
1309
|
+
content=self.printer.get_message_from_key("/agent/edit/apply_pre_changes")), metadata=EventMetadata(
|
|
1310
|
+
action_file=self.args.file,
|
|
1311
|
+
is_streaming=False,
|
|
1312
|
+
path="/agent/edit/apply_pre_changes",
|
|
1313
|
+
stream_out_type="/agent/edit").to_dict())
|
|
1314
|
+
git_utils.commit_changes(
|
|
1315
|
+
self.args.source_dir, f"auto_coder_pre_{file_name}")
|
|
1316
|
+
except Exception as e:
|
|
1317
|
+
self.printer.print_in_terminal("git_init_required",
|
|
1318
|
+
source_dir=self.args.source_dir, error=str(e))
|
|
1319
|
+
return
|
|
1320
|
+
|
|
1283
1321
|
def apply_changes(self):
|
|
1284
1322
|
"""
|
|
1285
1323
|
Apply all tracked file changes to the original project directory.
|
|
@@ -1297,6 +1335,12 @@ class AgenticEdit:
|
|
|
1297
1335
|
f"{self.args.query}\nauto_coder_{file_name}",
|
|
1298
1336
|
)
|
|
1299
1337
|
|
|
1338
|
+
get_event_manager(self.args.event_file).write_result(
|
|
1339
|
+
EventContentCreator.create_result(
|
|
1340
|
+
content=self.printer.get_message_from_key("/agent/edit/apply_changes")), metadata=EventMetadata(
|
|
1341
|
+
action_file=self.args.file,
|
|
1342
|
+
is_streaming=False,
|
|
1343
|
+
stream_out_type="/agent/edit").to_dict())
|
|
1300
1344
|
action_yml_file_manager = ActionYmlFileManager(
|
|
1301
1345
|
self.args.source_dir)
|
|
1302
1346
|
action_file_name = os.path.basename(self.args.file)
|
|
@@ -1343,6 +1387,7 @@ class AgenticEdit:
|
|
|
1343
1387
|
f"[bold]{get_message('/agent/edit/user_query')}:[/bold]\n{request.user_input}", title=get_message("/agent/edit/objective"), border_style="blue"))
|
|
1344
1388
|
|
|
1345
1389
|
try:
|
|
1390
|
+
self.apply_pre_changes()
|
|
1346
1391
|
event_stream = self.analyze(request)
|
|
1347
1392
|
for event in event_stream:
|
|
1348
1393
|
if isinstance(event, LLMThinkingEvent):
|
|
@@ -1434,7 +1479,8 @@ class AgenticEdit:
|
|
|
1434
1479
|
logger.warning(
|
|
1435
1480
|
f"Error formatting tool result content: {e}")
|
|
1436
1481
|
panel_content.append(
|
|
1437
|
-
|
|
1482
|
+
# Fallback
|
|
1483
|
+
_format_content(str(result.content)))
|
|
1438
1484
|
|
|
1439
1485
|
# Print the base info panel
|
|
1440
1486
|
console.print(Panel("\n".join(
|
|
@@ -11,6 +11,7 @@ from .ask_followup_question_tool_resolver import AskFollowupQuestionToolResolver
|
|
|
11
11
|
from .attempt_completion_tool_resolver import AttemptCompletionToolResolver
|
|
12
12
|
from .plan_mode_respond_tool_resolver import PlanModeRespondToolResolver
|
|
13
13
|
from .use_mcp_tool_resolver import UseMcpToolResolver
|
|
14
|
+
from .list_package_info_tool_resolver import ListPackageInfoToolResolver
|
|
14
15
|
|
|
15
16
|
__all__ = [
|
|
16
17
|
"BaseToolResolver",
|
|
@@ -25,4 +26,5 @@ __all__ = [
|
|
|
25
26
|
"AttemptCompletionToolResolver",
|
|
26
27
|
"PlanModeRespondToolResolver",
|
|
27
28
|
"UseMcpToolResolver",
|
|
29
|
+
"ListPackageInfoToolResolver",
|
|
28
30
|
]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
|
|
2
|
+
import os
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_types import ListPackageInfoTool, ToolResult
|
|
6
|
+
from loguru import logger
|
|
7
|
+
import typing
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from autocoder.common.v2.agent.agentic_edit import AgenticEdit
|
|
11
|
+
|
|
12
|
+
class ListPackageInfoToolResolver(BaseToolResolver):
|
|
13
|
+
def __init__(self, agent: Optional['AgenticEdit'], tool: ListPackageInfoTool, args):
|
|
14
|
+
super().__init__(agent, tool, args)
|
|
15
|
+
self.tool: ListPackageInfoTool = tool
|
|
16
|
+
|
|
17
|
+
def resolve(self) -> ToolResult:
|
|
18
|
+
source_dir = self.args.source_dir or "."
|
|
19
|
+
abs_source_dir = os.path.abspath(source_dir)
|
|
20
|
+
|
|
21
|
+
input_path = self.tool.path.strip()
|
|
22
|
+
abs_input_path = os.path.abspath(os.path.join(source_dir, input_path)) if not os.path.isabs(input_path) else input_path
|
|
23
|
+
|
|
24
|
+
# 校验输入目录是否在项目目录内
|
|
25
|
+
if not abs_input_path.startswith(abs_source_dir):
|
|
26
|
+
return ToolResult(success=False, message=f"Error: Access denied. Path outside project: {self.tool.path}")
|
|
27
|
+
|
|
28
|
+
rel_package_path = os.path.relpath(abs_input_path, abs_source_dir)
|
|
29
|
+
active_md_path = os.path.join(abs_source_dir, ".auto-coder", "active-context", rel_package_path, "active.md")
|
|
30
|
+
|
|
31
|
+
logger.info(f"Looking for package info at: {active_md_path}")
|
|
32
|
+
|
|
33
|
+
if not os.path.exists(active_md_path):
|
|
34
|
+
return ToolResult(success=True, message="No package info found for this path.", content="没有相关包信息。")
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
with open(active_md_path, 'r', encoding='utf-8', errors='replace') as f:
|
|
38
|
+
content = f.read()
|
|
39
|
+
return ToolResult(success=True, message="Successfully retrieved package info.", content=content)
|
|
40
|
+
except Exception as e:
|
|
41
|
+
logger.error(f"Error reading package info file: {e}")
|
|
42
|
+
return ToolResult(success=False, message=f"Error reading package info file: {e}")
|
{auto_coder-0.1.346 → auto_coder-0.1.348}/src/autocoder/common/v2/agent/agentic_edit_types.py
RENAMED
|
@@ -57,6 +57,9 @@ class UseMcpTool(BaseTool):
|
|
|
57
57
|
tool_name: str
|
|
58
58
|
query:str
|
|
59
59
|
|
|
60
|
+
class ListPackageInfoTool(BaseTool):
|
|
61
|
+
path: str # 源码包目录,相对路径或绝对路径
|
|
62
|
+
|
|
60
63
|
# Event Types for Rich Output Streaming
|
|
61
64
|
class LLMOutputEvent(BaseModel):
|
|
62
65
|
"""Represents plain text output from the LLM."""
|
|
@@ -112,6 +115,7 @@ TOOL_MODEL_MAP: Dict[str, Type[BaseTool]] = {
|
|
|
112
115
|
"attempt_completion": AttemptCompletionTool,
|
|
113
116
|
"plan_mode_respond": PlanModeRespondTool,
|
|
114
117
|
"use_mcp_tool": UseMcpTool,
|
|
118
|
+
"list_package_info": ListPackageInfoTool,
|
|
115
119
|
}
|
|
116
120
|
|
|
117
121
|
class FileChangeEntry(BaseModel):
|
|
@@ -256,6 +256,7 @@ class PluginManager:
|
|
|
256
256
|
"/plugins/dirs /remove",
|
|
257
257
|
"/plugins/dirs /clear",
|
|
258
258
|
]
|
|
259
|
+
self._wrapped_functions: Dict[str, Callable] = {}
|
|
259
260
|
|
|
260
261
|
@property
|
|
261
262
|
def cached_discover_plugins(self) -> List[Type[Plugin]]:
|
|
@@ -561,6 +562,7 @@ class PluginManager:
|
|
|
561
562
|
return result
|
|
562
563
|
return None
|
|
563
564
|
|
|
565
|
+
self._wrapped_functions[func_name] = wrapped
|
|
564
566
|
return wrapped
|
|
565
567
|
|
|
566
568
|
def register_function_interception(self, plugin_name: str, func_name: str) -> None:
|
|
@@ -1107,6 +1109,24 @@ class PluginManager:
|
|
|
1107
1109
|
|
|
1108
1110
|
return processed_completions
|
|
1109
1111
|
|
|
1112
|
+
def get_wrapped_functions(self) -> Dict[str, Callable]:
|
|
1113
|
+
"""获取所有已包装的函数。
|
|
1114
|
+
|
|
1115
|
+
Returns:
|
|
1116
|
+
Dict[str, Callable]: 包含所有已包装函数的字典,键为函数名,值为包装后的函数
|
|
1117
|
+
"""
|
|
1118
|
+
return self._wrapped_functions
|
|
1119
|
+
|
|
1120
|
+
def get_wrapped_function(self, func_name: str) -> Callable:
|
|
1121
|
+
"""获取已包装的函数。
|
|
1122
|
+
|
|
1123
|
+
Args:
|
|
1124
|
+
func_name: 函数名
|
|
1125
|
+
|
|
1126
|
+
Returns:
|
|
1127
|
+
已包装的函数,如果未找到则返回 None
|
|
1128
|
+
"""
|
|
1129
|
+
return self._wrapped_functions.get(func_name)
|
|
1110
1130
|
|
|
1111
1131
|
def register_global_plugin_dir(plugin_dir: str) -> None:
|
|
1112
1132
|
"""注册一个全局插件目录。
|
|
@@ -29,6 +29,7 @@ import hashlib
|
|
|
29
29
|
from typing import Union
|
|
30
30
|
from pydantic import BaseModel
|
|
31
31
|
from autocoder.rag.cache.cache_result_merge import CacheResultMerger, MergeStrategy
|
|
32
|
+
from .failed_files_utils import save_failed_files, load_failed_files
|
|
32
33
|
import time
|
|
33
34
|
|
|
34
35
|
if platform.system() != "Windows":
|
|
@@ -65,74 +66,18 @@ class ByzerStorageCache(BaseCacheManager):
|
|
|
65
66
|
ignore_spec,
|
|
66
67
|
required_exts,
|
|
67
68
|
extra_params: Optional[AutoCoderArgs] = None,
|
|
69
|
+
args=None,
|
|
70
|
+
llm=None,
|
|
68
71
|
):
|
|
69
72
|
"""
|
|
70
73
|
初始化基于云端 Byzer Storage 的 RAG 缓存管理器。
|
|
71
|
-
|
|
72
|
-
参数:
|
|
73
|
-
path: 需要索引的代码库根目录
|
|
74
|
-
ignore_spec: 指定哪些文件/目录应被忽略的规则
|
|
75
|
-
required_exts: 需要处理的文件扩展名列表
|
|
76
|
-
extra_params: 额外的配置参数,包含向量索引相关设置
|
|
77
|
-
|
|
78
|
-
缓存结构 (self.cache):
|
|
79
|
-
self.cache 是一个字典,键为文件路径,值为 CacheItem 对象:
|
|
80
|
-
{
|
|
81
|
-
"file_path1": CacheItem(
|
|
82
|
-
file_path: str, # 文件的绝对路径
|
|
83
|
-
relative_path: str, # 相对于项目根目录的路径
|
|
84
|
-
content: List[Dict], # 文件内容的结构化表示,每个元素是 SourceCode 对象的序列化
|
|
85
|
-
modify_time: float, # 文件最后修改时间的时间戳
|
|
86
|
-
md5: str # 文件内容的 MD5 哈希值,用于检测变更
|
|
87
|
-
),
|
|
88
|
-
"file_path2": CacheItem(...),
|
|
89
|
-
...
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
这个缓存有两层存储:
|
|
93
|
-
1. 本地文件缓存: 保存在项目根目录的 .cache/byzer_storage_speedup.jsonl 文件中
|
|
94
|
-
- 用于跟踪文件变更和快速加载
|
|
95
|
-
- 使用 JSONL 格式存储,每行是一个 CacheItem 的 JSON 表示
|
|
96
|
-
|
|
97
|
-
2. 云端 Byzer Storage 向量数据库:
|
|
98
|
-
- 存储文件内容的分块和向量嵌入
|
|
99
|
-
- 每个文件被分割成大小为 chunk_size 的文本块
|
|
100
|
-
- 每个块都会生成向量嵌入,用于语义搜索
|
|
101
|
-
- 存储结构包含: 文件路径、内容块、原始内容、向量嵌入、修改时间
|
|
102
|
-
|
|
103
|
-
源代码处理流程:
|
|
104
|
-
在缓存更新过程中使用了两个关键函数:
|
|
105
|
-
|
|
106
|
-
1. process_file_in_multi_process: 在多进程环境中处理文件
|
|
107
|
-
- 参数: file_info (文件信息元组)
|
|
108
|
-
- 返回值: List[SourceCode] 或 None
|
|
109
|
-
- 用途: 在初始构建缓存时并行处理多个文件
|
|
110
|
-
|
|
111
|
-
2. process_file_local: 在当前进程中处理单个文件
|
|
112
|
-
- 参数: file_path (文件路径)
|
|
113
|
-
- 返回值: List[SourceCode] 或 None
|
|
114
|
-
- 用途: 在检测到文件更新时处理单个文件
|
|
115
|
-
|
|
116
|
-
文件处理后,会:
|
|
117
|
-
1. 更新内存中的缓存 (self.cache)
|
|
118
|
-
2. 将缓存持久化到本地文件
|
|
119
|
-
3. 将内容分块并更新到 Byzer Storage 向量数据库
|
|
120
|
-
|
|
121
|
-
更新机制:
|
|
122
|
-
- 通过单独的线程异步处理文件变更
|
|
123
|
-
- 使用 MD5 哈希值检测文件是否发生变化
|
|
124
|
-
- 支持文件添加、更新和删除事件
|
|
125
|
-
- 使用向量数据库进行语义检索,支持相似度搜索
|
|
126
|
-
|
|
127
|
-
与 LocalByzerStorageCache 的区别:
|
|
128
|
-
- 使用云端 ByzerStorage 而非本地存储
|
|
129
|
-
- 适用于需要远程访问和共享索引的场景
|
|
130
|
-
- 支持大规模分布式检索和更高级的查询功能
|
|
131
74
|
"""
|
|
132
75
|
self.path = path
|
|
133
76
|
self.ignore_spec = ignore_spec
|
|
134
77
|
self.required_exts = required_exts
|
|
135
78
|
self.extra_params = extra_params
|
|
79
|
+
self.args = args
|
|
80
|
+
self.llm = llm
|
|
136
81
|
self.rag_build_name = extra_params.rag_build_name
|
|
137
82
|
self.storage = ByzerStorage("byzerai_store", "rag", self.rag_build_name)
|
|
138
83
|
self.queue = []
|
|
@@ -150,16 +95,20 @@ class ByzerStorageCache(BaseCacheManager):
|
|
|
150
95
|
self.cache_file = os.path.join(self.cache_dir, "byzer_storage_speedup.jsonl")
|
|
151
96
|
self.cache: Dict[str, CacheItem] = {}
|
|
152
97
|
|
|
98
|
+
# 创建缓存目录
|
|
99
|
+
if not os.path.exists(self.cache_dir):
|
|
100
|
+
os.makedirs(self.cache_dir)
|
|
101
|
+
|
|
102
|
+
# failed files support
|
|
103
|
+
self.failed_files_path = os.path.join(self.cache_dir, "failed_files.json")
|
|
104
|
+
self.failed_files = load_failed_files(self.failed_files_path)
|
|
105
|
+
|
|
153
106
|
self.lock = threading.Lock()
|
|
154
107
|
self.stop_event = threading.Event()
|
|
155
108
|
self.thread = threading.Thread(target=self.process_queue)
|
|
156
109
|
self.thread.daemon = True
|
|
157
110
|
self.thread.start()
|
|
158
111
|
|
|
159
|
-
# 创建缓存目录
|
|
160
|
-
if not os.path.exists(self.cache_dir):
|
|
161
|
-
os.makedirs(self.cache_dir)
|
|
162
|
-
|
|
163
112
|
# 加载缓存
|
|
164
113
|
self.cache = self._load_cache()
|
|
165
114
|
|
|
@@ -455,6 +404,10 @@ class ByzerStorageCache(BaseCacheManager):
|
|
|
455
404
|
for item in file_list.file_paths:
|
|
456
405
|
logger.info(f"[QUEUE PROCESSING] Processing file deletion: {item}")
|
|
457
406
|
del self.cache[item]
|
|
407
|
+
# remove from failed files if present
|
|
408
|
+
if item in self.failed_files:
|
|
409
|
+
self.failed_files.remove(item)
|
|
410
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
458
411
|
# Create a temporary FileInfo object
|
|
459
412
|
file_info = FileInfo(file_path=item, relative_path="", modify_time=0, file_md5="")
|
|
460
413
|
self.update_storage(file_info, is_delete=True)
|
|
@@ -463,16 +416,29 @@ class ByzerStorageCache(BaseCacheManager):
|
|
|
463
416
|
logger.info(f"[QUEUE PROCESSING] Processing add/update event, total files: {len(file_list.file_infos)}")
|
|
464
417
|
for file_info in file_list.file_infos:
|
|
465
418
|
logger.info(f"[QUEUE PROCESSING] Processing file update: {file_info.file_path}")
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
419
|
+
try:
|
|
420
|
+
content = process_file_local(self.fileinfo_to_tuple(file_info))
|
|
421
|
+
if content:
|
|
422
|
+
self.cache[file_info.file_path] = CacheItem(
|
|
423
|
+
file_path=file_info.file_path,
|
|
424
|
+
relative_path=file_info.relative_path,
|
|
425
|
+
content=[c.model_dump() for c in content],
|
|
426
|
+
modify_time=file_info.modify_time,
|
|
427
|
+
md5=file_info.file_md5,
|
|
428
|
+
)
|
|
429
|
+
self.update_storage(file_info, is_delete=False)
|
|
430
|
+
# remove from failed files if present
|
|
431
|
+
if file_info.file_path in self.failed_files:
|
|
432
|
+
self.failed_files.remove(file_info.file_path)
|
|
433
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
434
|
+
else:
|
|
435
|
+
logger.warning(f"Empty result for file: {file_info.file_path}, treat as parse failed, skipping cache update")
|
|
436
|
+
self.failed_files.add(file_info.file_path)
|
|
437
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
438
|
+
except Exception as e:
|
|
439
|
+
logger.error(f"Error in process_queue: {e}")
|
|
440
|
+
self.failed_files.add(file_info.file_path)
|
|
441
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
476
442
|
self.write_cache()
|
|
477
443
|
|
|
478
444
|
elapsed = time.time() - start_time
|
|
@@ -486,6 +452,10 @@ class ByzerStorageCache(BaseCacheManager):
|
|
|
486
452
|
current_files = set()
|
|
487
453
|
for file_info in self.get_all_files():
|
|
488
454
|
current_files.add(file_info.file_path)
|
|
455
|
+
# skip failed files
|
|
456
|
+
if file_info.file_path in self.failed_files:
|
|
457
|
+
logger.info(f"文件 {file_info.file_path} 之前解析失败,跳过此次更新")
|
|
458
|
+
continue
|
|
489
459
|
if (
|
|
490
460
|
file_info.file_path not in self.cache
|
|
491
461
|
or self.cache[file_info.file_path].md5 != file_info.file_md5
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
import os
|
|
3
|
+
import json
|
|
4
|
+
from loguru import logger
|
|
5
|
+
|
|
6
|
+
def load_failed_files(failed_files_path: str) -> set:
|
|
7
|
+
"""
|
|
8
|
+
Load the set of failed file paths from a JSON file.
|
|
9
|
+
|
|
10
|
+
Args:
|
|
11
|
+
failed_files_path: Path to the JSON file storing failed files.
|
|
12
|
+
|
|
13
|
+
Returns:
|
|
14
|
+
A set of failed file paths.
|
|
15
|
+
"""
|
|
16
|
+
directory = os.path.dirname(failed_files_path)
|
|
17
|
+
if not os.path.exists(directory):
|
|
18
|
+
os.makedirs(directory, exist_ok=True)
|
|
19
|
+
if os.path.exists(failed_files_path):
|
|
20
|
+
try:
|
|
21
|
+
with open(failed_files_path, "r", encoding="utf-8") as f:
|
|
22
|
+
return set(json.load(f))
|
|
23
|
+
except Exception:
|
|
24
|
+
return set()
|
|
25
|
+
return set()
|
|
26
|
+
|
|
27
|
+
def save_failed_files(failed_files_path: str, failed_files: set) -> None:
|
|
28
|
+
"""
|
|
29
|
+
Save the set of failed file paths to a JSON file.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
failed_files_path: Path to the JSON file.
|
|
33
|
+
failed_files: A set of failed file paths.
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
with open(failed_files_path, "w", encoding="utf-8") as f:
|
|
37
|
+
json.dump(list(failed_files), f, ensure_ascii=False, indent=2)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.error(f"Error saving failed files list: {e}")
|
|
@@ -48,7 +48,7 @@ class AutoCoderRAGDocListener(BaseCacheManager):
|
|
|
48
48
|
r"^test.*$",
|
|
49
49
|
]
|
|
50
50
|
|
|
51
|
-
def __init__(self, path: str, ignore_spec, required_exts: List) -> None:
|
|
51
|
+
def __init__(self, path: str, ignore_spec, required_exts: List, args=None, llm=None) -> None:
|
|
52
52
|
"""
|
|
53
53
|
初始化文件监控缓存管理器。
|
|
54
54
|
|
|
@@ -89,6 +89,8 @@ class AutoCoderRAGDocListener(BaseCacheManager):
|
|
|
89
89
|
self.path = path
|
|
90
90
|
self.ignore_spec = ignore_spec
|
|
91
91
|
self.required_exts = required_exts
|
|
92
|
+
self.args = args
|
|
93
|
+
self.llm = llm
|
|
92
94
|
self.stop_event = threading.Event()
|
|
93
95
|
|
|
94
96
|
# connect list
|