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
@@ -10,10 +10,13 @@ from pathlib import Path
10
10
  from typing import Optional, Dict, Any, List, Union
11
11
 
12
12
  from ..core import AutoCoderCore
13
- from ..models import AutoCodeOptions, Message
13
+ from ..models import AutoCodeOptions
14
+ from ..models.responses import CLIResult # 从正确的位置导入
14
15
  from ..exceptions import AutoCoderSDKError
15
- from .options import CLIOptions, CLIResult
16
- from .formatters import OutputFormatter, InputFormatter
16
+ from .options import CLIOptions
17
+ from ..formatters import OutputFormatter, InputFormatter, format_stream_output # 使用新的 formatters 模块
18
+ from autocoder.common.international import get_message
19
+ from autocoder.common.llm_friendly_package import get_package_manager
17
20
 
18
21
 
19
22
  class CommandHandler:
@@ -39,9 +42,18 @@ class CommandHandler:
39
42
  Returns:
40
43
  AutoCodeOptions实例
41
44
  """
45
+ # 处理 system_prompt 和 system_prompt_path
46
+ system_prompt = self.options.system_prompt
47
+ if self.options.system_prompt_path:
48
+ try:
49
+ with open(self.options.system_prompt_path, 'r', encoding='utf-8') as f:
50
+ system_prompt = f.read().strip()
51
+ except Exception as e:
52
+ raise ValueError(f"无法读取系统提示文件 {self.options.system_prompt_path}: {str(e)}")
53
+
42
54
  return AutoCodeOptions(
43
55
  max_turns=self.options.max_turns,
44
- system_prompt=self.options.system_prompt,
56
+ system_prompt=system_prompt,
45
57
  cwd=str(self.cwd),
46
58
  allowed_tools=self.options.allowed_tools,
47
59
  permission_mode=self.options.permission_mode,
@@ -50,7 +62,14 @@ class CommandHandler:
50
62
  session_id=self.options.resume_session,
51
63
  continue_session=self.options.continue_session,
52
64
  model=self.options.model,
53
- pr=self.options.pr
65
+ verbose=self.options.verbose,
66
+ include_rules=self.options.include_rules,
67
+ pr=self.options.pr,
68
+ is_sub_agent=self.options.is_sub_agent,
69
+ loop=self.options.loop,
70
+ loop_keep_conversation=self.options.loop_keep_conversation,
71
+ loop_additional_prompt=self.options.loop_additional_prompt,
72
+ include_libs=self.options.include_libs
54
73
  )
55
74
 
56
75
  def _get_prompt(self) -> str:
@@ -70,7 +89,7 @@ class CommandHandler:
70
89
  if not sys.stdin.isatty():
71
90
  content = sys.stdin.read()
72
91
  if not content.strip():
73
- raise ValueError("未提供提示内容且标准输入为空")
92
+ raise ValueError(get_message("prompt_not_provided_empty_stdin"))
74
93
 
75
94
  # 根据输入格式处理
76
95
  if self.options.input_format == "text":
@@ -92,7 +111,20 @@ class CommandHandler:
92
111
  # 对于流式输入,暂时只支持直接传递
93
112
  return content
94
113
  else:
95
- raise ValueError("未提供提示内容且没有标准输入")
114
+ raise ValueError(get_message("prompt_not_provided_no_stdin"))
115
+
116
+ def _add_libraries(self) -> None:
117
+ """自动添加指定的 LLM friendly packages"""
118
+ try:
119
+ manager = get_package_manager(str(self.cwd))
120
+
121
+ for lib_name in self.options.include_libs:
122
+ if lib_name.strip(): # 确保库名不为空
123
+ manager.add_library(lib_name.strip())
124
+
125
+ except Exception:
126
+ # 不抛出异常,只是静默失败,因为这不应该阻止主要功能
127
+ pass
96
128
 
97
129
 
98
130
  class PrintModeHandler(CommandHandler):
@@ -107,11 +139,16 @@ class PrintModeHandler(CommandHandler):
107
139
  """
108
140
  try:
109
141
  prompt = self._get_prompt()
142
+
143
+ # 自动添加指定的 LLM friendly packages
144
+ if self.options.include_libs:
145
+ self._add_libraries()
146
+
110
147
  core_options = self._create_core_options()
111
148
  core = AutoCoderCore(core_options)
112
149
 
113
150
  # 根据会话参数构建完整的 prompt
114
- final_prompt = self._build_prompt_with_session_context(prompt)
151
+ final_prompt = prompt
115
152
 
116
153
  # 根据输出格式选择不同的处理方式
117
154
  if self.options.output_format == "stream-json":
@@ -119,57 +156,53 @@ class PrintModeHandler(CommandHandler):
119
156
  result = asyncio.run(self._handle_stream(core, final_prompt))
120
157
  else:
121
158
  # 同步查询
122
- response = core.query_sync(final_prompt)
123
-
124
- # 格式化输出
125
159
  if self.options.output_format == "json":
126
- result = self.output_formatter.format_json(response)
127
- else:
128
- result = self.output_formatter.format_text(response)
160
+ # JSON格式:使用事件流方式,禁用终端输出
161
+ events = core.query_sync(final_prompt, show_terminal=False)
162
+ json_data = {
163
+ "events": [event.to_dict() for event in events],
164
+ "summary": {
165
+ "total_events": len(events),
166
+ "start_events": len([e for e in events if e.event_type == "start"]),
167
+ "completion_events": len([e for e in events if e.event_type == "completion"]),
168
+ "error_events": len([e for e in events if e.event_type == "error"])
169
+ }
170
+ }
171
+ result = self.output_formatter.format_json(json_data)
172
+ else:
173
+ events = core.query_sync(final_prompt, show_terminal=self.options.verbose)
174
+ completion_content = ""
175
+ for event in events:
176
+ if event.event_type == "tool_call" and event.data["tool_name"] == "AttemptCompletionTool":
177
+ completion_content = event.data["args"]["result"]
178
+ break
179
+
180
+ result = self.output_formatter.format_text(completion_content)
129
181
 
130
182
  return CLIResult(success=True, output=result)
131
183
 
132
184
  except Exception as e:
133
- return CLIResult(success=False, error=str(e))
134
-
135
- def _build_prompt_with_session_context(self, prompt: str) -> str:
136
- """
137
- 根据会话参数构建完整的 prompt。
185
+ return CLIResult(success=False, output="", error=str(e))
138
186
 
139
- Args:
140
- prompt: 原始提示内容
141
-
142
- Returns:
143
- str: 构建后的完整提示
144
- """
145
- if self.options.continue_session:
146
- # 继续当前对话
147
- return f"{prompt}" if prompt else ""
148
- elif self.options.resume_session:
149
- # 恢复特定会话
150
- return f"/resume {self.options.resume_session} {prompt}" if prompt else f"/resume {self.options.resume_session}"
151
- else:
152
- # 创建新对话
153
- return f"/new {prompt}"
154
187
 
155
188
  async def _handle_stream(self, core: AutoCoderCore, prompt: str) -> str:
156
189
  """
157
- 处理流式输出。
190
+ 处理流式输出,正常打印所有事件。
158
191
 
159
192
  Args:
160
193
  core: AutoCoderCore实例
161
194
  prompt: 提示内容
162
195
 
163
196
  Returns:
164
- 处理结果
197
+ 空字符串
165
198
  """
166
- result = []
167
- async for message in core.query_stream(prompt):
168
- formatted = await anext(self.output_formatter.format_stream_json([message]))
169
- result.append(formatted)
170
- # 实时输出到stdout
171
- print(formatted, flush=True)
172
-
173
- return "\n".join(result)
199
+ # 使用 query_stream 方法获取 StreamEvent 流,正常打印所有事件
200
+ async for event in core.query_stream(prompt, show_terminal=True):
201
+ # 所有事件都会通过 core.query_stream 的内部渲染机制正常打印
202
+ # 这里不需要额外的打印逻辑
203
+ pass
204
+
205
+ # 返回空字符串
206
+ return ""
174
207
 
175
208
 
autocoder/sdk/cli/main.py CHANGED
@@ -3,21 +3,21 @@ CLI 主入口点模块
3
3
 
4
4
  提供命令行接口的主要实现,处理参数解析和命令执行。
5
5
  """
6
-
7
6
  import sys
7
+ import os
8
8
  import argparse
9
- from pathlib import Path
10
- from typing import Optional, List, Dict, Any, Union
9
+ from typing import Optional, List
10
+ from .options import CLIOptions, get_default_async_workdir
11
+ from ..models.responses import CLIResult
12
+ from .handlers import PrintModeHandler
13
+ from autocoder.run_context import get_run_context,RunMode
14
+ from autocoder.common.international import get_message, get_message_with_format
15
+ from autocoder.common.file_monitor import FileMonitor
16
+ import os
11
17
 
12
- try:
13
- import argcomplete
14
- ARGCOMPLETE_AVAILABLE = True
15
- except ImportError:
16
- ARGCOMPLETE_AVAILABLE = False
18
+ # 设置运行模式为终端模式
19
+ get_run_context().set_mode(RunMode.CLI)
17
20
 
18
- from .options import CLIOptions, CLIResult
19
- from .handlers import PrintModeHandler
20
- from ..exceptions import AutoCoderSDKError
21
21
 
22
22
 
23
23
  class AutoCoderCLI:
@@ -29,7 +29,7 @@ class AutoCoderCLI:
29
29
 
30
30
  def run(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
31
31
  """
32
- 运行CLI命令 - 统一使用 Print Mode。
32
+ 运行CLI命令。
33
33
 
34
34
  Args:
35
35
  options: CLI选项
@@ -39,14 +39,57 @@ class AutoCoderCLI:
39
39
  命令执行结果
40
40
  """
41
41
  try:
42
- # 验证选项
43
- options.validate()
42
+ # 验证选项
43
+ options.validate()
44
+
45
+ # 根据命令类型分发处理
46
+ if options.command == "config":
47
+ return self.handle_config_command(options, cwd)
48
+ else:
49
+ # 默认处理代码生成命令
50
+ return self.handle_print_mode(options, cwd)
51
+
52
+ except Exception as e:
53
+ return CLIResult(success=False, output="", error=str(e))
54
+
55
+ def handle_config_command(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
56
+ """
57
+ 处理 config 命令。
58
+
59
+ Args:
60
+ options: CLI选项
61
+ cwd: 当前工作目录
62
+
63
+ Returns:
64
+ 命令执行结果
65
+ """
66
+ try:
67
+ from autocoder.auto_coder_runner import configure
68
+
69
+ if not options.config_args:
70
+ return CLIResult(success=False, output="", error="配置参数不能为空。用法: auto-coder.run config model=v3_chat")
44
71
 
45
- # 移除模式判断,直接使用 PrintModeHandler
46
- return self.handle_print_mode(options, cwd)
72
+ # 处理每个配置参数
73
+ results = []
74
+ for config_arg in options.config_args:
75
+ if "=" not in config_arg:
76
+ return CLIResult(success=False, output="", error=f"配置参数格式错误: {config_arg}。应使用 key=value 格式")
47
77
 
78
+ # 将 key=value 转换为 key:value 格式(configure 函数需要的格式)
79
+ key, value = config_arg.split("=", 1)
80
+ config_str = f"{key.strip()}:{value.strip()}"
81
+
82
+ try:
83
+ configure(config_str, skip_print=True)
84
+ results.append(f"✓ 配置成功: {key.strip()} = {value.strip()}")
85
+ except Exception as e:
86
+ return CLIResult(success=False, output="", error=f"配置失败 {config_str}: {str(e)}")
87
+
88
+ output = "\n".join(results)
89
+ return CLIResult(success=True, output=output)
90
+
48
91
  except Exception as e:
49
- return CLIResult(success=False, error=str(e))
92
+ return CLIResult(success=False, output="", error=get_message_with_format("config_command_failed", error=str(e)))
50
93
 
51
94
  def handle_print_mode(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
52
95
  """
@@ -59,8 +102,14 @@ class AutoCoderCLI:
59
102
  Returns:
60
103
  命令执行结果
61
104
  """
62
- handler = PrintModeHandler(options, cwd)
63
- return handler.handle()
105
+ # 检查是否启用异步模式
106
+ if options.async_mode:
107
+ from ..async_runner.async_handler import AsyncAgentHandler
108
+ handler = AsyncAgentHandler(options, cwd)
109
+ return handler.handle()
110
+ else:
111
+ handler = PrintModeHandler(options, cwd)
112
+ return handler.handle()
64
113
 
65
114
 
66
115
  @classmethod
@@ -75,65 +124,80 @@ class AutoCoderCLI:
75
124
  解析后的CLI选项
76
125
  """
77
126
  parser = argparse.ArgumentParser(
78
- description="Auto-Coder 命令行工具",
127
+ description=get_message("cli_description"),
79
128
  formatter_class=argparse.RawDescriptionHelpFormatter,
80
- epilog="""
81
- 示例:
82
- # 基本使用
83
- auto-coder.run "Write a function to calculate Fibonacci numbers" --model gpt-4
84
-
85
- # 通过管道提供输入
86
- echo "Explain this code" | auto-coder.run --model gpt-4
87
-
88
- # 指定输出格式
89
- auto-coder.run "Generate a hello world function" --output-format json --model gpt-4
90
-
91
- # 继续最近的对话
92
- auto-coder.run --continue "继续修改代码" --model gpt-4
93
-
94
- # 恢复特定会话
95
- auto-coder.run --resume 550e8400-e29b-41d4-a716-446655440000 "新的请求" --model gpt-4
96
-
97
- # 组合使用多个选项
98
- auto-coder.run "Optimize this code" --model claude-3-sonnet --max-turns 5 --verbose
99
- """
129
+ epilog=get_message("cli_examples")
100
130
  )
101
131
 
132
+ # 创建子命令解析器
133
+ subparsers = parser.add_subparsers(dest="command", help=get_message("help_available_commands"))
134
+
135
+ # config 子命令
136
+ config_parser = subparsers.add_parser("config", help=get_message("help_config_command"))
137
+ config_parser.add_argument("config_args", nargs="*", help=get_message("help_config_args"))
138
+
139
+ # 默认命令(代码生成)- 当没有子命令时使用
102
140
  # 会话选项(移除模式选择,--continue 和 --resume 作为独立参数)
103
141
  parser.add_argument("-c", "--continue", dest="continue_session", action="store_true",
104
- help="继续最近的对话")
142
+ help=get_message("help_continue_session"))
105
143
  parser.add_argument("-r", "--resume", dest="resume_session", metavar="SESSION_ID",
106
- help="恢复特定会话")
144
+ help=get_message("help_resume_session"))
107
145
 
108
146
  # 输入输出选项
109
- parser.add_argument("prompt", nargs="?", help="提示内容,如果未提供则从stdin读取")
147
+ parser.add_argument("prompt", nargs="?", help=get_message("help_prompt"))
110
148
  parser.add_argument("--output-format", choices=["text", "json", "stream-json"],
111
- default="text", help="输出格式 (默认: text)")
149
+ default="text", help=get_message("help_output_format"))
112
150
  parser.add_argument("--input-format", choices=["text", "json", "stream-json"],
113
- default="text", help="输入格式 (默认: text)")
114
- parser.add_argument("-v", "--verbose", action="store_true", help="输出详细信息")
151
+ default="text", help=get_message("help_input_format"))
152
+ parser.add_argument("-v", "--verbose", action="store_true", help=get_message("help_verbose"))
115
153
 
116
154
  # 高级选项
117
- advanced = parser.add_argument_group("高级选项")
118
- advanced.add_argument("--max-turns", type=int, default= -1, help="最大对话轮数 (默认: -1 不限制)")
119
- advanced.add_argument("--system-prompt", help="系统提示")
120
- advanced.add_argument("--allowed-tools", nargs="+", help="允许使用的工具列表")
155
+ advanced = parser.add_argument_group(get_message("help_advanced_options"))
156
+ advanced.add_argument("--max-turns", type=int, default= 10000, help=get_message("help_max_turns"))
157
+ advanced.add_argument("--system-prompt", help=get_message("help_system_prompt"))
158
+ advanced.add_argument("--system-prompt-path", help=get_message("help_system_prompt_path"))
159
+ advanced.add_argument("--allowed-tools", nargs="+", help=get_message("help_allowed_tools"))
121
160
  advanced.add_argument("--permission-mode", choices=["manual", "acceptEdits"],
122
- default="manual", help="权限模式 (默认: manual)")
123
- advanced.add_argument("--model", required=True, help="指定使用的模型名称 (如: gpt-4, gpt-3.5-turbo, claude-3-sonnet 等)")
124
- advanced.add_argument("--pr", action="store_true", help="创建 Pull Request")
161
+ default="manual", help=get_message("help_permission_mode"))
162
+ advanced.add_argument("--model", required=False, help=get_message("help_model"))
163
+ advanced.add_argument("--include-rules", action="store_true", help=get_message("help_include_rules"))
164
+ advanced.add_argument("--pr", action="store_true", help=get_message("help_pr"))
165
+ advanced.add_argument("--is-sub-agent", action="store_true", help=get_message("help_is_sub_agent"))
166
+ advanced.add_argument("--loop", type=int, default=1, help=get_message("help_loop"))
167
+ advanced.add_argument("--loop-keep-conversation", dest="loop_keep_conversation", action="store_true", help=get_message("help_loop_keep_conversation"))
168
+ advanced.add_argument("--loop-additional-prompt", dest="loop_additional_prompt", help=get_message("help_loop_additional_prompt"))
169
+ advanced.add_argument("--include-libs", dest="include_libs", help=get_message("help_include_libs"))
125
170
 
126
- # 启用自动补全
127
- if ARGCOMPLETE_AVAILABLE:
128
- # 添加自定义补全器
129
- cls._setup_completers(parser)
130
- argcomplete.autocomplete(parser)
171
+ # 异步代理运行器选项
172
+ async_group = parser.add_argument_group(get_message("help_async_group_title"))
173
+ async_group.add_argument("--async", dest="async_mode", action="store_true",
174
+ help=get_message("help_async_mode"))
175
+ async_group.add_argument("--split", dest="split_mode", choices=["h1", "h2", "h3", "any", "delimiter"],
176
+ default="h1", help=get_message("help_split_mode"))
177
+ async_group.add_argument("--delimiter", default="===",
178
+ help=get_message("help_delimiter"))
179
+ async_group.add_argument("--min-level", type=int, default=1,
180
+ help=get_message("help_min_level"))
181
+ async_group.add_argument("--max-level", type=int, default=3,
182
+ help=get_message("help_max_level"))
183
+ async_group.add_argument("--workdir", default=get_default_async_workdir(),
184
+ help=get_message("help_workdir"))
185
+ async_group.add_argument("--from", dest="from_branch", default="",
186
+ help=get_message("help_from_branch"))
187
+ async_group.add_argument("--bg", dest="bg_mode", action="store_true",
188
+ help=get_message("help_bg_mode"))
189
+ async_group.add_argument("--task-prefix", dest="task_prefix", default="",
190
+ help=get_message("help_task_prefix"))
191
+ async_group.add_argument("--worktree-name", dest="worktree_name",
192
+ help=get_message("help_worktree_name"))
131
193
 
132
194
  # 解析参数
133
195
  parsed_args = parser.parse_args(args)
134
196
 
135
197
  # 转换为CLIOptions
136
198
  options = CLIOptions(
199
+ command=getattr(parsed_args, 'command', None),
200
+ config_args=getattr(parsed_args, 'config_args', []),
137
201
  continue_session=parsed_args.continue_session,
138
202
  resume_session=parsed_args.resume_session,
139
203
  prompt=parsed_args.prompt,
@@ -142,120 +206,32 @@ class AutoCoderCLI:
142
206
  verbose=parsed_args.verbose,
143
207
  max_turns=parsed_args.max_turns,
144
208
  system_prompt=parsed_args.system_prompt,
209
+ system_prompt_path=getattr(parsed_args, 'system_prompt_path', None),
145
210
  allowed_tools=parsed_args.allowed_tools or [],
146
211
  permission_mode=parsed_args.permission_mode,
147
212
  model=parsed_args.model,
148
- pr=parsed_args.pr
213
+ include_rules=parsed_args.include_rules,
214
+ pr=parsed_args.pr,
215
+ is_sub_agent=parsed_args.is_sub_agent,
216
+ loop=parsed_args.loop,
217
+ loop_keep_conversation=parsed_args.loop_keep_conversation,
218
+ loop_additional_prompt=parsed_args.loop_additional_prompt,
219
+ include_libs=[lib.strip() for lib in parsed_args.include_libs.split(',')] if parsed_args.include_libs else [],
220
+ # 异步代理运行器相关参数
221
+ async_mode=parsed_args.async_mode,
222
+ split_mode=parsed_args.split_mode,
223
+ delimiter=parsed_args.delimiter,
224
+ min_level=parsed_args.min_level,
225
+ max_level=parsed_args.max_level,
226
+ workdir=parsed_args.workdir,
227
+ from_branch=parsed_args.from_branch,
228
+ bg_mode=parsed_args.bg_mode,
229
+ task_prefix=parsed_args.task_prefix,
230
+ worktree_name=parsed_args.worktree_name
149
231
  )
150
232
 
151
233
  return options
152
234
 
153
- @classmethod
154
- def _setup_completers(cls, parser: argparse.ArgumentParser) -> None:
155
- """设置自定义补全器"""
156
- if not ARGCOMPLETE_AVAILABLE:
157
- return
158
-
159
- # 为 --allowed-tools 参数设置补全器
160
- def tools_completer(prefix, parsed_args, **kwargs):
161
- """工具名称补全器"""
162
- available_tools = [
163
- "execute_command",
164
- "read_file",
165
- "write_to_file",
166
- "replace_in_file",
167
- "search_files",
168
- "list_files",
169
- "list_code_definition_names",
170
- "ask_followup_question",
171
- "attempt_completion",
172
- "list_package_info",
173
- "mcp_tool",
174
- "rag_tool"
175
- ]
176
- return [tool for tool in available_tools if tool.startswith(prefix)]
177
-
178
- # 为 --resume 参数设置会话ID补全器
179
- def session_id_completer(prefix, parsed_args, **kwargs):
180
- """会话ID补全器"""
181
- try:
182
- # 这里可以从会话存储中获取可用的会话ID
183
- # 目前返回示例会话ID格式
184
- return [
185
- "550e8400-e29b-41d4-a716-446655440000",
186
- "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
187
- "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
188
- ]
189
- except Exception:
190
- return []
191
-
192
- # 为 prompt 参数设置示例补全器
193
- def prompt_completer(prefix, parsed_args, **kwargs):
194
- """提示内容补全器"""
195
- common_prompts = [
196
- "Write a function to calculate Fibonacci numbers",
197
- "Explain this code",
198
- "Generate a hello world function",
199
- "Create a simple web page",
200
- "Write unit tests for this code",
201
- "Refactor this function",
202
- "Add error handling",
203
- "Optimize this algorithm",
204
- "Document this code",
205
- "Fix the bug in this code"
206
- ]
207
- return [prompt for prompt in common_prompts if prompt.lower().startswith(prefix.lower())]
208
-
209
- # 为 --model 参数设置模型名称补全器
210
- def model_completer(prefix, parsed_args, **kwargs):
211
- """模型名称补全器"""
212
- common_models = [
213
- # OpenAI models
214
- "gpt-4",
215
- "gpt-4-turbo",
216
- "gpt-4-turbo-preview",
217
- "gpt-4-0125-preview",
218
- "gpt-4-1106-preview",
219
- "gpt-3.5-turbo",
220
- "gpt-3.5-turbo-16k",
221
- "gpt-3.5-turbo-1106",
222
- # Anthropic models
223
- "claude-3-opus",
224
- "claude-3-sonnet",
225
- "claude-3-haiku",
226
- "claude-2.1",
227
- "claude-2.0",
228
- "claude-instant-1.2",
229
- # Google models
230
- "gemini-pro",
231
- "gemini-pro-vision",
232
- # Local/Open source models
233
- "llama2-7b",
234
- "llama2-13b",
235
- "llama2-70b",
236
- "codellama-7b",
237
- "codellama-13b",
238
- "codellama-34b",
239
- "mistral-7b",
240
- "mixtral-8x7b",
241
- # Azure OpenAI
242
- "azure-gpt-4",
243
- "azure-gpt-35-turbo",
244
- ]
245
- return [model for model in common_models if model.lower().startswith(prefix.lower())]
246
-
247
- # 应用补全器到对应的参数
248
- for action in parser._actions:
249
- if hasattr(action, 'dest'):
250
- if action.dest == 'allowed_tools':
251
- action.completer = tools_completer
252
- elif action.dest == 'resume_session':
253
- action.completer = session_id_completer
254
- elif action.dest == 'prompt':
255
- action.completer = prompt_completer
256
- elif action.dest == 'model':
257
- action.completer = model_completer
258
-
259
235
  @classmethod
260
236
  def main(cls) -> int:
261
237
  """
@@ -263,9 +239,9 @@ class AutoCoderCLI:
263
239
 
264
240
  Returns:
265
241
  退出码,0表示成功,非0表示失败
266
- """
267
- try:
268
- options = cls.parse_args()
242
+ """
243
+ try:
244
+ options = cls.parse_args()
269
245
  cli = cls()
270
246
  result = cli.run(options)
271
247
 
@@ -274,12 +250,24 @@ class AutoCoderCLI:
274
250
  print(result.output)
275
251
  return 0
276
252
  else:
277
- print(f"错误: {result.error}", file=sys.stderr)
253
+ print(get_message_with_format("error_prefix", error=result.error), file=sys.stderr)
278
254
  return 1
279
255
 
280
256
  except Exception as e:
281
- print(f"未处理的错误: {str(e)}", file=sys.stderr)
257
+ # 如果是 verbose 模式,打印完整的异常堆栈
258
+ if hasattr(options, 'verbose') and options.verbose:
259
+ import traceback
260
+ print(f"[DEBUG] Unhandled exception:", file=sys.stderr)
261
+ traceback.print_exc(file=sys.stderr)
262
+ print(get_message_with_format("unhandled_error", error=str(e)), file=sys.stderr)
282
263
  return 1
264
+
265
+ finally:
266
+ try:
267
+ FileMonitor(os.getcwd()).stop()
268
+ except Exception as e:
269
+ pass
270
+
283
271
 
284
272
 
285
273
  if __name__ == "__main__":