auto-coder 1.0.0__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 (574) 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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.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 +24 -3
  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 +970 -2345
  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 +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  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/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +288 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +932 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -9,61 +9,78 @@ import sys
9
9
  from typing import Any, Dict, Optional, Iterator, Union
10
10
  from pathlib import Path
11
11
  import subprocess
12
+ from contextlib import contextmanager
12
13
 
13
14
  from ..exceptions import BridgeError
14
15
  from ..models.responses import StreamEvent
15
- from autocoder.auto_coder_runner import run_auto_command,configure
16
+ from autocoder.auto_coder_runner import run_auto_command, configure
16
17
  from ..models.options import AutoCodeOptions
17
18
 
18
19
  # 不导入事件类型,使用动态检查避免类型冲突
19
20
 
20
21
 
22
+ @contextmanager
23
+ def temporary_chdir(path: Union[str, Path]):
24
+ """临时切换工作目录的上下文管理器"""
25
+ original_cwd = os.getcwd()
26
+ try:
27
+ os.chdir(path)
28
+ yield
29
+ finally:
30
+ os.chdir(original_cwd)
31
+
32
+
21
33
  class AutoCoderBridge:
22
34
  """桥接层,连接现有功能"""
23
35
 
24
- def __init__(self, project_root: str,options:AutoCodeOptions):
36
+ def __init__(self, project_root: str, options: AutoCodeOptions):
25
37
  """
26
38
  初始化桥接层
27
39
 
28
40
  Args:
29
41
  project_root: 项目根目录
42
+ options: 配置选项
30
43
  """
31
44
  self.project_root = project_root or os.getcwd()
32
- self.options = options
45
+ self.options = options
46
+ self.allow_chdir = True # 默认允许切换目录,可以通过配置关闭
33
47
  self._setup_environment()
34
48
 
35
49
  def _setup_environment(self):
36
50
  """设置环境和内存"""
37
51
  try:
38
- # 切换到项目根目录
39
- original_cwd = os.getcwd()
40
- os.chdir(self.project_root)
41
-
42
- # 尝试初始化 auto_coder_runner 环境
43
- try:
44
- self.init_project_if_required()
45
- from autocoder.auto_coder_runner import start
46
- start()
47
- except ImportError:
48
- # 如果无法导入,跳过初始化
49
- pass
50
-
51
- # 恢复原始工作目录
52
- os.chdir(original_cwd)
52
+ # 使用上下文管理器临时切换到项目根目录
53
+ if self.allow_chdir:
54
+ with temporary_chdir(self.project_root):
55
+ self._init_project_environment()
56
+ else:
57
+ # 不切换目录的情况下初始化
58
+ self._init_project_environment()
53
59
 
54
60
  except Exception as e:
55
61
  # 设置环境失败不应该阻止程序运行
56
62
  pass
57
63
 
64
+ def _init_project_environment(self):
65
+ """初始化项目环境"""
66
+ try:
67
+ self.init_project_if_required()
68
+ from autocoder.auto_coder_runner import start
69
+ start()
70
+ except ImportError:
71
+ # 如果无法导入,跳过初始化
72
+ pass
73
+
58
74
  def init_project_if_required(self):
59
75
  from autocoder.auto_coder_runner import init_project_if_required as init_project_if_required_buildin
60
- init_project_if_required_buildin(self.project_root,".py,.ts")
76
+ init_project_if_required_buildin(self.project_root, "*")
61
77
 
62
78
  def call_run_auto_command(
63
79
  self,
64
80
  query: str,
65
81
  pre_commit: bool = False,
66
82
  pr: bool = False,
83
+ cancel_token: Optional[str] = None,
67
84
  extra_args: Optional[Dict[str, Any]] = None,
68
85
  stream: bool = True
69
86
  ) -> Iterator[StreamEvent]:
@@ -74,6 +91,7 @@ class AutoCoderBridge:
74
91
  query: 查询内容
75
92
  pre_commit: 是否预提交
76
93
  pr: 是否预提交
94
+ cancel_token: 取消令牌,用于中断执行
77
95
  extra_args: 额外参数
78
96
  stream: 是否流式返回
79
97
 
@@ -84,50 +102,105 @@ class AutoCoderBridge:
84
102
  BridgeError: 桥接层错误
85
103
  """
86
104
  try:
87
- # 切换到项目根目录
88
- original_cwd = os.getcwd()
89
- os.chdir(self.project_root)
90
-
91
105
  # 准备参数
92
106
  extra_args = extra_args or {}
93
107
 
108
+ # 根据会话配置确定 conversation_action 和 conversation_id
109
+ from autocoder.common.v2.agent.agentic_edit_types import ConversationAction
110
+
111
+ conversation_action = ConversationAction.NEW # 默认为新对话
112
+ conversation_id = None
113
+
114
+ if self.options.session_id:
115
+ # 如果有 session_id,就是恢复特定会话
116
+ conversation_action = ConversationAction.RESUME
117
+ conversation_id = self.options.session_id
118
+ elif self.options.continue_session:
119
+ # 如果是 continue_session,就是继续最近的对话
120
+ conversation_action = ConversationAction.CONTINUE
121
+ conversation_id = None
122
+
94
123
  # 发送开始事件
95
124
  yield StreamEvent(
96
125
  event_type="start",
97
- data={"query": query, "pre_commit": pre_commit}
126
+ data={"query": query, "pre_commit": pre_commit,
127
+ "cancel_token": cancel_token, "conversation_action": conversation_action.value,
128
+ "conversation_id": conversation_id}
98
129
  )
99
-
100
- try:
101
-
102
- configure(f"model:{self.options.model}")
103
- events = run_auto_command(
104
- query=query,
105
- pre_commit=pre_commit,
106
- pr=pr,
107
- extra_args=extra_args
108
- )
109
130
 
110
- # 如果返回的是生成器,逐个处理事件
111
- if hasattr(events, '__iter__') and not isinstance(events, (str, bytes)):
112
- for event in events:
113
- # 转换事件格式
114
- stream_event = self._convert_event_to_stream_event(
115
- event)
116
- if stream_event: # 只yield非None的事件
117
- yield stream_event
118
- else:
119
- # 如果不是生成器,包装成单个事件
120
- yield StreamEvent(
121
- event_type="content",
122
- data={"content": str(events)}
123
- )
124
-
125
- except (ImportError, FileNotFoundError, Exception) as e:
126
- # import traceback
127
- # traceback.print_exc()
128
- # 如果无法导入或出现其他错误
129
- raise BridgeError(
130
- f"run_auto_command failed: {str(e)}", original_error=e)
131
+ # 使用上下文管理器切换目录(如果允许)
132
+ context = temporary_chdir(
133
+ self.project_root) if self.allow_chdir else _nullcontext()
134
+
135
+ with context:
136
+ try:
137
+ # 实现循环逻辑
138
+ loop_count = self.options.loop
139
+
140
+ for loop_index in range(loop_count):
141
+ # 第一次使用原始查询,后续循环使用改进的查询
142
+ current_query = query
143
+ if loop_index > 0:
144
+ # 使用自定义的额外提示或默认提示
145
+ if self.options.loop_additional_prompt:
146
+ additional_prompt = self.options.loop_additional_prompt
147
+ else:
148
+ additional_prompt = "use git log to get the code changes generated by previous tasks and try to focus on iterative improvements and refinements. Ensure the implementation is complete, functional, and fully usable without any missing features or incomplete functionality. Make sure to use git commit command to make a commit after every single file edit."
149
+ current_query = f"{query}\n\nAdditional instruction: {additional_prompt}"
150
+
151
+ # 发送循环开始事件
152
+ if loop_count > 1:
153
+ yield StreamEvent(
154
+ event_type="loop_start",
155
+ data={"content": f"{loop_index + 1}/{loop_count}"}
156
+ )
157
+
158
+ # 对于循环执行,根据loop_keep_conversation参数决定是否使用CONTINUE模式
159
+ current_conversation_action = conversation_action
160
+ current_conversation_id = conversation_id
161
+ if loop_index > 0 and self.options.loop_keep_conversation:
162
+ from autocoder.common.v2.agent.agentic_edit_types import ConversationAction
163
+ current_conversation_action = ConversationAction.CONTINUE
164
+ current_conversation_id = None
165
+
166
+ events = run_auto_command(
167
+ query=current_query,
168
+ pre_commit=pre_commit,
169
+ pr=pr and (loop_index == loop_count - 1), # 只在最后一次循环时创建PR
170
+ cancel_token=cancel_token,
171
+ extra_args={
172
+ **extra_args, "max_turns": self.options.max_turns, "model": self.options.model, "include_rules": self.options.include_rules},
173
+ system_prompt=self.options.system_prompt,
174
+ conversation_action=current_conversation_action,
175
+ conversation_id=current_conversation_id,
176
+ is_sub_agent=self.options.is_sub_agent
177
+ )
178
+
179
+ # 如果返回的是生成器,逐个处理事件
180
+ if hasattr(events, '__iter__') and not isinstance(events, (str, bytes)):
181
+ for event in events:
182
+ # 转换事件格式
183
+ stream_event = self._convert_event_to_stream_event(
184
+ event)
185
+ if stream_event: # 只yield非None的事件
186
+ yield stream_event
187
+ else:
188
+ # 如果不是生成器,包装成单个事件
189
+ yield StreamEvent(
190
+ event_type="content",
191
+ data={"content": str(events)}
192
+ )
193
+
194
+ # 发送循环完成事件
195
+ if loop_count > 1:
196
+ yield StreamEvent(
197
+ event_type="loop_end",
198
+ data={"content": f"{loop_index + 1}/{loop_count}"}
199
+ )
200
+
201
+ except (ImportError, FileNotFoundError, Exception) as e:
202
+ raise BridgeError(
203
+ f"run_auto_command failed: {str(e)}", original_error=e)
131
204
 
132
205
  # 发送完成事件
133
206
  yield StreamEvent(
@@ -143,9 +216,6 @@ class AutoCoderBridge:
143
216
  )
144
217
  raise BridgeError(
145
218
  f"run_auto_command failed: {str(e)}", original_error=e)
146
- finally:
147
- # 恢复原始工作目录
148
- os.chdir(original_cwd)
149
219
 
150
220
  def _simulate_auto_command_response(self, query: str) -> Iterator[StreamEvent]:
151
221
  """
@@ -322,9 +392,22 @@ class AutoCoderBridge:
322
392
  )
323
393
 
324
394
  elif event_class_name == "TokenUsageEvent":
395
+ usage = getattr(event, 'usage', None)
396
+ if usage:
397
+ # 序列化 SingleOutputMeta 对象
398
+ usage_data = {
399
+ "input_tokens_count": getattr(usage, 'input_tokens_count', 0),
400
+ "generated_tokens_count": getattr(usage, 'generated_tokens_count', 0),
401
+ "reasoning_content": getattr(usage, 'reasoning_content', ''),
402
+ "finish_reason": getattr(usage, 'finish_reason', 'stop'),
403
+ "first_token_time": getattr(usage, 'first_token_time', 0)
404
+ }
405
+ else:
406
+ usage_data = {}
407
+
325
408
  return StreamEvent(
326
409
  event_type="token_usage",
327
- data={"usage": getattr(event, 'usage', {})}
410
+ data={"usage": usage_data}
328
411
  )
329
412
 
330
413
  elif event_class_name == "WindowLengthChangeEvent":
@@ -340,6 +423,64 @@ class AutoCoderBridge:
340
423
  event, 'conversation_id', '')}
341
424
  )
342
425
 
426
+ elif event_class_name == "PreCommitEvent":
427
+ # event.commit_result 和 event.tpe 一定存在
428
+ commit_result = event.commit_result
429
+ commit_data = {
430
+ "success": commit_result.success if hasattr(commit_result, 'success') else False,
431
+ "message": commit_result.message if hasattr(commit_result, 'message') else '',
432
+ "commit_hash": commit_result.commit_hash if hasattr(commit_result, 'commit_hash') else '',
433
+ "files_changed": commit_result.files_changed if hasattr(commit_result, 'files_changed') else [],
434
+ "error": commit_result.error if hasattr(commit_result, 'error') else None
435
+ }
436
+
437
+ return StreamEvent(
438
+ event_type="pre_commit",
439
+ data={
440
+ "commit_result": commit_data,
441
+ "tpe": event.tpe
442
+ }
443
+ )
444
+
445
+ elif event_class_name == "CommitEvent":
446
+ # event.commit_result 和 event.tpe 一定存在
447
+ commit_result = event.commit_result
448
+ commit_data = {
449
+ "success": commit_result.success if hasattr(commit_result, 'success') else False,
450
+ "message": commit_result.message if hasattr(commit_result, 'message') else '',
451
+ "commit_hash": commit_result.commit_hash if hasattr(commit_result, 'commit_hash') else '',
452
+ "files_changed": commit_result.files_changed if hasattr(commit_result, 'files_changed') else [],
453
+ "error": commit_result.error if hasattr(commit_result, 'error') else None
454
+ }
455
+
456
+ return StreamEvent(
457
+ event_type="commit",
458
+ data={
459
+ "commit_result": commit_data,
460
+ "tpe": event.tpe
461
+ }
462
+ )
463
+
464
+ elif event_class_name == "PullRequestEvent":
465
+ # event.pull_request_result 一定存在
466
+ pr_result = event.pull_request_result
467
+ pr_data = {
468
+ "success": pr_result.success if hasattr(pr_result, 'success') else False,
469
+ "pr_number": pr_result.pr_number if hasattr(pr_result, 'pr_number') else None,
470
+ "pr_url": pr_result.pr_url if hasattr(pr_result, 'pr_url') else '',
471
+ "pr_id": pr_result.pr_id if hasattr(pr_result, 'pr_id') else None,
472
+ "error_message": pr_result.error_message if hasattr(pr_result, 'error_message') else None,
473
+ "error_code": pr_result.error_code if hasattr(pr_result, 'error_code') else None,
474
+ "platform": pr_result.platform if hasattr(pr_result, 'platform') else None,
475
+ "raw_response": pr_result.raw_response if hasattr(pr_result, 'raw_response') else None,
476
+ "retry_after": pr_result.retry_after if hasattr(pr_result, 'retry_after') else None
477
+ }
478
+
479
+ return StreamEvent(
480
+ event_type="pull_request",
481
+ data={"pull_request_result": pr_data}
482
+ )
483
+
343
484
  elif event_class_name == "PlanModeRespondEvent":
344
485
  result = ""
345
486
  if hasattr(event, 'completion'):
@@ -388,27 +529,29 @@ class AutoCoderBridge:
388
529
  Dict[str, Any]: 内存数据
389
530
  """
390
531
  try:
391
- original_cwd = os.getcwd()
392
- os.chdir(self.project_root)
393
-
394
- try:
395
- from autocoder.auto_coder_runner import get_memory
396
- memory_data = get_memory()
397
- return memory_data
398
- except ImportError:
399
- # 模拟内存数据
400
- return {
401
- "current_files": {"files": [], "groups": {}},
402
- "conf": {},
403
- "exclude_dirs": [],
404
- "mode": "auto_detect"
405
- }
406
-
532
+ if self.allow_chdir:
533
+ with temporary_chdir(self.project_root):
534
+ return self._get_memory_internal()
535
+ else:
536
+ return self._get_memory_internal()
407
537
  except Exception as e:
408
538
  raise BridgeError(
409
539
  f"Failed to get memory: {str(e)}", original_error=e)
410
- finally:
411
- os.chdir(original_cwd)
540
+
541
+ def _get_memory_internal(self) -> Dict[str, Any]:
542
+ """内部获取内存实现"""
543
+ try:
544
+ from autocoder.auto_coder_runner import get_memory
545
+ memory_data = get_memory()
546
+ return memory_data
547
+ except ImportError:
548
+ # 模拟内存数据
549
+ return {
550
+ "current_files": {"files": [], "groups": {}},
551
+ "conf": {},
552
+ "exclude_dirs": [],
553
+ "mode": "auto_detect"
554
+ }
412
555
 
413
556
  def save_memory(self, memory_data: Dict[str, Any]) -> None:
414
557
  """
@@ -418,23 +561,25 @@ class AutoCoderBridge:
418
561
  memory_data: 要保存的内存数据
419
562
  """
420
563
  try:
421
- original_cwd = os.getcwd()
422
- os.chdir(self.project_root)
423
-
424
- try:
425
- from autocoder.auto_coder_runner import save_memory, memory
426
- # 更新全局 memory 变量
427
- memory.update(memory_data)
428
- save_memory()
429
- except ImportError:
430
- # 模拟保存
431
- pass
432
-
564
+ if self.allow_chdir:
565
+ with temporary_chdir(self.project_root):
566
+ self._save_memory_internal(memory_data)
567
+ else:
568
+ self._save_memory_internal(memory_data)
433
569
  except Exception as e:
434
570
  raise BridgeError(
435
571
  f"Failed to save memory: {str(e)}", original_error=e)
436
- finally:
437
- os.chdir(original_cwd)
572
+
573
+ def _save_memory_internal(self, memory_data: Dict[str, Any]) -> None:
574
+ """内部保存内存实现"""
575
+ try:
576
+ from autocoder.auto_coder_runner import save_memory, memory
577
+ # 更新全局 memory 变量
578
+ memory.update(memory_data)
579
+ save_memory()
580
+ except ImportError:
581
+ # 模拟保存
582
+ pass
438
583
 
439
584
  def get_project_config(self) -> Dict[str, Any]:
440
585
  """
@@ -444,22 +589,24 @@ class AutoCoderBridge:
444
589
  Dict[str, Any]: 项目配置
445
590
  """
446
591
  try:
447
- original_cwd = os.getcwd()
448
- os.chdir(self.project_root)
449
-
450
- try:
451
- from autocoder.auto_coder_runner import get_final_config
452
- config = get_final_config()
453
- return config.__dict__ if hasattr(config, '__dict__') else {}
454
- except ImportError:
455
- # 模拟配置
456
- return {"mock_config": True}
457
-
592
+ if self.allow_chdir:
593
+ with temporary_chdir(self.project_root):
594
+ return self._get_project_config_internal()
595
+ else:
596
+ return self._get_project_config_internal()
458
597
  except Exception as e:
459
598
  raise BridgeError(
460
599
  f"Failed to get project config: {str(e)}", original_error=e)
461
- finally:
462
- os.chdir(original_cwd)
600
+
601
+ def _get_project_config_internal(self) -> Dict[str, Any]:
602
+ """内部获取配置实现"""
603
+ try:
604
+ from autocoder.auto_coder_runner import get_final_config
605
+ config = get_final_config()
606
+ return config.__dict__ if hasattr(config, '__dict__') else {}
607
+ except ImportError:
608
+ # 模拟配置
609
+ return {"mock_config": True}
463
610
 
464
611
  def setup_project_context(self) -> None:
465
612
  """设置项目上下文"""
@@ -473,20 +620,45 @@ class AutoCoderBridge:
473
620
  def cleanup(self) -> None:
474
621
  """清理资源"""
475
622
  try:
476
- original_cwd = os.getcwd()
477
- os.chdir(self.project_root)
478
-
479
- try:
480
- from autocoder.auto_coder_runner import stop
481
- stop()
482
- except ImportError:
483
- pass
484
-
623
+ if self.allow_chdir:
624
+ with temporary_chdir(self.project_root):
625
+ self._cleanup_internal()
626
+ else:
627
+ self._cleanup_internal()
485
628
  except Exception as e:
486
629
  # 清理失败不应该阻止程序继续运行,只记录错误
487
630
  print(f"Warning: Failed to cleanup resources: {str(e)}")
488
- finally:
489
- os.chdir(original_cwd)
631
+
632
+ def _cleanup_internal(self) -> None:
633
+ """内部清理实现"""
634
+ try:
635
+ from autocoder.auto_coder_runner import stop
636
+ stop()
637
+ except ImportError:
638
+ pass
639
+
640
+ def configure_agentic_max_rounds(self, max_rounds: int = 10000) -> None:
641
+ """
642
+ 配置代理最大轮数
643
+
644
+ Args:
645
+ max_rounds: 最大轮数,默认为10000
646
+ """
647
+ try:
648
+ configure(f"agentic_max_rounds:{max_rounds}", skip_print=True)
649
+ except Exception as e:
650
+ raise BridgeError(
651
+ f"Failed to configure agentic max rounds: {str(e)}", original_error=e)
652
+
653
+ def configure_model(self, model_name: str) -> None:
654
+ """
655
+ 配置模型
656
+ """
657
+ try:
658
+ configure(f"model:{model_name}", skip_print=True)
659
+ except Exception as e:
660
+ raise BridgeError(
661
+ f"Failed to configure model '{model_name}': {str(e)}", original_error=e)
490
662
 
491
663
  def __enter__(self):
492
664
  """上下文管理器入口"""
@@ -496,3 +668,13 @@ class AutoCoderBridge:
496
668
  def __exit__(self, exc_type, exc_val, exc_tb):
497
669
  """上下文管理器出口"""
498
670
  self.cleanup()
671
+
672
+
673
+ class _nullcontext:
674
+ """Python 3.7 兼容的 nullcontext"""
675
+
676
+ def __enter__(self):
677
+ return self
678
+
679
+ def __exit__(self, *args):
680
+ return False
@@ -5,16 +5,18 @@ Auto-Coder SDK 异常定义
5
5
  定义所有自定义异常类,提供错误码和异常的映射关系,统一异常处理策略。
6
6
  """
7
7
 
8
+ from autocoder.common.international import get_message_with_format
9
+
8
10
  class AutoCoderSDKError(Exception):
9
11
  """SDK基础异常类"""
10
12
 
11
- def __init__(self, message: str, error_code: str = None):
13
+ def __init__(self, message: str, error_code: str = "SDK_ERROR"):
12
14
  super().__init__(message)
13
15
  self.message = message
14
- self.error_code = error_code or "SDK_ERROR"
16
+ self.error_code = error_code
15
17
 
16
18
  def __str__(self):
17
- return f"[{self.error_code}] {self.message}"
19
+ return get_message_with_format("sdk_error_with_code", error_code=self.error_code, message=self.message)
18
20
 
19
21
 
20
22
  class SessionNotFoundError(AutoCoderSDKError):
@@ -22,7 +24,7 @@ class SessionNotFoundError(AutoCoderSDKError):
22
24
 
23
25
  def __init__(self, session_id: str):
24
26
  super().__init__(
25
- f"Session '{session_id}' not found",
27
+ get_message_with_format("session_not_found", session_id=session_id),
26
28
  error_code="SESSION_NOT_FOUND"
27
29
  )
28
30
  self.session_id = session_id
@@ -33,7 +35,7 @@ class InvalidOptionsError(AutoCoderSDKError):
33
35
 
34
36
  def __init__(self, message: str):
35
37
  super().__init__(
36
- f"Invalid options: {message}",
38
+ get_message_with_format("invalid_options", message=message),
37
39
  error_code="INVALID_OPTIONS"
38
40
  )
39
41
 
@@ -41,11 +43,15 @@ class InvalidOptionsError(AutoCoderSDKError):
41
43
  class BridgeError(AutoCoderSDKError):
42
44
  """桥接层异常"""
43
45
 
44
- def __init__(self, message: str, original_error: Exception = None):
45
- super().__init__(
46
- f"Bridge error: {message}",
47
- error_code="BRIDGE_ERROR"
48
- )
46
+ def __init__(self, message: str, original_error: Exception | None = None):
47
+ if original_error:
48
+ formatted_message = get_message_with_format("bridge_error_with_original",
49
+ message=message,
50
+ original_error=str(original_error))
51
+ else:
52
+ formatted_message = get_message_with_format("bridge_error", message=message)
53
+
54
+ super().__init__(formatted_message, error_code="BRIDGE_ERROR")
49
55
  self.original_error = original_error
50
56
 
51
57
 
@@ -54,7 +60,7 @@ class CLIError(AutoCoderSDKError):
54
60
 
55
61
  def __init__(self, message: str, exit_code: int = 1):
56
62
  super().__init__(
57
- f"CLI error: {message}",
63
+ get_message_with_format("cli_error", message=message),
58
64
  error_code="CLI_ERROR"
59
65
  )
60
66
  self.exit_code = exit_code
@@ -65,7 +71,7 @@ class ValidationError(AutoCoderSDKError):
65
71
 
66
72
  def __init__(self, field: str, message: str):
67
73
  super().__init__(
68
- f"Validation error for '{field}': {message}",
74
+ get_message_with_format("validation_error_field", field=field, message=message),
69
75
  error_code="VALIDATION_ERROR"
70
76
  )
71
77
  self.field = field
@@ -0,0 +1,19 @@
1
+ """
2
+ Auto-Coder SDK 格式化模块
3
+
4
+ 统一提供各种输入输出格式化功能。
5
+ """
6
+
7
+ from .output import OutputFormatter, format_output, format_table_output, format_error_output, format_progress_output
8
+ from .input import InputFormatter
9
+ from .stream import format_stream_output
10
+
11
+ __all__ = [
12
+ "OutputFormatter",
13
+ "InputFormatter",
14
+ "format_output",
15
+ "format_stream_output",
16
+ "format_table_output",
17
+ "format_error_output",
18
+ "format_progress_output",
19
+ ]