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
@@ -9,63 +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
- if not os.path.exists(".auto-coder") or not os.path.exists("actions"):
60
- subprocess.run(
61
- ["auto-coder", "init", "--source_dir", "."], check=True
62
- )
75
+ from autocoder.auto_coder_runner import init_project_if_required as init_project_if_required_buildin
76
+ init_project_if_required_buildin(self.project_root, "*")
63
77
 
64
78
  def call_run_auto_command(
65
79
  self,
66
80
  query: str,
67
81
  pre_commit: bool = False,
68
82
  pr: bool = False,
83
+ cancel_token: Optional[str] = None,
69
84
  extra_args: Optional[Dict[str, Any]] = None,
70
85
  stream: bool = True
71
86
  ) -> Iterator[StreamEvent]:
@@ -76,6 +91,7 @@ class AutoCoderBridge:
76
91
  query: 查询内容
77
92
  pre_commit: 是否预提交
78
93
  pr: 是否预提交
94
+ cancel_token: 取消令牌,用于中断执行
79
95
  extra_args: 额外参数
80
96
  stream: 是否流式返回
81
97
 
@@ -86,50 +102,105 @@ class AutoCoderBridge:
86
102
  BridgeError: 桥接层错误
87
103
  """
88
104
  try:
89
- # 切换到项目根目录
90
- original_cwd = os.getcwd()
91
- os.chdir(self.project_root)
92
-
93
105
  # 准备参数
94
106
  extra_args = extra_args or {}
95
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
+
96
123
  # 发送开始事件
97
124
  yield StreamEvent(
98
125
  event_type="start",
99
- 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}
100
129
  )
101
-
102
- try:
103
-
104
- configure(f"model:{self.options.model}")
105
- events = run_auto_command(
106
- query=query,
107
- pre_commit=pre_commit,
108
- pr=pr,
109
- extra_args=extra_args
110
- )
111
130
 
112
- # 如果返回的是生成器,逐个处理事件
113
- if hasattr(events, '__iter__') and not isinstance(events, (str, bytes)):
114
- for event in events:
115
- # 转换事件格式
116
- stream_event = self._convert_event_to_stream_event(
117
- event)
118
- if stream_event: # 只yield非None的事件
119
- yield stream_event
120
- else:
121
- # 如果不是生成器,包装成单个事件
122
- yield StreamEvent(
123
- event_type="content",
124
- data={"content": str(events)}
125
- )
126
-
127
- except (ImportError, FileNotFoundError, Exception) as e:
128
- # import traceback
129
- # traceback.print_exc()
130
- # 如果无法导入或出现其他错误
131
- raise BridgeError(
132
- 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)
133
204
 
134
205
  # 发送完成事件
135
206
  yield StreamEvent(
@@ -145,9 +216,6 @@ class AutoCoderBridge:
145
216
  )
146
217
  raise BridgeError(
147
218
  f"run_auto_command failed: {str(e)}", original_error=e)
148
- finally:
149
- # 恢复原始工作目录
150
- os.chdir(original_cwd)
151
219
 
152
220
  def _simulate_auto_command_response(self, query: str) -> Iterator[StreamEvent]:
153
221
  """
@@ -324,9 +392,22 @@ class AutoCoderBridge:
324
392
  )
325
393
 
326
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
+
327
408
  return StreamEvent(
328
409
  event_type="token_usage",
329
- data={"usage": getattr(event, 'usage', {})}
410
+ data={"usage": usage_data}
330
411
  )
331
412
 
332
413
  elif event_class_name == "WindowLengthChangeEvent":
@@ -342,6 +423,64 @@ class AutoCoderBridge:
342
423
  event, 'conversation_id', '')}
343
424
  )
344
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
+
345
484
  elif event_class_name == "PlanModeRespondEvent":
346
485
  result = ""
347
486
  if hasattr(event, 'completion'):
@@ -390,27 +529,29 @@ class AutoCoderBridge:
390
529
  Dict[str, Any]: 内存数据
391
530
  """
392
531
  try:
393
- original_cwd = os.getcwd()
394
- os.chdir(self.project_root)
395
-
396
- try:
397
- from autocoder.auto_coder_runner import get_memory
398
- memory_data = get_memory()
399
- return memory_data
400
- except ImportError:
401
- # 模拟内存数据
402
- return {
403
- "current_files": {"files": [], "groups": {}},
404
- "conf": {},
405
- "exclude_dirs": [],
406
- "mode": "auto_detect"
407
- }
408
-
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()
409
537
  except Exception as e:
410
538
  raise BridgeError(
411
539
  f"Failed to get memory: {str(e)}", original_error=e)
412
- finally:
413
- 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
+ }
414
555
 
415
556
  def save_memory(self, memory_data: Dict[str, Any]) -> None:
416
557
  """
@@ -420,23 +561,25 @@ class AutoCoderBridge:
420
561
  memory_data: 要保存的内存数据
421
562
  """
422
563
  try:
423
- original_cwd = os.getcwd()
424
- os.chdir(self.project_root)
425
-
426
- try:
427
- from autocoder.auto_coder_runner import save_memory, memory
428
- # 更新全局 memory 变量
429
- memory.update(memory_data)
430
- save_memory()
431
- except ImportError:
432
- # 模拟保存
433
- pass
434
-
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)
435
569
  except Exception as e:
436
570
  raise BridgeError(
437
571
  f"Failed to save memory: {str(e)}", original_error=e)
438
- finally:
439
- 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
440
583
 
441
584
  def get_project_config(self) -> Dict[str, Any]:
442
585
  """
@@ -446,22 +589,24 @@ class AutoCoderBridge:
446
589
  Dict[str, Any]: 项目配置
447
590
  """
448
591
  try:
449
- original_cwd = os.getcwd()
450
- os.chdir(self.project_root)
451
-
452
- try:
453
- from autocoder.auto_coder_runner import get_final_config
454
- config = get_final_config()
455
- return config.__dict__ if hasattr(config, '__dict__') else {}
456
- except ImportError:
457
- # 模拟配置
458
- return {"mock_config": True}
459
-
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()
460
597
  except Exception as e:
461
598
  raise BridgeError(
462
599
  f"Failed to get project config: {str(e)}", original_error=e)
463
- finally:
464
- 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}
465
610
 
466
611
  def setup_project_context(self) -> None:
467
612
  """设置项目上下文"""
@@ -475,20 +620,45 @@ class AutoCoderBridge:
475
620
  def cleanup(self) -> None:
476
621
  """清理资源"""
477
622
  try:
478
- original_cwd = os.getcwd()
479
- os.chdir(self.project_root)
480
-
481
- try:
482
- from autocoder.auto_coder_runner import stop
483
- stop()
484
- except ImportError:
485
- pass
486
-
623
+ if self.allow_chdir:
624
+ with temporary_chdir(self.project_root):
625
+ self._cleanup_internal()
626
+ else:
627
+ self._cleanup_internal()
487
628
  except Exception as e:
488
629
  # 清理失败不应该阻止程序继续运行,只记录错误
489
630
  print(f"Warning: Failed to cleanup resources: {str(e)}")
490
- finally:
491
- 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)
492
662
 
493
663
  def __enter__(self):
494
664
  """上下文管理器入口"""
@@ -498,3 +668,13 @@ class AutoCoderBridge:
498
668
  def __exit__(self, exc_type, exc_val, exc_tb):
499
669
  """上下文管理器出口"""
500
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
+ ]