auto-coder 0.1.346__tar.gz → 0.1.347__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.346 → auto_coder-0.1.347}/PKG-INFO +1 -1
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/SOURCES.txt +2 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/auto_coder_lang.py +8 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit.py +47 -4
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +2 -0
- auto_coder-0.1.347/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.347}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/byzer_storage_cache.py +44 -74
- auto_coder-0.1.347/src/autocoder/rag/cache/failed_files_utils.py +39 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/file_monitor_cache.py +3 -1
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/local_byzer_storage_cache.py +45 -73
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +43 -13
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/simple_cache.py +40 -12
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/document_retriever.py +17 -8
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/long_context_rag.py +2 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/qa_conversation_strategy.py +26 -23
- auto_coder-0.1.347/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.347}/LICENSE +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/README.md +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/setup.cfg +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/setup.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_runner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/model_speed_test.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/utils_code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_conversation.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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.347}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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.347}/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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.347}/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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.347}/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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.347}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/ignore_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/python_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/reactjs_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/vue_linter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_planner.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.346 → auto_coder-0.1.347}/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
|
|
@@ -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 changes",
|
|
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,
|
|
@@ -245,6 +249,7 @@ class AgenticEdit:
|
|
|
245
249
|
|
|
246
250
|
Always adhere to this format for the tool use to ensure proper parsing and execution.
|
|
247
251
|
|
|
252
|
+
|
|
248
253
|
# Tools
|
|
249
254
|
|
|
250
255
|
## execute_command
|
|
@@ -258,6 +263,15 @@ class AgenticEdit:
|
|
|
258
263
|
<requires_approval>true or false</requires_approval>
|
|
259
264
|
</execute_command>
|
|
260
265
|
|
|
266
|
+
## list_package_info
|
|
267
|
+
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).
|
|
268
|
+
Parameters:
|
|
269
|
+
- path: (required) The source code package directory path.
|
|
270
|
+
Usage:
|
|
271
|
+
<list_package_info>
|
|
272
|
+
<path>relative/or/absolute/package/path</path>
|
|
273
|
+
</list_package_info>
|
|
274
|
+
|
|
261
275
|
## read_file
|
|
262
276
|
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
277
|
Parameters:
|
|
@@ -670,7 +684,7 @@ class AgenticEdit:
|
|
|
670
684
|
|
|
671
685
|
{% if extra_docs %}
|
|
672
686
|
====
|
|
673
|
-
|
|
687
|
+
|
|
674
688
|
RULES PROVIDED BY USER
|
|
675
689
|
|
|
676
690
|
The following rules are provided by the user, and you must follow them strictly.
|
|
@@ -683,7 +697,8 @@ class AgenticEdit:
|
|
|
683
697
|
"""
|
|
684
698
|
import os
|
|
685
699
|
extra_docs = {}
|
|
686
|
-
rules_dir = os.path.join(self.args.source_dir,
|
|
700
|
+
rules_dir = os.path.join(self.args.source_dir,
|
|
701
|
+
".auto-coder", "autocoderrules")
|
|
687
702
|
if os.path.isdir(rules_dir):
|
|
688
703
|
for fname in os.listdir(rules_dir):
|
|
689
704
|
if fname.endswith(".md"):
|
|
@@ -1137,6 +1152,7 @@ class AgenticEdit:
|
|
|
1137
1152
|
standard event system format and writing them using the event manager.
|
|
1138
1153
|
"""
|
|
1139
1154
|
event_manager = get_event_manager(self.args.event_file)
|
|
1155
|
+
self.apply_pre_changes()
|
|
1140
1156
|
|
|
1141
1157
|
try:
|
|
1142
1158
|
event_stream = self.analyze(request)
|
|
@@ -1280,6 +1296,25 @@ class AgenticEdit:
|
|
|
1280
1296
|
# Re-raise the exception if needed, or handle appropriately
|
|
1281
1297
|
raise e
|
|
1282
1298
|
|
|
1299
|
+
def apply_pre_changes(self):
|
|
1300
|
+
# get the file name
|
|
1301
|
+
file_name = os.path.basename(self.args.file)
|
|
1302
|
+
if not self.args.skip_commit:
|
|
1303
|
+
try:
|
|
1304
|
+
get_event_manager(self.args.event_file).write_result(
|
|
1305
|
+
EventContentCreator.create_result(
|
|
1306
|
+
content=self.printer.get_message_from_key("/agent/edit/apply_pre_changes")), metadata=EventMetadata(
|
|
1307
|
+
action_file=self.args.file,
|
|
1308
|
+
is_streaming=False,
|
|
1309
|
+
path="/agent/edit/apply_pre_changes",
|
|
1310
|
+
stream_out_type="/agent/edit").to_dict())
|
|
1311
|
+
git_utils.commit_changes(
|
|
1312
|
+
self.args.source_dir, f"auto_coder_pre_{file_name}")
|
|
1313
|
+
except Exception as e:
|
|
1314
|
+
self.printer.print_in_terminal("git_init_required",
|
|
1315
|
+
source_dir=self.args.source_dir, error=str(e))
|
|
1316
|
+
return
|
|
1317
|
+
|
|
1283
1318
|
def apply_changes(self):
|
|
1284
1319
|
"""
|
|
1285
1320
|
Apply all tracked file changes to the original project directory.
|
|
@@ -1297,6 +1332,12 @@ class AgenticEdit:
|
|
|
1297
1332
|
f"{self.args.query}\nauto_coder_{file_name}",
|
|
1298
1333
|
)
|
|
1299
1334
|
|
|
1335
|
+
get_event_manager(self.args.event_file).write_result(
|
|
1336
|
+
EventContentCreator.create_result(
|
|
1337
|
+
content=self.printer.get_message_from_key("/agent/edit/apply_changes")), metadata=EventMetadata(
|
|
1338
|
+
action_file=self.args.file,
|
|
1339
|
+
is_streaming=False,
|
|
1340
|
+
stream_out_type="/agent/edit").to_dict())
|
|
1300
1341
|
action_yml_file_manager = ActionYmlFileManager(
|
|
1301
1342
|
self.args.source_dir)
|
|
1302
1343
|
action_file_name = os.path.basename(self.args.file)
|
|
@@ -1343,6 +1384,7 @@ class AgenticEdit:
|
|
|
1343
1384
|
f"[bold]{get_message('/agent/edit/user_query')}:[/bold]\n{request.user_input}", title=get_message("/agent/edit/objective"), border_style="blue"))
|
|
1344
1385
|
|
|
1345
1386
|
try:
|
|
1387
|
+
self.apply_pre_changes()
|
|
1346
1388
|
event_stream = self.analyze(request)
|
|
1347
1389
|
for event in event_stream:
|
|
1348
1390
|
if isinstance(event, LLMThinkingEvent):
|
|
@@ -1434,7 +1476,8 @@ class AgenticEdit:
|
|
|
1434
1476
|
logger.warning(
|
|
1435
1477
|
f"Error formatting tool result content: {e}")
|
|
1436
1478
|
panel_content.append(
|
|
1437
|
-
|
|
1479
|
+
# Fallback
|
|
1480
|
+
_format_content(str(result.content)))
|
|
1438
1481
|
|
|
1439
1482
|
# Print the base info panel
|
|
1440
1483
|
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.347}/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):
|
|
@@ -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
|
{auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/local_byzer_storage_cache.py
RENAMED
|
@@ -30,6 +30,7 @@ from typing import Union
|
|
|
30
30
|
from byzerllm import SimpleByzerLLM, ByzerLLM
|
|
31
31
|
from autocoder.rag.cache.cache_result_merge import CacheResultMerger, MergeStrategy
|
|
32
32
|
import time
|
|
33
|
+
from .failed_files_utils import save_failed_files, load_failed_files
|
|
33
34
|
|
|
34
35
|
if platform.system() != "Windows":
|
|
35
36
|
import fcntl
|
|
@@ -70,71 +71,17 @@ class LocalByzerStorageCache(BaseCacheManager):
|
|
|
70
71
|
emb_llm: Union[ByzerLLM, SimpleByzerLLM] = None,
|
|
71
72
|
host: str = "127.0.0.1",
|
|
72
73
|
port: int = 33333,
|
|
74
|
+
args=None,
|
|
75
|
+
llm=None,
|
|
73
76
|
):
|
|
74
77
|
"""
|
|
75
78
|
初始化基于 Byzer Storage 的 RAG 缓存管理器。
|
|
76
|
-
|
|
77
|
-
参数:
|
|
78
|
-
path: 需要索引的代码库根目录
|
|
79
|
-
ignore_spec: 指定哪些文件/目录应被忽略的规则
|
|
80
|
-
required_exts: 需要处理的文件扩展名列表
|
|
81
|
-
extra_params: 额外的配置参数,包含向量索引相关设置
|
|
82
|
-
emb_llm: 用于生成文本向量嵌入的 ByzerLLM 实例
|
|
83
|
-
host: Byzer Storage 服务的主机地址
|
|
84
|
-
port: Byzer Storage 服务的端口
|
|
85
|
-
|
|
86
|
-
缓存结构 (self.cache):
|
|
87
|
-
self.cache 是一个字典,键为文件路径,值为 CacheItem 对象:
|
|
88
|
-
{
|
|
89
|
-
"file_path1": CacheItem(
|
|
90
|
-
file_path: str, # 文件的绝对路径
|
|
91
|
-
relative_path: str, # 相对于项目根目录的路径
|
|
92
|
-
content: List[Dict], # 文件内容的结构化表示,每个元素是 SourceCode 对象的序列化
|
|
93
|
-
modify_time: float, # 文件最后修改时间的时间戳
|
|
94
|
-
md5: str # 文件内容的 MD5 哈希值,用于检测变更
|
|
95
|
-
),
|
|
96
|
-
"file_path2": CacheItem(...),
|
|
97
|
-
...
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
这个缓存有两层存储:
|
|
101
|
-
1. 本地文件缓存: 保存在项目根目录的 .cache/byzer_storage_speedup.jsonl 文件中
|
|
102
|
-
- 用于跟踪文件变更和快速加载
|
|
103
|
-
- 使用 JSONL 格式存储,每行是一个 CacheItem 的 JSON 表示
|
|
104
|
-
|
|
105
|
-
2. Byzer Storage 向量数据库:
|
|
106
|
-
- 存储文件内容的分块和向量嵌入
|
|
107
|
-
- 每个文件被分割成大小为 chunk_size 的文本块
|
|
108
|
-
- 每个块都会生成向量嵌入,用于语义搜索
|
|
109
|
-
- 存储结构包含: 文件路径、内容块、原始内容、向量嵌入、修改时间
|
|
110
|
-
|
|
111
|
-
源代码处理流程:
|
|
112
|
-
在缓存更新过程中使用了两个关键函数:
|
|
113
|
-
|
|
114
|
-
1. process_file_in_multi_process: 在多进程环境中处理文件
|
|
115
|
-
- 参数: file_info (文件信息元组)
|
|
116
|
-
- 返回值: List[SourceCode] 或 None
|
|
117
|
-
- 用途: 在初始构建缓存时并行处理多个文件
|
|
118
|
-
|
|
119
|
-
2. process_file_local: 在当前进程中处理单个文件
|
|
120
|
-
- 参数: file_path (文件路径)
|
|
121
|
-
- 返回值: List[SourceCode] 或 None
|
|
122
|
-
- 用途: 在检测到文件更新时处理单个文件
|
|
123
|
-
|
|
124
|
-
文件处理后,会:
|
|
125
|
-
1. 更新内存中的缓存 (self.cache)
|
|
126
|
-
2. 将缓存持久化到本地文件
|
|
127
|
-
3. 将内容分块并更新到 Byzer Storage 向量数据库
|
|
128
|
-
|
|
129
|
-
更新机制:
|
|
130
|
-
- 通过单独的线程异步处理文件变更
|
|
131
|
-
- 使用 MD5 哈希值检测文件是否发生变化
|
|
132
|
-
- 支持文件添加、更新和删除事件
|
|
133
|
-
- 使用向量数据库进行语义检索,支持相似度搜索
|
|
134
79
|
"""
|
|
135
80
|
self.path = path
|
|
136
81
|
self.ignore_spec = ignore_spec
|
|
137
82
|
self.required_exts = required_exts
|
|
83
|
+
self.args = args
|
|
84
|
+
self.llm = llm
|
|
138
85
|
self.rag_build_name = extra_params.rag_build_name
|
|
139
86
|
self.storage = LocalByzerStorage("byzerai_store",
|
|
140
87
|
"rag_test", self.rag_build_name, host=host, port=port,emb_llm=emb_llm)
|
|
@@ -153,16 +100,20 @@ class LocalByzerStorageCache(BaseCacheManager):
|
|
|
153
100
|
self.cache_dir, "byzer_storage_speedup.jsonl")
|
|
154
101
|
self.cache: Dict[str, CacheItem] = {}
|
|
155
102
|
|
|
103
|
+
# 创建缓存目录
|
|
104
|
+
if not os.path.exists(self.cache_dir):
|
|
105
|
+
os.makedirs(self.cache_dir)
|
|
106
|
+
|
|
107
|
+
# failed files support
|
|
108
|
+
self.failed_files_path = os.path.join(self.cache_dir, "failed_files.json")
|
|
109
|
+
self.failed_files = load_failed_files(self.failed_files_path)
|
|
110
|
+
|
|
156
111
|
self.lock = threading.Lock()
|
|
157
112
|
self.stop_event = threading.Event()
|
|
158
113
|
self.thread = threading.Thread(target=self.process_queue)
|
|
159
114
|
self.thread.daemon = True
|
|
160
115
|
self.thread.start()
|
|
161
116
|
|
|
162
|
-
# 创建缓存目录
|
|
163
|
-
if not os.path.exists(self.cache_dir):
|
|
164
|
-
os.makedirs(self.cache_dir)
|
|
165
|
-
|
|
166
117
|
# 加载缓存
|
|
167
118
|
self.cache = self._load_cache()
|
|
168
119
|
|
|
@@ -485,6 +436,10 @@ class LocalByzerStorageCache(BaseCacheManager):
|
|
|
485
436
|
for item in file_list.file_paths:
|
|
486
437
|
logger.info(f"[QUEUE PROCESSING] Processing file deletion: {item}")
|
|
487
438
|
del self.cache[item]
|
|
439
|
+
# remove from failed files if present
|
|
440
|
+
if item in self.failed_files:
|
|
441
|
+
self.failed_files.remove(item)
|
|
442
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
488
443
|
# Create a temporary FileInfo object
|
|
489
444
|
file_info = FileInfo(
|
|
490
445
|
file_path=item, relative_path="", modify_time=0, file_md5="")
|
|
@@ -495,17 +450,30 @@ class LocalByzerStorageCache(BaseCacheManager):
|
|
|
495
450
|
for file_info in file_list.file_infos:
|
|
496
451
|
logger.info(
|
|
497
452
|
f"[QUEUE PROCESSING] Processing file update: {file_info.file_path}")
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
453
|
+
try:
|
|
454
|
+
content = process_file_local(
|
|
455
|
+
self.fileinfo_to_tuple(file_info))
|
|
456
|
+
if content:
|
|
457
|
+
self.cache[file_info.file_path] = CacheItem(
|
|
458
|
+
file_path=file_info.file_path,
|
|
459
|
+
relative_path=file_info.relative_path,
|
|
460
|
+
content=[c.model_dump() for c in content],
|
|
461
|
+
modify_time=file_info.modify_time,
|
|
462
|
+
md5=file_info.file_md5,
|
|
463
|
+
)
|
|
464
|
+
self.update_storage(file_info, is_delete=False)
|
|
465
|
+
# remove from failed files if present
|
|
466
|
+
if file_info.file_path in self.failed_files:
|
|
467
|
+
self.failed_files.remove(file_info.file_path)
|
|
468
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
469
|
+
else:
|
|
470
|
+
logger.warning(f"Empty result for file: {file_info.file_path}, treat as parse failed, skipping cache update")
|
|
471
|
+
self.failed_files.add(file_info.file_path)
|
|
472
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
473
|
+
except Exception as e:
|
|
474
|
+
logger.error(f"Error in process_queue: {e}")
|
|
475
|
+
self.failed_files.add(file_info.file_path)
|
|
476
|
+
save_failed_files(self.failed_files_path, self.failed_files)
|
|
509
477
|
self.write_cache()
|
|
510
478
|
|
|
511
479
|
elapsed = time.time() - start_time
|
|
@@ -519,6 +487,10 @@ class LocalByzerStorageCache(BaseCacheManager):
|
|
|
519
487
|
current_files = set()
|
|
520
488
|
for file_info in self.get_all_files():
|
|
521
489
|
current_files.add(file_info.file_path)
|
|
490
|
+
# skip failed files
|
|
491
|
+
if file_info.file_path in self.failed_files:
|
|
492
|
+
logger.info(f"文件 {file_info.file_path} 之前解析失败,跳过此次更新")
|
|
493
|
+
continue
|
|
522
494
|
if (
|
|
523
495
|
file_info.file_path not in self.cache
|
|
524
496
|
or self.cache[file_info.file_path].md5 != file_info.file_md5
|