auto-coder 0.1.316__tar.gz → 0.1.318__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 (243) hide show
  1. {auto_coder-0.1.316 → auto_coder-0.1.318}/PKG-INFO +2 -2
  2. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/SOURCES.txt +21 -1
  4. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/auto_coder_runner.py +1 -2
  6. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/__init__.py +3 -0
  7. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/auto_coder_lang.py +24 -0
  8. auto_coder-0.1.318/src/autocoder/common/code_auto_merge_editblock.py +481 -0
  9. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/git_utils.py +2 -2
  10. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/token_cost_caculate.py +103 -42
  11. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_generate.py +199 -0
  12. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_generate_diff.py +361 -0
  13. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_generate_editblock.py +380 -0
  14. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_generate_strict_diff.py +269 -0
  15. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_merge.py +211 -0
  16. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_merge_diff.py +354 -0
  17. {auto_coder-0.1.316/src/autocoder/common → auto_coder-0.1.318/src/autocoder/common/v2}/code_auto_merge_editblock.py +27 -25
  18. auto_coder-0.1.318/src/autocoder/common/v2/code_auto_merge_strict_diff.py +259 -0
  19. auto_coder-0.1.318/src/autocoder/common/v2/code_diff_manager.py +266 -0
  20. auto_coder-0.1.318/src/autocoder/common/v2/code_editblock_manager.py +282 -0
  21. auto_coder-0.1.318/src/autocoder/common/v2/code_manager.py +238 -0
  22. auto_coder-0.1.318/src/autocoder/common/v2/code_strict_diff_manager.py +241 -0
  23. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/dispacher/actions/action.py +16 -0
  24. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +6 -0
  25. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/event_manager_singleton.py +2 -2
  26. auto_coder-0.1.318/src/autocoder/helper/project_creator.py +570 -0
  27. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/linters/linter_factory.py +44 -25
  28. auto_coder-0.1.318/src/autocoder/linters/models.py +220 -0
  29. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/linters/python_linter.py +1 -7
  30. auto_coder-0.1.316/src/autocoder/linters/code_linter.py → auto_coder-0.1.318/src/autocoder/linters/reactjs_linter.py +223 -231
  31. auto_coder-0.1.318/src/autocoder/linters/shadow_linter.py +390 -0
  32. auto_coder-0.1.318/src/autocoder/linters/vue_linter.py +576 -0
  33. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/memory/active_context_manager.py +0 -4
  34. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/memory/active_package.py +12 -12
  35. auto_coder-0.1.318/src/autocoder/shadows/shadow_manager.py +235 -0
  36. auto_coder-0.1.318/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  37. auto_coder-0.1.318/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  38. auto_coder-0.1.318/src/autocoder/utils/types.py +0 -0
  39. auto_coder-0.1.318/src/autocoder/version.py +1 -0
  40. auto_coder-0.1.316/src/autocoder/version.py +0 -1
  41. {auto_coder-0.1.316 → auto_coder-0.1.318}/LICENSE +0 -0
  42. {auto_coder-0.1.316 → auto_coder-0.1.318}/README.md +0 -0
  43. {auto_coder-0.1.316 → auto_coder-0.1.318}/setup.cfg +0 -0
  44. {auto_coder-0.1.316 → auto_coder-0.1.318}/setup.py +0 -0
  45. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  46. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/entry_points.txt +0 -0
  47. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/auto_coder.egg-info/top_level.txt +0 -0
  48. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/__init__.py +0 -0
  49. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/__init__.py +0 -0
  50. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  51. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_filegroup.py +0 -0
  52. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_guess_query.py +0 -0
  53. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  54. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_review_commit.py +0 -0
  55. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/auto_tool.py +0 -0
  56. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/coder.py +0 -0
  57. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/designer.py +0 -0
  58. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/planner.py +0 -0
  59. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/agent/project_reader.py +0 -0
  60. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/auto_coder.py +0 -0
  61. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/auto_coder_rag.py +0 -0
  62. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/auto_coder_server.py +0 -0
  63. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/benchmark.py +0 -0
  64. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/chat/__init__.py +0 -0
  65. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/chat_auto_coder.py +0 -0
  66. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/chat_auto_coder_lang.py +0 -0
  67. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/command_args.py +0 -0
  68. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/command_parser.py +0 -0
  69. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/commands/__init__.py +0 -0
  70. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/commands/auto_command.py +0 -0
  71. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/commands/auto_web.py +0 -0
  72. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/commands/tools.py +0 -0
  73. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/JupyterClient.py +0 -0
  74. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/ShellClient.py +0 -0
  75. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/action_yml_file_manager.py +0 -0
  76. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/anything2images.py +0 -0
  77. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/anything2img.py +0 -0
  78. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/audio.py +0 -0
  79. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/auto_configure.py +0 -0
  80. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/buildin_tokenizer.py +0 -0
  81. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/chunk_validation.py +0 -0
  82. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/cleaner.py +0 -0
  83. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_execute.py +0 -0
  84. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_generate.py +0 -0
  85. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  86. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  87. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  88. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_merge.py +0 -0
  89. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  90. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  91. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/code_modification_ranker.py +0 -0
  92. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/command_completer.py +0 -0
  93. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/command_generator.py +0 -0
  94. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/command_templates.py +0 -0
  95. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/computer_use.py +0 -0
  96. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/conf_import_export.py +0 -0
  97. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/conf_validator.py +0 -0
  98. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/const.py +0 -0
  99. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/context_pruner.py +0 -0
  100. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/conversation_pruner.py +0 -0
  101. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/files.py +0 -0
  102. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/global_cancel.py +0 -0
  103. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/image_to_page.py +0 -0
  104. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/index_import_export.py +0 -0
  105. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/interpreter.py +0 -0
  106. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/llm_rerank.py +0 -0
  107. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_hub.py +0 -0
  108. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_server.py +0 -0
  109. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  110. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
  111. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  112. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/mcp_tools.py +0 -0
  113. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/memory_manager.py +0 -0
  114. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/model_speed_test.py +0 -0
  115. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/openai_content.py +0 -0
  116. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/printer.py +0 -0
  117. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/recall_validation.py +0 -0
  118. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/result_manager.py +0 -0
  119. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/screenshots.py +0 -0
  120. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/search.py +0 -0
  121. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/search_replace.py +0 -0
  122. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/shells.py +0 -0
  123. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/stats_panel.py +0 -0
  124. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/stream_out_type.py +0 -0
  125. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/sys_prompt.py +0 -0
  126. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/text.py +0 -0
  127. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/types.py +0 -0
  128. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  129. {auto_coder-0.1.316/src/autocoder/db → auto_coder-0.1.318/src/autocoder/common/v2}/__init__.py +0 -0
  130. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/data/byzerllm.md +0 -0
  131. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/data/tokenizer.json +0 -0
  132. {auto_coder-0.1.316/src/autocoder/dispacher/actions → auto_coder-0.1.318/src/autocoder/db}/__init__.py +0 -0
  133. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/db/store.py +0 -0
  134. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/dispacher/__init__.py +0 -0
  135. {auto_coder-0.1.316/src/autocoder/dispacher/actions/plugins → auto_coder-0.1.318/src/autocoder/dispacher/actions}/__init__.py +0 -0
  136. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/dispacher/actions/copilot.py +0 -0
  137. {auto_coder-0.1.316/src/autocoder/index → auto_coder-0.1.318/src/autocoder/dispacher/actions/plugins}/__init__.py +0 -0
  138. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/__init__.py +0 -0
  139. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/event_content.py +0 -0
  140. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/event_manager.py +0 -0
  141. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/event_store.py +0 -0
  142. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/events/event_types.py +0 -0
  143. {auto_coder-0.1.316/src/autocoder/index/filter → auto_coder-0.1.318/src/autocoder/helper}/__init__.py +0 -0
  144. {auto_coder-0.1.316/src/autocoder/linters → auto_coder-0.1.318/src/autocoder/index}/__init__.py +0 -0
  145. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/entry.py +0 -0
  146. {auto_coder-0.1.316/src/autocoder/rag → auto_coder-0.1.318/src/autocoder/index/filter}/__init__.py +0 -0
  147. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/filter/normal_filter.py +0 -0
  148. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/filter/quick_filter.py +0 -0
  149. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/for_command.py +0 -0
  150. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/index.py +0 -0
  151. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/symbols_utils.py +0 -0
  152. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/index/types.py +0 -0
  153. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/lang.py +0 -0
  154. {auto_coder-0.1.316/src/autocoder/rag/cache → auto_coder-0.1.318/src/autocoder/linters}/__init__.py +0 -0
  155. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/linters/base_linter.py +0 -0
  156. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/memory/__init__.py +0 -0
  157. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/memory/async_processor.py +0 -0
  158. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/memory/directory_mapper.py +0 -0
  159. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/models.py +0 -0
  160. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/__init__.py +0 -0
  161. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
  162. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/git_helper_plugin.py +0 -0
  163. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/sample_plugin.py +0 -0
  164. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/token_helper_plugin.py +0 -0
  165. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/plugins/utils.py +0 -0
  166. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/privacy/__init__.py +0 -0
  167. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/privacy/model_filter.py +0 -0
  168. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/pyproject/__init__.py +0 -0
  169. {auto_coder-0.1.316/src/autocoder/rag/stream_event → auto_coder-0.1.318/src/autocoder/rag}/__init__.py +0 -0
  170. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/api_server.py +0 -0
  171. {auto_coder-0.1.316/src/autocoder/utils/auto_coder_utils → auto_coder-0.1.318/src/autocoder/rag/cache}/__init__.py +0 -0
  172. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/base_cache.py +0 -0
  173. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  174. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
  175. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  176. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
  177. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
  178. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
  179. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/cache/simple_cache.py +0 -0
  180. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/conversation_to_queries.py +0 -0
  181. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/doc_filter.py +0 -0
  182. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/document_retriever.py +0 -0
  183. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/lang.py +0 -0
  184. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/llm_wrapper.py +0 -0
  185. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/loaders/__init__.py +0 -0
  186. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  187. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  188. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  189. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  190. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/long_context_rag.py +0 -0
  191. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
  192. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/rag_config.py +0 -0
  193. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/rag_entry.py +0 -0
  194. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/raw_rag.py +0 -0
  195. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/relevant_utils.py +0 -0
  196. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/searchable.py +0 -0
  197. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/simple_directory_reader.py +0 -0
  198. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/simple_rag.py +0 -0
  199. {auto_coder-0.1.316/src/autocoder/utils/chat_auto_coder_utils → auto_coder-0.1.318/src/autocoder/rag/stream_event}/__init__.py +0 -0
  200. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  201. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/stream_event/types.py +0 -0
  202. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/token_checker.py +0 -0
  203. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/token_counter.py +0 -0
  204. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/token_limiter.py +0 -0
  205. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/token_limiter_utils.py +0 -0
  206. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/types.py +0 -0
  207. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/utils.py +0 -0
  208. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/rag/variable_holder.py +0 -0
  209. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/regexproject/__init__.py +0 -0
  210. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/run_context.py +0 -0
  211. /auto_coder-0.1.316/src/autocoder/utils/types.py → /auto_coder-0.1.318/src/autocoder/shadows/__init__.py +0 -0
  212. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/suffixproject/__init__.py +0 -0
  213. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/tsproject/__init__.py +0 -0
  214. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/__init__.py +0 -0
  215. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/_markitdown.py +0 -0
  216. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  217. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/auto_project_type.py +0 -0
  218. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/conversation_store.py +0 -0
  219. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  220. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/llms.py +0 -0
  221. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/log_capture.py +0 -0
  222. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/model_provider_selector.py +0 -0
  223. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/multi_turn.py +0 -0
  224. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/operate_config_api.py +0 -0
  225. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/print_table.py +0 -0
  226. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/project_structure.py +0 -0
  227. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/queue_communicate.py +0 -0
  228. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/request_event_queue.py +0 -0
  229. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/request_queue.py +0 -0
  230. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/rest.py +0 -0
  231. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/stream_thinking.py +0 -0
  232. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/tests.py +0 -0
  233. {auto_coder-0.1.316 → auto_coder-0.1.318}/src/autocoder/utils/thread_utils.py +0 -0
  234. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_action_regex_project.py +0 -0
  235. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_action_yml_file_manager.py +0 -0
  236. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_chat_auto_coder.py +0 -0
  237. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_code_auto_merge_editblock.py +0 -0
  238. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_command_completer.py +0 -0
  239. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_planner.py +0 -0
  240. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_plugins.py +0 -0
  241. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_privacy.py +0 -0
  242. {auto_coder-0.1.316 → auto_coder-0.1.318}/tests/test_queue_communicate.py +0 -0
  243. {auto_coder-0.1.316 → auto_coder-0.1.318}/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.316
3
+ Version: 0.1.318
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -28,7 +28,7 @@ Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
29
  Requires-Dist: aiofiles
30
30
  Requires-Dist: readerwriterlock
31
- Requires-Dist: byzerllm[saas]>=0.1.178
31
+ Requires-Dist: byzerllm[saas]>=0.1.179
32
32
  Requires-Dist: patch
33
33
  Requires-Dist: diff_match_patch
34
34
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.316
3
+ Version: 0.1.318
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -28,7 +28,7 @@ Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
29
  Requires-Dist: aiofiles
30
30
  Requires-Dist: readerwriterlock
31
- Requires-Dist: byzerllm[saas]>=0.1.178
31
+ Requires-Dist: byzerllm[saas]>=0.1.179
32
32
  Requires-Dist: patch
33
33
  Requires-Dist: diff_match_patch
34
34
  Requires-Dist: GitPython
@@ -98,6 +98,19 @@ src/autocoder/common/utils_code_auto_generate.py
98
98
  src/autocoder/common/mcp_servers/__init__.py
99
99
  src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py
100
100
  src/autocoder/common/mcp_servers/mcp_server_perplexity.py
101
+ src/autocoder/common/v2/__init__.py
102
+ src/autocoder/common/v2/code_auto_generate.py
103
+ src/autocoder/common/v2/code_auto_generate_diff.py
104
+ src/autocoder/common/v2/code_auto_generate_editblock.py
105
+ src/autocoder/common/v2/code_auto_generate_strict_diff.py
106
+ src/autocoder/common/v2/code_auto_merge.py
107
+ src/autocoder/common/v2/code_auto_merge_diff.py
108
+ src/autocoder/common/v2/code_auto_merge_editblock.py
109
+ src/autocoder/common/v2/code_auto_merge_strict_diff.py
110
+ src/autocoder/common/v2/code_diff_manager.py
111
+ src/autocoder/common/v2/code_editblock_manager.py
112
+ src/autocoder/common/v2/code_manager.py
113
+ src/autocoder/common/v2/code_strict_diff_manager.py
101
114
  src/autocoder/data/byzerllm.md
102
115
  src/autocoder/data/tokenizer.json
103
116
  src/autocoder/db/__init__.py
@@ -114,6 +127,8 @@ src/autocoder/events/event_manager.py
114
127
  src/autocoder/events/event_manager_singleton.py
115
128
  src/autocoder/events/event_store.py
116
129
  src/autocoder/events/event_types.py
130
+ src/autocoder/helper/__init__.py
131
+ src/autocoder/helper/project_creator.py
117
132
  src/autocoder/index/__init__.py
118
133
  src/autocoder/index/entry.py
119
134
  src/autocoder/index/for_command.py
@@ -125,9 +140,12 @@ src/autocoder/index/filter/normal_filter.py
125
140
  src/autocoder/index/filter/quick_filter.py
126
141
  src/autocoder/linters/__init__.py
127
142
  src/autocoder/linters/base_linter.py
128
- src/autocoder/linters/code_linter.py
129
143
  src/autocoder/linters/linter_factory.py
144
+ src/autocoder/linters/models.py
130
145
  src/autocoder/linters/python_linter.py
146
+ src/autocoder/linters/reactjs_linter.py
147
+ src/autocoder/linters/shadow_linter.py
148
+ src/autocoder/linters/vue_linter.py
131
149
  src/autocoder/memory/__init__.py
132
150
  src/autocoder/memory/active_context_manager.py
133
151
  src/autocoder/memory/active_package.py
@@ -183,6 +201,8 @@ src/autocoder/rag/stream_event/__init__.py
183
201
  src/autocoder/rag/stream_event/event_writer.py
184
202
  src/autocoder/rag/stream_event/types.py
185
203
  src/autocoder/regexproject/__init__.py
204
+ src/autocoder/shadows/__init__.py
205
+ src/autocoder/shadows/shadow_manager.py
186
206
  src/autocoder/suffixproject/__init__.py
187
207
  src/autocoder/tsproject/__init__.py
188
208
  src/autocoder/utils/__init__.py
@@ -18,7 +18,7 @@ prompt-toolkit
18
18
  tokenizers
19
19
  aiofiles
20
20
  readerwriterlock
21
- byzerllm[saas]>=0.1.178
21
+ byzerllm[saas]>=0.1.179
22
22
  patch
23
23
  diff_match_patch
24
24
  GitPython
@@ -1438,8 +1438,7 @@ def commit(query: str):
1438
1438
 
1439
1439
  action_yml_file_manager = ActionYmlFileManager(args.source_dir)
1440
1440
  action_file_name = os.path.basename(args.file)
1441
- add_updated_urls = []
1442
- commit_result.changed_files
1441
+ add_updated_urls = []
1443
1442
  for file in commit_result.changed_files:
1444
1443
  add_updated_urls.append(os.path.join(args.source_dir, file))
1445
1444
 
@@ -418,6 +418,9 @@ class AutoCoderArgs(pydantic.BaseModel):
418
418
 
419
419
  revert_commit_id: Optional[str] = None
420
420
 
421
+ enable_auto_fix_lint: Optional[bool] = False
422
+ auto_fix_lint_max_attempts: Optional[int] = 5
423
+
421
424
  class Config:
422
425
  protected_namespaces = ()
423
426
 
@@ -733,6 +733,30 @@ MESSAGES = {
733
733
  "code_generate_title": {
734
734
  "en": "{{model_name}} is generating code",
735
735
  "zh": "{{model_name}}正在生成代码"
736
+ },
737
+ "generating_initial_code": {
738
+ "en": "Generating initial code...",
739
+ "zh": "正在生成初始代码..."
740
+ },
741
+ "generation_failed": {
742
+ "en": "Code generation failed",
743
+ "zh": "代码生成失败"
744
+ },
745
+ "no_files_to_lint": {
746
+ "en": "No files to lint",
747
+ "zh": "没有需要检查的文件"
748
+ },
749
+ "no_lint_errors_found": {
750
+ "en": "No lint errors found",
751
+ "zh": "未发现代码质量问题"
752
+ },
753
+ "lint_attempt_status": {
754
+ "en": "Lint attempt {{attempt}}/{{max_correction_attempts}}: {{error_count}} errors found. {{ formatted_issues }}",
755
+ "zh": "代码质量检查尝试 {{attempt}}/{{max_correction_attempts}}: 发现 {{error_count}} 个错误. {{ formatted_issues }}"
756
+ },
757
+ "max_attempts_reached": {
758
+ "en": "Maximum correction attempts reached",
759
+ "zh": "已达到最大修复尝试次数"
736
760
  }
737
761
  }
738
762
 
@@ -0,0 +1,481 @@
1
+ import os
2
+ from byzerllm.utils.client import code_utils
3
+ from autocoder.common import AutoCoderArgs, git_utils
4
+ from autocoder.common.action_yml_file_manager import ActionYmlFileManager
5
+ from autocoder.common.text import TextSimilarity
6
+ from autocoder.memory.active_context_manager import ActiveContextManager
7
+ from autocoder.utils.queue_communicate import (
8
+ queue_communicate,
9
+ CommunicateEvent,
10
+ CommunicateEventType,
11
+ )
12
+ import pydantic
13
+ import byzerllm
14
+
15
+ import hashlib
16
+ import subprocess
17
+ import tempfile
18
+ from rich.console import Console
19
+ from rich.panel import Panel
20
+ from rich.syntax import Syntax
21
+ import json
22
+ from typing import Union, List, Tuple
23
+ from autocoder.common.types import CodeGenerateResult, MergeCodeWithoutEffect
24
+ from autocoder.common.code_modification_ranker import CodeModificationRanker
25
+ from autocoder.common import files as FileUtils
26
+ from autocoder.common.printer import Printer
27
+
28
+ class PathAndCode(pydantic.BaseModel):
29
+ path: str
30
+ content: str
31
+
32
+
33
+ class CodeAutoMergeEditBlock:
34
+ def __init__(
35
+ self,
36
+ llm: byzerllm.ByzerLLM,
37
+ args: AutoCoderArgs,
38
+ fence_0: str = "```",
39
+ fence_1: str = "```",
40
+ ):
41
+ self.llm = llm
42
+ self.args = args
43
+ self.fence_0 = fence_0
44
+ self.fence_1 = fence_1
45
+ self.printer = Printer()
46
+
47
+ def parse_whole_text(self, text: str) -> List[PathAndCode]:
48
+ '''
49
+ 从文本中抽取如下格式代码(two_line_mode):
50
+
51
+ ```python
52
+ ##File: /project/path/src/autocoder/index/index.py
53
+ <<<<<<< SEARCH
54
+ =======
55
+ >>>>>>> REPLACE
56
+ ```
57
+
58
+ 或者 (one_line_mode)
59
+
60
+ ```python:/project/path/src/autocoder/index/index.py
61
+ <<<<<<< SEARCH
62
+ =======
63
+ >>>>>>> REPLACE
64
+ ```
65
+
66
+ '''
67
+ HEAD = "<<<<<<< SEARCH"
68
+ DIVIDER = "======="
69
+ UPDATED = ">>>>>>> REPLACE"
70
+ lines = text.split("\n")
71
+ lines_len = len(lines)
72
+ start_marker_count = 0
73
+ block = []
74
+ path_and_code_list = []
75
+ # two_line_mode or one_line_mode
76
+ current_editblock_mode = "two_line_mode"
77
+ current_editblock_path = None
78
+
79
+ def guard(index):
80
+ return index + 1 < lines_len
81
+
82
+ def start_marker(line, index):
83
+ nonlocal current_editblock_mode
84
+ nonlocal current_editblock_path
85
+ if (
86
+ line.startswith(self.fence_0)
87
+ and guard(index)
88
+ and ":" in line
89
+ and lines[index + 1].startswith(HEAD)
90
+ ):
91
+
92
+ current_editblock_mode = "one_line_mode"
93
+ current_editblock_path = line.split(":", 1)[1].strip()
94
+ return True
95
+
96
+ if (
97
+ line.startswith(self.fence_0)
98
+ and guard(index)
99
+ and lines[index + 1].startswith("##File:")
100
+ ):
101
+ current_editblock_mode = "two_line_mode"
102
+ current_editblock_path = None
103
+ return True
104
+
105
+ return False
106
+
107
+ def end_marker(line, index):
108
+ return line.startswith(self.fence_1) and UPDATED in lines[index - 1]
109
+
110
+ for index, line in enumerate(lines):
111
+ if start_marker(line, index) and start_marker_count == 0:
112
+ start_marker_count += 1
113
+ elif end_marker(line, index) and start_marker_count == 1:
114
+ start_marker_count -= 1
115
+ if block:
116
+ if current_editblock_mode == "two_line_mode":
117
+ path = block[0].split(":", 1)[1].strip()
118
+ content = "\n".join(block[1:])
119
+ else:
120
+ path = current_editblock_path
121
+ content = "\n".join(block)
122
+ block = []
123
+ path_and_code_list.append(
124
+ PathAndCode(path=path, content=content))
125
+ elif start_marker_count > 0:
126
+ block.append(line)
127
+
128
+ return path_and_code_list
129
+
130
+ def merge_code(self, generate_result: CodeGenerateResult, force_skip_git: bool = False):
131
+ result = self.choose_best_choice(generate_result)
132
+ self._merge_code(result.contents[0], force_skip_git)
133
+ return result
134
+
135
+ def choose_best_choice(self, generate_result: CodeGenerateResult) -> CodeGenerateResult:
136
+ if len(generate_result.contents) == 1:
137
+ return generate_result
138
+
139
+ merge_results = []
140
+ for content,conversations in zip(generate_result.contents,generate_result.conversations):
141
+ merge_result = self._merge_code_without_effect(content)
142
+ merge_results.append(merge_result)
143
+
144
+ # If all merge results are None, return first one
145
+ if all(len(result.failed_blocks) != 0 for result in merge_results):
146
+ self.printer.print_in_terminal("all_merge_results_failed")
147
+ return CodeGenerateResult(contents=[generate_result.contents[0]], conversations=[generate_result.conversations[0]])
148
+
149
+ # If only one merge result is not None, return that one
150
+ not_none_indices = [i for i, result in enumerate(merge_results) if len(result.failed_blocks) == 0]
151
+ if len(not_none_indices) == 1:
152
+ idx = not_none_indices[0]
153
+ self.printer.print_in_terminal("only_one_merge_result_success")
154
+ return CodeGenerateResult(contents=[generate_result.contents[idx]], conversations=[generate_result.conversations[idx]])
155
+
156
+ # 最后,如果有多个,那么根据质量排序再返回
157
+ ranker = CodeModificationRanker(self.llm, self.args)
158
+ ranked_result = ranker.rank_modifications(generate_result,merge_results)
159
+
160
+ ## 得到的结果,再做一次合并,第一个通过的返回 , 返回做合并有点重复低效,未来修改。
161
+ for content,conversations in zip(ranked_result.contents,ranked_result.conversations):
162
+ merge_result = self._merge_code_without_effect(content)
163
+ if not merge_result.failed_blocks:
164
+ return CodeGenerateResult(contents=[content], conversations=[conversations])
165
+
166
+ # 最后保底,但实际不会出现
167
+ return CodeGenerateResult(contents=[ranked_result.contents[0]], conversations=[ranked_result.conversations[0]])
168
+
169
+ @byzerllm.prompt()
170
+ def git_require_msg(self, source_dir: str, error: str) -> str:
171
+ """
172
+ auto_merge only works for git repositories.
173
+
174
+ Try to use git init in the source directory.
175
+
176
+ ```shell
177
+ cd {{ source_dir }}
178
+ git init .
179
+ ```
180
+
181
+ Then try to run auto-coder again.
182
+ Error: {{ error }}
183
+ """
184
+
185
+ def get_edits(self, content: str):
186
+ edits = self.parse_whole_text(content)
187
+ HEAD = "<<<<<<< SEARCH"
188
+ DIVIDER = "======="
189
+ UPDATED = ">>>>>>> REPLACE"
190
+ result = []
191
+ for edit in edits:
192
+ heads = []
193
+ updates = []
194
+ c = edit.content
195
+ in_head = False
196
+ in_updated = False
197
+ for line in c.splitlines():
198
+ if line.strip() == HEAD:
199
+ in_head = True
200
+ continue
201
+ if line.strip() == DIVIDER:
202
+ in_head = False
203
+ in_updated = True
204
+ continue
205
+ if line.strip() == UPDATED:
206
+ in_head = False
207
+ in_updated = False
208
+ continue
209
+ if in_head:
210
+ heads.append(line)
211
+ if in_updated:
212
+ updates.append(line)
213
+ result.append((edit.path, "\n".join(heads), "\n".join(updates)))
214
+ return result
215
+
216
+ def _merge_code_without_effect(self, content: str) -> MergeCodeWithoutEffect:
217
+ """Merge code without any side effects like git operations, linting or file writing.
218
+ Returns a tuple of:
219
+ - list of (file_path, new_content) tuples for successfully merged blocks
220
+ - list of (file_path, head, update) tuples for failed to merge blocks"""
221
+ codes = self.get_edits(content)
222
+ file_content_mapping = {}
223
+ failed_blocks = []
224
+
225
+ for block in codes:
226
+ file_path, head, update = block
227
+ if not os.path.exists(file_path):
228
+ file_content_mapping[file_path] = update
229
+ else:
230
+ if file_path not in file_content_mapping:
231
+ file_content_mapping[file_path] = FileUtils.read_file(file_path)
232
+ existing_content = file_content_mapping[file_path]
233
+
234
+ # First try exact match
235
+ new_content = (
236
+ existing_content.replace(head, update, 1)
237
+ if head
238
+ else existing_content + "\n" + update
239
+ )
240
+
241
+ # If exact match fails, try similarity match
242
+ if new_content == existing_content and head:
243
+ similarity, best_window = TextSimilarity(
244
+ head, existing_content
245
+ ).get_best_matching_window()
246
+ if similarity > self.args.editblock_similarity:
247
+ new_content = existing_content.replace(
248
+ best_window, update, 1
249
+ )
250
+
251
+ if new_content != existing_content:
252
+ file_content_mapping[file_path] = new_content
253
+ else:
254
+ failed_blocks.append((file_path, head, update))
255
+
256
+ return MergeCodeWithoutEffect(
257
+ success_blocks=[(path, content)
258
+ for path, content in file_content_mapping.items()],
259
+ failed_blocks=failed_blocks
260
+ )
261
+
262
+
263
+ def _merge_code(self, content: str, force_skip_git: bool = False):
264
+ file_content = FileUtils.read_file(self.args.file)
265
+ md5 = hashlib.md5(file_content.encode("utf-8")).hexdigest()
266
+ file_name = os.path.basename(self.args.file)
267
+
268
+ codes = self.get_edits(content)
269
+ changes_to_make = []
270
+ changes_made = False
271
+ unmerged_blocks = []
272
+ merged_blocks = []
273
+
274
+ # First, check if there are any changes to be made
275
+ file_content_mapping = {}
276
+ for block in codes:
277
+ file_path, head, update = block
278
+ if not os.path.exists(file_path):
279
+ changes_to_make.append((file_path, None, update))
280
+ file_content_mapping[file_path] = update
281
+ merged_blocks.append((file_path, "", update, 1))
282
+ changes_made = True
283
+ else:
284
+ if file_path not in file_content_mapping:
285
+ file_content_mapping[file_path] = FileUtils.read_file(file_path)
286
+ existing_content = file_content_mapping[file_path]
287
+ new_content = (
288
+ existing_content.replace(head, update, 1)
289
+ if head
290
+ else existing_content + "\n" + update
291
+ )
292
+ if new_content != existing_content:
293
+ changes_to_make.append(
294
+ (file_path, existing_content, new_content))
295
+ file_content_mapping[file_path] = new_content
296
+ merged_blocks.append((file_path, head, update, 1))
297
+ changes_made = True
298
+ else:
299
+ # If the SEARCH BLOCK is not found exactly, then try to use
300
+ # the similarity ratio to find the best matching block
301
+ similarity, best_window = TextSimilarity(
302
+ head, existing_content
303
+ ).get_best_matching_window()
304
+ if similarity > self.args.editblock_similarity:
305
+ new_content = existing_content.replace(
306
+ best_window, update, 1)
307
+ if new_content != existing_content:
308
+ changes_to_make.append(
309
+ (file_path, existing_content, new_content)
310
+ )
311
+ file_content_mapping[file_path] = new_content
312
+ merged_blocks.append(
313
+ (file_path, head, update, similarity))
314
+ changes_made = True
315
+ else:
316
+ unmerged_blocks.append(
317
+ (file_path, head, update, similarity))
318
+
319
+ if unmerged_blocks:
320
+ if self.args.request_id and not self.args.skip_events:
321
+ # collect unmerged blocks
322
+ event_data = []
323
+ for file_path, head, update, similarity in unmerged_blocks:
324
+ event_data.append(
325
+ {
326
+ "file_path": file_path,
327
+ "head": head,
328
+ "update": update,
329
+ "similarity": similarity,
330
+ }
331
+ )
332
+
333
+ _ = queue_communicate.send_event(
334
+ request_id=self.args.request_id,
335
+ event=CommunicateEvent(
336
+ event_type=CommunicateEventType.CODE_UNMERGE_RESULT.value,
337
+ data=json.dumps(event_data, ensure_ascii=False),
338
+ ),
339
+ )
340
+ return
341
+
342
+ self.printer.print_in_terminal("unmerged_blocks_warning", num_blocks=len(unmerged_blocks))
343
+ self._print_unmerged_blocks(unmerged_blocks)
344
+ return
345
+
346
+ if changes_made and not force_skip_git and not self.args.skip_commit:
347
+ try:
348
+ git_utils.commit_changes(
349
+ self.args.source_dir, f"auto_coder_pre_{file_name}_{md5}"
350
+ )
351
+ except Exception as e:
352
+ self.printer.print_str_in_terminal(
353
+ self.git_require_msg(source_dir=self.args.source_dir, error=str(e)),
354
+ style="red"
355
+ )
356
+ return
357
+
358
+ # Now, apply the changes
359
+ for file_path, new_content in file_content_mapping.items():
360
+ os.makedirs(os.path.dirname(file_path), exist_ok=True)
361
+ with open(file_path, "w") as f:
362
+ f.write(new_content)
363
+
364
+ if self.args.request_id and not self.args.skip_events:
365
+ # collect modified files
366
+ event_data = []
367
+ for code in merged_blocks:
368
+ file_path, head, update, similarity = code
369
+ event_data.append(
370
+ {
371
+ "file_path": file_path,
372
+ "head": head,
373
+ "update": update,
374
+ "similarity": similarity,
375
+ }
376
+ )
377
+
378
+ _ = queue_communicate.send_event(
379
+ request_id=self.args.request_id,
380
+ event=CommunicateEvent(
381
+ event_type=CommunicateEventType.CODE_MERGE_RESULT.value,
382
+ data=json.dumps(event_data, ensure_ascii=False),
383
+ ),
384
+ )
385
+
386
+ if changes_made:
387
+ if not force_skip_git and not self.args.skip_commit:
388
+ try:
389
+ commit_result = git_utils.commit_changes(
390
+ self.args.source_dir,
391
+ f"{self.args.query}\nauto_coder_{file_name}",
392
+ )
393
+
394
+ action_yml_file_manager = ActionYmlFileManager(self.args.source_dir)
395
+ action_file_name = os.path.basename(self.args.file)
396
+ add_updated_urls = []
397
+ commit_result.changed_files
398
+ for file in commit_result.changed_files:
399
+ add_updated_urls.append(os.path.join(self.args.source_dir, file))
400
+
401
+ self.args.add_updated_urls = add_updated_urls
402
+ update_yaml_success = action_yml_file_manager.update_yaml_field(action_file_name, "add_updated_urls", add_updated_urls)
403
+ if not update_yaml_success:
404
+ self.printer.print_in_terminal("yaml_save_error", style="red", yaml_file=action_file_name)
405
+
406
+ if self.args.enable_active_context:
407
+ active_context_manager = ActiveContextManager(self.llm, self.args.source_dir)
408
+ task_id = active_context_manager.process_changes(self.args)
409
+ self.printer.print_in_terminal("active_context_background_task",
410
+ style="blue",
411
+ task_id=task_id)
412
+ git_utils.print_commit_info(commit_result=commit_result)
413
+ except Exception as e:
414
+ self.printer.print_str_in_terminal(
415
+ self.git_require_msg(source_dir=self.args.source_dir, error=str(e)),
416
+ style="red"
417
+ )
418
+ else:
419
+ self.print_merged_blocks(merged_blocks)
420
+
421
+ self.printer.print_in_terminal("merge_success",
422
+ num_files=len(file_content_mapping.keys()),
423
+ num_changes=len(changes_to_make),
424
+ total_blocks=len(codes))
425
+
426
+ else:
427
+ self.printer.print_in_terminal("no_changes_made")
428
+
429
+ def _print_unmerged_blocks(self, unmerged_blocks: List[tuple]):
430
+ self.printer.print_in_terminal("unmerged_blocks_title", style="bold red")
431
+ for file_path, head, update, similarity in unmerged_blocks:
432
+ self.printer.print_str_in_terminal(
433
+ f"\n{self.printer.get_message_from_key_with_format('unmerged_file_path',file_path=file_path)}",
434
+ style="bold blue"
435
+ )
436
+ self.printer.print_str_in_terminal(
437
+ f"\n{self.printer.get_message_from_key_with_format('unmerged_search_block',similarity=similarity)}",
438
+ style="bold green"
439
+ )
440
+ syntax = Syntax(head, "python", theme="monokai", line_numbers=True)
441
+ self.printer.console.print(Panel(syntax, expand=False))
442
+ self.printer.print_in_terminal("unmerged_replace_block", style="bold yellow")
443
+ syntax = Syntax(update, "python", theme="monokai", line_numbers=True)
444
+ self.printer.console.print(Panel(syntax, expand=False))
445
+ self.printer.print_in_terminal("unmerged_blocks_total", num_blocks=len(unmerged_blocks), style="bold red")
446
+
447
+
448
+ def print_merged_blocks(self, merged_blocks: List[tuple]):
449
+ """Print search/replace blocks for user review using rich library"""
450
+ from rich.syntax import Syntax
451
+ from rich.panel import Panel
452
+
453
+ # Group blocks by file path
454
+ file_blocks = {}
455
+ for file_path, head, update, similarity in merged_blocks:
456
+ if file_path not in file_blocks:
457
+ file_blocks[file_path] = []
458
+ file_blocks[file_path].append((head, update, similarity))
459
+
460
+ # Generate formatted text for each file
461
+ formatted_text = ""
462
+ for file_path, blocks in file_blocks.items():
463
+ formatted_text += f"##File: {file_path}\n"
464
+ for head, update, similarity in blocks:
465
+ formatted_text += "<<<<<<< SEARCH\n"
466
+ formatted_text += head + "\n"
467
+ formatted_text += "=======\n"
468
+ formatted_text += update + "\n"
469
+ formatted_text += ">>>>>>> REPLACE\n"
470
+ formatted_text += "\n"
471
+
472
+ # Print with rich panel
473
+ self.printer.print_in_terminal("merged_blocks_title", style="bold green")
474
+ self.printer.console.print(
475
+ Panel(
476
+ Syntax(formatted_text, "diff", theme="monokai"),
477
+ title="Merged Changes",
478
+ border_style="green",
479
+ expand=False
480
+ )
481
+ )
@@ -26,8 +26,8 @@ class CommitResult(BaseModel):
26
26
  success: bool
27
27
  commit_message: Optional[str] = None
28
28
  commit_hash: Optional[str] = None
29
- changed_files: Optional[List[str]] = None
30
- diffs: Optional[dict] = None
29
+ changed_files: Optional[List[str]] = []
30
+ diffs: Optional[dict] = {}
31
31
  error_message: Optional[str] = None
32
32
 
33
33