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.

Files changed (281) hide show
  1. {auto_coder-0.1.346 → auto_coder-0.1.347}/PKG-INFO +1 -1
  2. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/PKG-INFO +1 -1
  3. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/SOURCES.txt +2 -0
  4. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/auto_coder_lang.py +8 -0
  5. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit.py +47 -4
  6. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +2 -0
  7. auto_coder-0.1.347/src/autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +42 -0
  8. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
  9. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/byzer_storage_cache.py +44 -74
  10. auto_coder-0.1.347/src/autocoder/rag/cache/failed_files_utils.py +39 -0
  11. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/file_monitor_cache.py +3 -1
  12. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/local_byzer_storage_cache.py +45 -73
  13. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +43 -13
  14. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/simple_cache.py +40 -12
  15. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/document_retriever.py +17 -8
  16. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/long_context_rag.py +2 -0
  17. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/qa_conversation_strategy.py +26 -23
  18. auto_coder-0.1.347/src/autocoder/version.py +1 -0
  19. auto_coder-0.1.346/src/autocoder/version.py +0 -1
  20. {auto_coder-0.1.346 → auto_coder-0.1.347}/LICENSE +0 -0
  21. {auto_coder-0.1.346 → auto_coder-0.1.347}/README.md +0 -0
  22. {auto_coder-0.1.346 → auto_coder-0.1.347}/setup.cfg +0 -0
  23. {auto_coder-0.1.346 → auto_coder-0.1.347}/setup.py +0 -0
  24. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  25. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/entry_points.txt +0 -0
  26. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/requires.txt +0 -0
  27. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/auto_coder.egg-info/top_level.txt +0 -0
  28. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/__init__.py +0 -0
  29. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/__init__.py +0 -0
  30. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/agentic_filter.py +0 -0
  31. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  32. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_filegroup.py +0 -0
  33. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_guess_query.py +0 -0
  34. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  35. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_review_commit.py +0 -0
  36. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/auto_tool.py +0 -0
  37. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/coder.py +0 -0
  38. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/designer.py +0 -0
  39. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/planner.py +0 -0
  40. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/agent/project_reader.py +0 -0
  41. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder.py +0 -0
  42. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_rag.py +0 -0
  43. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_runner.py +0 -0
  44. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/auto_coder_server.py +0 -0
  45. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/benchmark.py +0 -0
  46. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat/__init__.py +0 -0
  47. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat_auto_coder.py +0 -0
  48. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/chat_auto_coder_lang.py +0 -0
  49. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/command_args.py +0 -0
  50. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/command_parser.py +0 -0
  51. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/__init__.py +0 -0
  52. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/auto_command.py +0 -0
  53. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/auto_web.py +0 -0
  54. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/commands/tools.py +0 -0
  55. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/JupyterClient.py +0 -0
  56. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/ShellClient.py +0 -0
  57. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/__init__.py +0 -0
  58. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/action_yml_file_manager.py +0 -0
  59. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/anything2images.py +0 -0
  60. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/anything2img.py +0 -0
  61. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/audio.py +0 -0
  62. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/auto_configure.py +0 -0
  63. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/buildin_tokenizer.py +0 -0
  64. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/chunk_validation.py +0 -0
  65. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/cleaner.py +0 -0
  66. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_execute.py +0 -0
  67. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate.py +0 -0
  68. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  69. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  70. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  71. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge.py +0 -0
  72. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  73. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  74. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  75. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/code_modification_ranker.py +0 -0
  76. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_completer.py +0 -0
  77. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_generator.py +0 -0
  78. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/command_templates.py +0 -0
  79. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/computer_use.py +0 -0
  80. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_import_export.py +0 -0
  81. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_utils.py +0 -0
  82. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conf_validator.py +0 -0
  83. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/const.py +0 -0
  84. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/context_pruner.py +0 -0
  85. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/conversation_pruner.py +0 -0
  86. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/files.py +0 -0
  87. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/git_utils.py +0 -0
  88. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/global_cancel.py +0 -0
  89. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/image_to_page.py +0 -0
  90. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/index_import_export.py +0 -0
  91. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/interpreter.py +0 -0
  92. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/llm_rerank.py +0 -0
  93. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_hub.py +0 -0
  94. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server.py +0 -0
  95. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server_install.py +0 -0
  96. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_server_types.py +0 -0
  97. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  98. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
  99. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  100. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/mcp_tools.py +0 -0
  101. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/memory_manager.py +0 -0
  102. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/model_speed_test.py +0 -0
  103. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/openai_content.py +0 -0
  104. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/printer.py +0 -0
  105. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/recall_validation.py +0 -0
  106. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/result_manager.py +0 -0
  107. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/screenshots.py +0 -0
  108. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/search.py +0 -0
  109. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/search_replace.py +0 -0
  110. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/shells.py +0 -0
  111. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/stats_panel.py +0 -0
  112. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/stream_out_type.py +0 -0
  113. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/sys_prompt.py +0 -0
  114. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/text.py +0 -0
  115. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/token_cost_caculate.py +0 -0
  116. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/types.py +0 -0
  117. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  118. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/__init__.py +0 -0
  119. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/__init__.py +0 -0
  120. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_conversation.py +0 -0
  121. {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
  122. {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
  123. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
  134. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/agent/ignore_utils.py +0 -0
  135. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
  136. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate.py +0 -0
  137. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
  138. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
  139. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
  140. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge.py +0 -0
  141. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
  142. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
  143. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
  144. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_diff_manager.py +0 -0
  145. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
  146. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_manager.py +0 -0
  147. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
  148. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/__init__.py +0 -0
  149. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/base_compiler.py +0 -0
  150. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_config_api.py +0 -0
  151. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_config_manager.py +0 -0
  152. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/compiler_factory.py +0 -0
  153. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/java_compiler.py +0 -0
  154. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/models.py +0 -0
  155. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/provided_compiler.py +0 -0
  156. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/python_compiler.py +0 -0
  157. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/reactjs_compiler.py +0 -0
  158. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/shadow_compiler.py +0 -0
  159. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/compilers/vue_compiler.py +0 -0
  160. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/data/byzerllm.md +0 -0
  161. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/data/tokenizer.json +0 -0
  162. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/db/__init__.py +0 -0
  163. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/db/store.py +0 -0
  164. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/__init__.py +0 -0
  165. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/__init__.py +0 -0
  166. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/action.py +0 -0
  167. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/copilot.py +0 -0
  168. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  169. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  170. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/__init__.py +0 -0
  171. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_content.py +0 -0
  172. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_manager.py +0 -0
  173. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_manager_singleton.py +0 -0
  174. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_store.py +0 -0
  175. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/events/event_types.py +0 -0
  176. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/helper/__init__.py +0 -0
  177. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/helper/project_creator.py +0 -0
  178. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/__init__.py +0 -0
  179. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/entry.py +0 -0
  180. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/__init__.py +0 -0
  181. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/normal_filter.py +0 -0
  182. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/filter/quick_filter.py +0 -0
  183. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/for_command.py +0 -0
  184. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/index.py +0 -0
  185. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/symbols_utils.py +0 -0
  186. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/index/types.py +0 -0
  187. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/lang.py +0 -0
  188. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/__init__.py +0 -0
  189. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/base_linter.py +0 -0
  190. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/linter_factory.py +0 -0
  191. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/models.py +0 -0
  192. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/python_linter.py +0 -0
  193. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/reactjs_linter.py +0 -0
  194. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/shadow_linter.py +0 -0
  195. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/linters/vue_linter.py +0 -0
  196. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/__init__.py +0 -0
  197. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/active_context_manager.py +0 -0
  198. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/active_package.py +0 -0
  199. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/async_processor.py +0 -0
  200. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/memory/directory_mapper.py +0 -0
  201. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/models.py +0 -0
  202. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/__init__.py +0 -0
  203. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
  204. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/git_helper_plugin.py +0 -0
  205. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/sample_plugin.py +0 -0
  206. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/token_helper_plugin.py +0 -0
  207. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/plugins/utils.py +0 -0
  208. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/privacy/__init__.py +0 -0
  209. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/privacy/model_filter.py +0 -0
  210. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/pyproject/__init__.py +0 -0
  211. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/__init__.py +0 -0
  212. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/api_server.py +0 -0
  213. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/__init__.py +0 -0
  214. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/base_cache.py +0 -0
  215. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
  216. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
  217. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/conversation_to_queries.py +0 -0
  218. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/doc_filter.py +0 -0
  219. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/lang.py +0 -0
  220. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/llm_wrapper.py +0 -0
  221. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/__init__.py +0 -0
  222. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  223. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  224. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  225. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  226. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/rag_config.py +0 -0
  227. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/rag_entry.py +0 -0
  228. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/raw_rag.py +0 -0
  229. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/relevant_utils.py +0 -0
  230. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/searchable.py +0 -0
  231. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/simple_directory_reader.py +0 -0
  232. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/simple_rag.py +0 -0
  233. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/__init__.py +0 -0
  234. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  235. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/stream_event/types.py +0 -0
  236. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_checker.py +0 -0
  237. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_counter.py +0 -0
  238. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_limiter.py +0 -0
  239. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/token_limiter_utils.py +0 -0
  240. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/types.py +0 -0
  241. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/utils.py +0 -0
  242. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/rag/variable_holder.py +0 -0
  243. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/regexproject/__init__.py +0 -0
  244. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/run_context.py +0 -0
  245. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/shadows/__init__.py +0 -0
  246. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/shadows/shadow_manager.py +0 -0
  247. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/suffixproject/__init__.py +0 -0
  248. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/tsproject/__init__.py +0 -0
  249. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/__init__.py +0 -0
  250. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/_markitdown.py +0 -0
  251. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  252. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  253. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/auto_project_type.py +0 -0
  254. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  255. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/conversation_store.py +0 -0
  256. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  257. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/llms.py +0 -0
  258. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/log_capture.py +0 -0
  259. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/model_provider_selector.py +0 -0
  260. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/multi_turn.py +0 -0
  261. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/operate_config_api.py +0 -0
  262. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/print_table.py +0 -0
  263. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/project_structure.py +0 -0
  264. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/queue_communicate.py +0 -0
  265. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/request_event_queue.py +0 -0
  266. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/request_queue.py +0 -0
  267. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/rest.py +0 -0
  268. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/stream_thinking.py +0 -0
  269. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/tests.py +0 -0
  270. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/thread_utils.py +0 -0
  271. {auto_coder-0.1.346 → auto_coder-0.1.347}/src/autocoder/utils/types.py +0 -0
  272. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_action_regex_project.py +0 -0
  273. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_action_yml_file_manager.py +0 -0
  274. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_chat_auto_coder.py +0 -0
  275. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_code_auto_merge_editblock.py +0 -0
  276. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_command_completer.py +0 -0
  277. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_planner.py +0 -0
  278. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_plugins.py +0 -0
  279. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_privacy.py +0 -0
  280. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_queue_communicate.py +0 -0
  281. {auto_coder-0.1.346 → auto_coder-0.1.347}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.346
3
+ Version: 0.1.347
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.346
3
+ Version: 0.1.347
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -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,".auto-coder", "autocoderrules")
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
- _format_content(str(result.content))) # Fallback
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}")
@@ -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
- # Process file and create CacheItem
467
- content = process_file_local(self.fileinfo_to_tuple(file_info))
468
- self.cache[file_info.file_path] = CacheItem(
469
- file_path=file_info.file_path,
470
- relative_path=file_info.relative_path,
471
- content=[c.model_dump() for c in content],
472
- modify_time=file_info.modify_time,
473
- md5=file_info.file_md5,
474
- )
475
- self.update_storage(file_info, is_delete=False)
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
@@ -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
- # Process file and create CacheItem
499
- content = process_file_local(
500
- self.fileinfo_to_tuple(file_info))
501
- self.cache[file_info.file_path] = CacheItem(
502
- file_path=file_info.file_path,
503
- relative_path=file_info.relative_path,
504
- content=[c.model_dump() for c in content],
505
- modify_time=file_info.modify_time,
506
- md5=file_info.file_md5,
507
- )
508
- self.update_storage(file_info, is_delete=False)
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