auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,474 @@
1
+ """
2
+ AgenticEdit 变更管理器模块
3
+
4
+ 该模块负责处理文件变更的应用、检查点管理和回滚功能,从 AgenticEdit 主类中独立出来。
5
+ """
6
+
7
+ import os
8
+ import time
9
+ from typing import List, Dict, Any, Optional, TYPE_CHECKING
10
+ from loguru import logger
11
+
12
+ from autocoder.common import AutoCoderArgs, git_utils
13
+ from autocoder.common.printer import Printer
14
+ from autocoder.events.event_manager_singleton import get_event_manager
15
+ from autocoder.events.event_types import EventMetadata
16
+ from autocoder.events import event_content as EventContentCreator
17
+ from autocoder.common.action_yml_file_manager import ActionYmlFileManager
18
+ from autocoder.memory.active_context_manager import ActiveContextManager
19
+ from autocoder.common.auto_coder_lang import get_message, get_message_with_format
20
+ from autocoder.common.pull_requests import create_pull_request
21
+ from autocoder.common.v2.agent.agentic_edit_types import FileChangeEntry
22
+
23
+ if TYPE_CHECKING:
24
+ from .agentic_edit import AgenticEdit
25
+
26
+
27
+ class AgenticEditChangeManager:
28
+ """
29
+ AgenticEdit 变更管理器
30
+
31
+ 负责处理文件变更的应用、检查点管理和回滚功能。
32
+ """
33
+
34
+ def __init__(self, agent: 'AgenticEdit'):
35
+ """
36
+ 初始化变更管理器
37
+
38
+ Args:
39
+ agent: AgenticEdit 实例,用于访问必要的属性和方法
40
+ """
41
+ self.agent = agent
42
+ self.args = agent.args
43
+ self.printer = agent.printer
44
+ self.llm = agent.llm
45
+ self.checkpoint_manager = agent.checkpoint_manager
46
+ self.conversation_config = agent.conversation_config
47
+
48
+ # 文件变更跟踪信息
49
+ # 格式: { file_path: FileChangeEntry(...) }
50
+ self.file_changes: Dict[str, FileChangeEntry] = {}
51
+
52
+ def record_file_change(self, file_path: str, change_type: str, diff: Optional[str] = None, content: Optional[str] = None):
53
+ """
54
+ 记录单个文件的变更信息。
55
+
56
+ Args:
57
+ file_path: 相对路径
58
+ change_type: 'added' 或 'modified'
59
+ diff: 对于 replace_in_file,传入 diff 内容
60
+ content: 最新文件内容(可选,通常用于 write_to_file)
61
+ """
62
+ entry = self.file_changes.get(file_path)
63
+ if entry is None:
64
+ entry = FileChangeEntry(
65
+ type=change_type, diffs=[], content=content)
66
+ self.file_changes[file_path] = entry
67
+ else:
68
+ # 文件已经存在,可能之前是 added,现在又被 modified,或者多次 modified
69
+ # 简单起见,type 用 added 优先,否则为 modified
70
+ if entry.type != "added":
71
+ entry.type = change_type
72
+
73
+ # content 以最新为准
74
+ if content is not None:
75
+ entry.content = content
76
+
77
+ if diff:
78
+ entry.diffs.append(diff)
79
+
80
+ def get_all_file_changes(self) -> Dict[str, FileChangeEntry]:
81
+ """
82
+ 获取当前记录的所有文件变更信息。
83
+
84
+ Returns:
85
+ 字典,key 为文件路径,value 为变更详情
86
+ """
87
+ return self.file_changes
88
+
89
+ def apply_pre_changes(self):
90
+ """应用预处理变更,通常用于在主要变更前创建提交点"""
91
+ # get the file name
92
+ if not self.args.file:
93
+ logger.warning("No self.args.file set, skip to apply pre changes")
94
+ return
95
+ file_name = os.path.basename(self.args.file)
96
+ if not self.args.skip_commit:
97
+ try:
98
+ commit_result = git_utils.commit_changes(
99
+ self.args.source_dir, f"auto_coder_pre_{file_name}")
100
+ get_event_manager(self.args.event_file).write_result(
101
+ EventContentCreator.create_result(
102
+ content={
103
+ "have_commit": commit_result.success,
104
+ "commit_hash": commit_result.commit_hash,
105
+ "diff_file_num": len(commit_result.changed_files),
106
+ "event_file": self.args.event_file
107
+ }), metadata=EventMetadata(
108
+ action_file=self.args.file,
109
+ is_streaming=False,
110
+ path="/agent/edit/apply_pre_changes",
111
+ stream_out_type="/agent/edit").to_dict())
112
+
113
+ except Exception as e:
114
+ self.printer.print_in_terminal("git_init_required",
115
+ source_dir=self.args.source_dir, error=str(e))
116
+ return
117
+
118
+ def apply_changes(self):
119
+ """
120
+ Apply all tracked file changes to the original project directory.
121
+ """
122
+ if not self.args.file:
123
+ logger.warning("No self.args.file set, skip to apply pre changes")
124
+ return
125
+
126
+ if not self.args.skip_commit:
127
+ try:
128
+ file_name = os.path.basename(self.args.file)
129
+ commit_result = git_utils.commit_changes(
130
+ self.args.source_dir,
131
+ f"{self.args.query}\nauto_coder_{file_name}",
132
+ )
133
+
134
+ get_event_manager(self.args.event_file).write_result(
135
+ EventContentCreator.create_result(
136
+ content={
137
+ "have_commit": commit_result.success,
138
+ "commit_hash": commit_result.commit_hash,
139
+ "diff_file_num": len(commit_result.changed_files),
140
+ "event_file": self.args.event_file
141
+ }), metadata=EventMetadata(
142
+ action_file=self.args.file,
143
+ is_streaming=False,
144
+ path="/agent/edit/apply_changes",
145
+ stream_out_type="/agent/edit").to_dict())
146
+
147
+ action_yml_file_manager = ActionYmlFileManager(
148
+ self.args.source_dir)
149
+ action_file_name = os.path.basename(self.args.file)
150
+ add_updated_urls = []
151
+ commit_result.changed_files
152
+ for file in commit_result.changed_files:
153
+ add_updated_urls.append(
154
+ os.path.join(self.args.source_dir, file))
155
+
156
+ self.args.add_updated_urls = add_updated_urls
157
+ update_yaml_success = action_yml_file_manager.update_yaml_field(
158
+ action_file_name, "add_updated_urls", add_updated_urls)
159
+ if not update_yaml_success:
160
+ self.printer.print_in_terminal(
161
+ "yaml_save_error", style="red", yaml_file=action_file_name)
162
+
163
+ if self.args.enable_active_context:
164
+ active_context_manager = ActiveContextManager(
165
+ self.llm, self.args.source_dir)
166
+ task_id = active_context_manager.process_changes(
167
+ self.args)
168
+ self.printer.print_in_terminal("active_context_background_task",
169
+ style="blue",
170
+ task_id=task_id)
171
+ git_utils.print_commit_info(commit_result=commit_result)
172
+
173
+ # 检查是否需要创建 Pull Request
174
+ if self.conversation_config and self.conversation_config.pull_request:
175
+ self._create_pull_request(commit_result)
176
+
177
+ except Exception as e:
178
+ self.printer.print_str_in_terminal(
179
+ str(e),
180
+ style="red"
181
+ )
182
+
183
+ def get_available_checkpoints(self) -> List[Dict[str, Any]]:
184
+ """
185
+ 获取可用的检查点列表
186
+
187
+ Returns:
188
+ List[Dict[str, Any]]: 检查点信息列表
189
+ """
190
+ if not self.checkpoint_manager:
191
+ return []
192
+
193
+ return self.checkpoint_manager.get_available_checkpoints()
194
+
195
+ def rollback_to_checkpoint(self, checkpoint_id: str) -> bool:
196
+ """
197
+ 回滚到指定的检查点,恢复文件状态和对话状态
198
+
199
+ Args:
200
+ checkpoint_id: 检查点ID
201
+
202
+ Returns:
203
+ bool: 是否成功回滚
204
+ """
205
+ if not self.checkpoint_manager:
206
+ logger.error("无法回滚:检查点管理器未初始化")
207
+ return False
208
+
209
+ try:
210
+ # 回滚文件变更
211
+ undo_result, checkpoint = self.checkpoint_manager.undo_change_group_with_conversation(
212
+ checkpoint_id)
213
+ if not undo_result.success:
214
+ logger.error(f"回滚文件变更失败: {undo_result.errors}")
215
+ return False
216
+
217
+ # 恢复对话状态
218
+ if checkpoint:
219
+ self.agent.current_conversations = checkpoint.conversations
220
+ logger.info(f"已恢复对话状态,包含 {len(checkpoint.conversations)} 条消息")
221
+ return True
222
+ else:
223
+ logger.warning(f"未找到关联的对话检查点: {checkpoint_id},只回滚了文件变更")
224
+ return undo_result.success
225
+ except Exception as e:
226
+ logger.exception(f"回滚到检查点 {checkpoint_id} 失败: {str(e)}")
227
+ return False
228
+
229
+ def handle_rollback_command(self, command: str) -> str:
230
+ """
231
+ 处理回滚相关的命令
232
+
233
+ Args:
234
+ command: 命令字符串,如 "rollback list", "rollback to <id>", "rollback info <id>"
235
+
236
+ Returns:
237
+ str: 命令执行结果
238
+ """
239
+ if command == "rollback list":
240
+ # 列出可用的检查点
241
+ checkpoints = self.get_available_checkpoints()
242
+ if not checkpoints:
243
+ return "没有可用的检查点。"
244
+
245
+ result = "可用的检查点列表:\n"
246
+ for i, cp in enumerate(checkpoints):
247
+ time_str = time.strftime(
248
+ "%Y-%m-%d %H:%M:%S", time.localtime(cp["timestamp"]))
249
+ result += f"{i+1}. ID: {cp['id'][:8]}... | 时间: {time_str} | 变更文件数: {cp['changes_count']}"
250
+ result += f" | {'包含对话状态' if cp['has_conversation'] else '不包含对话状态'}\n"
251
+
252
+ return result
253
+
254
+ elif command.startswith("rollback info "):
255
+ # 显示检查点详情
256
+ cp_id = command[len("rollback info "):].strip()
257
+
258
+ # 查找检查点
259
+ checkpoints = self.get_available_checkpoints()
260
+ target_cp = None
261
+
262
+ # 支持通过序号或ID查询
263
+ if cp_id.isdigit() and 1 <= int(cp_id) <= len(checkpoints):
264
+ target_cp = checkpoints[int(cp_id) - 1]
265
+ else:
266
+ for cp in checkpoints:
267
+ if cp["id"].startswith(cp_id):
268
+ target_cp = cp
269
+ break
270
+
271
+ if not target_cp:
272
+ return f"未找到ID为 {cp_id} 的检查点。"
273
+
274
+ # 获取检查点详细信息
275
+ time_str = time.strftime(
276
+ "%Y-%m-%d %H:%M:%S", time.localtime(target_cp["timestamp"]))
277
+
278
+ # 获取变更文件列表
279
+ changes = self.checkpoint_manager.get_changes_by_group(
280
+ target_cp["id"])
281
+ changed_files = [change.file_path for change in changes]
282
+
283
+ # 获取对话状态信息
284
+ conversation_info = "无对话状态信息"
285
+ if target_cp["has_conversation"] and hasattr(self.checkpoint_manager, 'conversation_store'):
286
+ checkpoint = self.checkpoint_manager.conversation_store.get_checkpoint(
287
+ target_cp["id"])
288
+ if checkpoint and checkpoint.conversations:
289
+ conversation_info = f"包含 {len(checkpoint.conversations)} 条对话消息"
290
+
291
+ result = f"检查点详情:\n"
292
+ result += f"ID: {target_cp['id']}\n"
293
+ result += f"创建时间: {time_str}\n"
294
+ result += f"变更文件数: {target_cp['changes_count']}\n"
295
+ result += f"对话状态: {conversation_info}\n\n"
296
+
297
+ if changed_files:
298
+ result += "变更文件列表:\n"
299
+ for i, file_path in enumerate(changed_files):
300
+ result += f"{i+1}. {file_path}\n"
301
+
302
+ return result
303
+
304
+ elif command.startswith("rollback to "):
305
+ # 回滚到指定检查点
306
+ cp_id = command[len("rollback to "):].strip()
307
+
308
+ # 查找检查点
309
+ checkpoints = self.get_available_checkpoints()
310
+ target_cp = None
311
+
312
+ # 支持通过序号或ID回滚
313
+ if cp_id.isdigit() and 1 <= int(cp_id) <= len(checkpoints):
314
+ target_cp = checkpoints[int(cp_id) - 1]
315
+ else:
316
+ for cp in checkpoints:
317
+ if cp["id"].startswith(cp_id):
318
+ target_cp = cp
319
+ break
320
+
321
+ if not target_cp:
322
+ return f"未找到ID为 {cp_id} 的检查点。"
323
+
324
+ # 执行回滚
325
+ success = self.rollback_to_checkpoint(target_cp["id"])
326
+
327
+ if success:
328
+ # 获取变更文件列表
329
+ changes = self.checkpoint_manager.get_changes_by_group(
330
+ target_cp["id"])
331
+ changed_files = [change.file_path for change in changes]
332
+
333
+ result = f"成功回滚到检查点 {target_cp['id'][:8]}...\n"
334
+ result += f"恢复了 {len(changed_files)} 个文件的状态"
335
+
336
+ if target_cp["has_conversation"]:
337
+ result += f"\n同时恢复了对话状态"
338
+
339
+ return result
340
+ else:
341
+ return f"回滚到检查点 {target_cp['id'][:8]}... 失败。"
342
+
343
+ return "未知命令。可用命令:rollback list, rollback info <id>, rollback to <id>"
344
+
345
+ def _create_pull_request(self, commit_result):
346
+ """
347
+ 创建 Pull Request(如果配置启用)
348
+
349
+ Args:
350
+ commit_result: Git commit 结果对象
351
+ """
352
+ try:
353
+ # 获取当前分支名
354
+ current_branch = git_utils.get_current_branch(self.args.source_dir)
355
+ if not current_branch:
356
+ logger.warning(get_message(
357
+ "/agent/edit/pull_request/branch_name_failed"))
358
+ return
359
+
360
+ # 准备 PR 标题和描述
361
+ query = self.args.query or get_message(
362
+ "/agent/edit/pull_request/default_query")
363
+ pr_title = get_message_with_format(
364
+ "/agent/edit/pull_request/title", query=f"{query[0:40]}...")
365
+
366
+ # 构建 PR 描述
367
+ file_list = ""
368
+ if commit_result.changed_files:
369
+ for file_path in commit_result.changed_files:
370
+ file_list += f"- `{file_path}`\n"
371
+
372
+ pr_description = get_message_with_format(
373
+ "/agent/edit/pull_request/description",
374
+ query=query,
375
+ file_count=len(commit_result.changed_files or []),
376
+ commit_hash=commit_result.commit_hash,
377
+ file_list=file_list.strip(),
378
+ source_branch=current_branch,
379
+ target_branch="main",
380
+ timestamp=time.strftime('%Y-%m-%d %H:%M:%S')
381
+ )
382
+
383
+ # 创建 Pull Request
384
+ logger.info(get_message_with_format(
385
+ "/agent/edit/pull_request/creating", title=pr_title))
386
+
387
+ result = create_pull_request(
388
+ repo_path=self.args.source_dir,
389
+ title=pr_title,
390
+ description=pr_description,
391
+ )
392
+
393
+ if result.success:
394
+ logger.info(get_message("/agent/edit/pull_request/success"))
395
+ logger.info(f"PR URL: {result.pr_url}")
396
+ logger.info(f"PR 编号: {result.pr_number}")
397
+
398
+ # 打印成功信息到终端
399
+ self.printer.print_str_in_terminal(
400
+ get_message("/agent/edit/pull_request/success"),
401
+ style="green"
402
+ )
403
+ self.printer.print_str_in_terminal(f"PR URL: {result.pr_url}")
404
+ self.printer.print_str_in_terminal(
405
+ f"PR 编号: {result.pr_number}")
406
+
407
+ # 写入事件日志
408
+ get_event_manager(self.args.event_file).write_result(
409
+ EventContentCreator.create_result(
410
+ content={
411
+ "success": True,
412
+ "pr_url": result.pr_url,
413
+ "pr_number": result.pr_number,
414
+ "source_branch": current_branch,
415
+ "target_branch": "main",
416
+ "platform": result.platform.value if result.platform else "unknown"
417
+ }),
418
+ metadata=EventMetadata(
419
+ action_file=self.args.file,
420
+ is_streaming=False,
421
+ path="/agent/edit/pull_request_created",
422
+ stream_out_type="/agent/edit"
423
+ ).to_dict()
424
+ )
425
+
426
+ else:
427
+ error_msg = get_message_with_format(
428
+ "/agent/edit/pull_request/failed", error=result.error_message)
429
+ logger.error(error_msg)
430
+
431
+ # 打印错误信息到终端
432
+ self.printer.print_str_in_terminal(error_msg, style="red")
433
+
434
+ # 写入错误事件日志
435
+ get_event_manager(self.args.event_file).write_error(
436
+ EventContentCreator.create_error(
437
+ error_code="PR_CREATION_FAILED",
438
+ error_message=result.error_message,
439
+ details={
440
+ "source_branch": current_branch,
441
+ "target_branch": "main"
442
+ }
443
+ ).to_dict(),
444
+ metadata=EventMetadata(
445
+ action_file=self.args.file,
446
+ is_streaming=False,
447
+ path="/agent/edit/pull_request_error",
448
+ stream_out_type="/agent/edit"
449
+ ).to_dict()
450
+ )
451
+
452
+ except Exception as e:
453
+ error_msg = get_message_with_format(
454
+ "/agent/edit/pull_request/exception", error=str(e))
455
+ logger.exception(error_msg)
456
+
457
+ # 打印异常信息到终端
458
+ self.printer.print_str_in_terminal(error_msg, style="red")
459
+
460
+ # 写入异常事件日志
461
+ get_event_manager(self.args.event_file).write_error(
462
+ EventContentCreator.create_error(
463
+ error_code="PR_CREATION_EXCEPTION",
464
+ error_message=get_message_with_format(
465
+ "/agent/edit/pull_request/exception", error=str(e)),
466
+ details={"exception_type": type(e).__name__}
467
+ ).to_dict(),
468
+ metadata=EventMetadata(
469
+ action_file=self.args.file,
470
+ is_streaming=False,
471
+ path="/agent/edit/pull_request_exception",
472
+ stream_out_type="/agent/edit"
473
+ ).to_dict()
474
+ )
@@ -6,13 +6,36 @@ from .write_to_file_tool_resolver import WriteToFileToolResolver
6
6
  from .replace_in_file_tool_resolver import ReplaceInFileToolResolver
7
7
  from .search_files_tool_resolver import SearchFilesToolResolver
8
8
  from .list_files_tool_resolver import ListFilesToolResolver
9
- from .list_code_definition_names_tool_resolver import ListCodeDefinitionNamesToolResolver
9
+ from .list_code_definition_names_tool_resolver import (
10
+ ListCodeDefinitionNamesToolResolver,
11
+ )
10
12
  from .ask_followup_question_tool_resolver import AskFollowupQuestionToolResolver
11
13
  from .attempt_completion_tool_resolver import AttemptCompletionToolResolver
12
14
  from .plan_mode_respond_tool_resolver import PlanModeRespondToolResolver
13
15
  from .use_mcp_tool_resolver import UseMcpToolResolver
14
16
  from .use_rag_tool_resolver import UseRAGToolResolver
15
- from .list_package_info_tool_resolver import ListPackageInfoToolResolver
17
+ from .run_named_subagents_tool_resolver import RunNamedSubagentsToolResolver
18
+ from .todo_read_tool_resolver import TodoReadToolResolver
19
+ from .todo_write_tool_resolver import TodoWriteToolResolver
20
+ from .ac_mod_read_tool_resolver import ACModReadToolResolver
21
+ from .ac_mod_write_tool_resolver import ACModWriteToolResolver
22
+ from .ac_mod_list_tool_resolver import ACModListToolResolver
23
+ from .count_tokens_tool_resolver import CountTokensToolResolver
24
+ from .extract_to_text_tool_resolver import ExtractToTextToolResolver
25
+ from .session_start_tool_resolver import SessionStartToolResolver
26
+ from .session_interactive_tool_resolver import SessionInteractiveToolResolver
27
+ from .session_stop_tool_resolver import SessionStopToolResolver
28
+ from .conversation_message_ids_write_tool_resolver import (
29
+ ConversationMessageIdsWriteToolResolver,
30
+ )
31
+ from .conversation_message_ids_read_tool_resolver import (
32
+ ConversationMessageIdsReadToolResolver,
33
+ )
34
+ from .background_task_tool_resolver import BackgroundTaskToolResolver
35
+ from .web_crawl_tool_resolver import WebCrawlToolResolver
36
+ from .web_search_tool_resolver import WebSearchToolResolver
37
+ from .load_extra_document_tool_resolver import LoadExtraDocumentToolResolver
38
+ from .execute_workflow_tool_resolver import ExecuteWorkflowToolResolver
16
39
 
17
40
  __all__ = [
18
41
  "BaseToolResolver",
@@ -28,5 +51,23 @@ __all__ = [
28
51
  "PlanModeRespondToolResolver",
29
52
  "UseMcpToolResolver",
30
53
  "UseRAGToolResolver",
54
+ "RunNamedSubagentsToolResolver",
31
55
  "ListPackageInfoToolResolver",
56
+ "TodoReadToolResolver",
57
+ "TodoWriteToolResolver",
58
+ "ACModReadToolResolver",
59
+ "ACModWriteToolResolver",
60
+ "ACModListToolResolver",
61
+ "CountTokensToolResolver",
62
+ "ExtractToTextToolResolver",
63
+ "SessionStartToolResolver",
64
+ "SessionInteractiveToolResolver",
65
+ "SessionStopToolResolver",
66
+ "ConversationMessageIdsWriteToolResolver",
67
+ "ConversationMessageIdsReadToolResolver",
68
+ "BackgroundTaskToolResolver",
69
+ "WebCrawlToolResolver",
70
+ "WebSearchToolResolver",
71
+ "LoadExtraDocumentToolResolver",
72
+ "ExecuteWorkflowToolResolver",
32
73
  ]