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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of auto-coder might be problematic. Click here for more details.

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,454 @@
1
+ """终端应用核心类"""
2
+
3
+ import asyncio
4
+ from prompt_toolkit.formatted_text import FormattedText
5
+ from prompt_toolkit.styles import Style
6
+ from autocoder.version import __version__
7
+ from autocoder.chat_auto_coder_lang import get_message
8
+ from autocoder.common.international import get_message as get_i18n_message
9
+ from autocoder.common.global_cancel import (
10
+ global_cancel,
11
+ CancelRequestedException,
12
+ )
13
+ from autocoder.events.event_manager_singleton import gengerate_event_file_path
14
+ from autocoder.terminal.tasks.task_event import TaskEvent, CancellationRegistry
15
+ from autocoder.terminal.tasks.background import background_task
16
+ from autocoder.terminal.ui.completer import EnhancedCompleter
17
+ from autocoder.terminal.ui.keybindings import setup_keybindings
18
+ from autocoder.terminal.ui.toolbar import get_bottom_toolbar_func
19
+ from autocoder.terminal.ui.session import create_session
20
+ from autocoder.terminal.command_registry import CommandRegistry
21
+ from autocoder.terminal.command_processor import CommandProcessor
22
+ from autocoder.terminal.utils.errors import print_error
23
+
24
+
25
+ class TerminalApp:
26
+ """终端应用主类"""
27
+
28
+ def __init__(
29
+ self,
30
+ plugin_manager,
31
+ wrapped_functions,
32
+ configure_func,
33
+ show_help_func,
34
+ base_completer,
35
+ get_mode_func,
36
+ get_human_as_model_string_func,
37
+ get_agentic_mode_string_func,
38
+ cycle_mode_func,
39
+ toggle_human_as_model_func,
40
+ toggle_agentic_mode_func,
41
+ voice_input_func,
42
+ get_mcp_server_func,
43
+ stop_engine_func,
44
+ debug=False,
45
+ ):
46
+ self.plugin_manager = plugin_manager
47
+ self.wrapped_functions = wrapped_functions
48
+ self.configure = configure_func
49
+ self.show_help = show_help_func
50
+ self.base_completer = base_completer
51
+ self.get_mode = get_mode_func
52
+ self.get_human_as_model_string = get_human_as_model_string_func
53
+ self.get_agentic_mode_string = get_agentic_mode_string_func
54
+ self.cycle_mode = cycle_mode_func
55
+ self.toggle_human_as_model = toggle_human_as_model_func
56
+ self.toggle_agentic_mode = toggle_agentic_mode_func
57
+ self.voice_input = voice_input_func
58
+ self.get_mcp_server = get_mcp_server_func
59
+ self.stop_engine = stop_engine_func
60
+ self.debug = debug
61
+
62
+ # 初始化组件
63
+ self.task_event = TaskEvent()
64
+ self.registry = CancellationRegistry()
65
+ self.input_queue = asyncio.Queue()
66
+ self.busy_event = asyncio.Event()
67
+ self.busy_event.set() # 初始状态为空闲
68
+
69
+ # 创建命令处理器
70
+ self.command_processor = CommandProcessor(
71
+ plugin_manager=plugin_manager,
72
+ wrapped_functions=wrapped_functions,
73
+ configure_func=configure_func,
74
+ global_cancel=global_cancel,
75
+ show_help_func=show_help_func,
76
+ debug=debug,
77
+ )
78
+
79
+ # 创建命令注册表
80
+ self.command_registry = CommandRegistry()
81
+ self._register_commands()
82
+
83
+ # UI 组件(稍后初始化)
84
+ self.session = None
85
+ self.consumer_task = None
86
+ self.background_task_coro = None
87
+ self.stop_ev = asyncio.Event()
88
+
89
+ def _register_commands(self):
90
+ """注册所有命令"""
91
+ # 注意:按前缀长度排序,优先匹配更长的前缀
92
+ self.command_registry.register(
93
+ "/conf/export", self.command_processor.handle_conf_export
94
+ )
95
+ self.command_registry.register(
96
+ "/index/query", self.command_processor.handle_index_query
97
+ )
98
+ self.command_registry.register(
99
+ "/index/build", self.command_processor.handle_index_build
100
+ )
101
+ self.command_registry.register(
102
+ "/index/export", self.command_processor.handle_index_export
103
+ )
104
+ self.command_registry.register(
105
+ "/index/import", self.command_processor.handle_index_import
106
+ )
107
+
108
+ self.command_registry.register(
109
+ "/voice_input", self.command_processor.handle_voice_input_command
110
+ )
111
+ self.command_registry.register("/clear", self.command_processor.handle_clear)
112
+ self.command_registry.register("/cls", self.command_processor.handle_clear)
113
+ self.command_registry.register(
114
+ "/add_files", self.command_processor.handle_add_files
115
+ )
116
+ self.command_registry.register(
117
+ "/remove_files", self.command_processor.handle_remove_files
118
+ )
119
+ self.command_registry.register(
120
+ "/list_files", self.command_processor.handle_list_files
121
+ )
122
+ self.command_registry.register("/models", self.command_processor.handle_models)
123
+ self.command_registry.register("/mode", self.command_processor.handle_mode)
124
+ self.command_registry.register(
125
+ "/plugins", self.command_processor.handle_plugins
126
+ )
127
+ self.command_registry.register("/conf", self.command_processor.handle_conf)
128
+ self.command_registry.register("/revert", self.command_processor.handle_revert)
129
+ self.command_registry.register("/commit", self.command_processor.handle_commit)
130
+ self.command_registry.register("/help", self.command_processor.handle_help)
131
+ self.command_registry.register(
132
+ "/exclude_dirs", self.command_processor.handle_exclude_dirs
133
+ )
134
+ self.command_registry.register(
135
+ "/exclude_files", self.command_processor.handle_exclude_files
136
+ )
137
+ self.command_registry.register("/exit", self.command_processor.handle_exit)
138
+ self.command_registry.register("/coding", self.command_processor.handle_coding)
139
+ self.command_registry.register("/chat", self.command_processor.handle_chat)
140
+ self.command_registry.register("/design", self.command_processor.handle_design)
141
+ self.command_registry.register("/summon", self.command_processor.handle_summon)
142
+ self.command_registry.register("/lib", self.command_processor.handle_lib)
143
+ self.command_registry.register("/rules", self.command_processor.handle_rules)
144
+ self.command_registry.register("/mcp", self.command_processor.handle_mcp)
145
+ self.command_registry.register(
146
+ "/active_context", self.command_processor.handle_active_context
147
+ )
148
+ self.command_registry.register("/auto", self.command_processor.handle_auto)
149
+ self.command_registry.register("/debug", self.command_processor.handle_debug)
150
+ self.command_registry.register(
151
+ "/shell", self.command_processor.handle_shell_command
152
+ )
153
+ self.command_registry.register(
154
+ "/workflow", self.command_processor.handle_workflow
155
+ )
156
+
157
+ # 兜底处理器
158
+ self.command_registry.set_fallback(
159
+ self.command_processor.handle_unknown_or_fallback
160
+ )
161
+
162
+ async def process_user_input(
163
+ self, user_input: str, new_prompt_callback, session=None
164
+ ):
165
+ """处理用户输入的异步函数"""
166
+ try:
167
+ # 预处理输入
168
+ user_input = self.command_processor.preprocess_input(user_input)
169
+
170
+ # 1. 如果用户输入 /shell(无参数),启动一个子 shell
171
+ if user_input == "/shell":
172
+ await self.command_processor.handle_shell_enter(
173
+ user_input, {"session": session}
174
+ )
175
+ return
176
+
177
+ # 2. 如果以 ! 开头,当作单行 shell 命令执行
178
+ if user_input.startswith("!"):
179
+ await self.command_processor.handle_shell_single(
180
+ user_input, {"session": session}
181
+ )
182
+ return
183
+
184
+ # 3. 尝试插件处理
185
+ context = {"session": session, "new_prompt_callback": new_prompt_callback}
186
+ if self.command_processor.handle_plugin_command(user_input, context):
187
+ return
188
+
189
+ # 4. Shell 模式处理
190
+ if await self.command_processor.handle_shell_mode(user_input, context):
191
+ return
192
+
193
+ # 5. 自动检测模式
194
+ if self.command_processor.handle_auto_detect_mode(user_input, context):
195
+ return
196
+
197
+ # 6. 语音输入模式
198
+ if self.command_processor.handle_voice_input_mode(user_input, context):
199
+ return
200
+
201
+ # 7. 使用命令注册表分发命令
202
+ await self.command_registry.dispatch(user_input, context)
203
+
204
+ except EOFError:
205
+ # 重新抛出这些异常,让主循环处理
206
+ raise
207
+ except asyncio.CancelledError:
208
+ # 原生取消,向上抛出让上层统一处理
209
+ raise
210
+ except (CancelRequestedException, KeyboardInterrupt):
211
+ pass
212
+ except Exception as e:
213
+ print_error("1", e, self.debug)
214
+
215
+ async def consumer_loop(self):
216
+ """后台处理用户输入的消费者协程"""
217
+ while True:
218
+ is_queue_geted = False
219
+ event_file = None
220
+ try:
221
+ # 给队列获取操作添加超时,让消费者有机会响应取消请求
222
+ try:
223
+ user_input, new_prompt_callback, session = await asyncio.wait_for(
224
+ self.input_queue.get(), timeout=1.0
225
+ )
226
+ is_queue_geted = True
227
+ except asyncio.TimeoutError:
228
+ # 超时后短暂休眠,然后继续循环等待
229
+ await asyncio.sleep(0.1)
230
+ continue
231
+
232
+ # 设置任务状态为已开始
233
+ self.task_event.set_state("started")
234
+ self.busy_event.clear() # 标记为忙碌
235
+
236
+ # 设置任务状态为运行中
237
+ self.task_event.set_state("running")
238
+
239
+ # 为每个请求创建 Task 并注册
240
+ event_file, _ = gengerate_event_file_path()
241
+ global_cancel.register_token(event_file)
242
+
243
+ task = asyncio.create_task(
244
+ self.process_user_input(user_input, new_prompt_callback, session)
245
+ )
246
+ self.registry.register(event_file, task)
247
+
248
+ try:
249
+ await task
250
+ except asyncio.CancelledError:
251
+ # Task 被取消,向上传播
252
+ raise
253
+ except CancelRequestedException:
254
+ # 兼容旧的取消机制
255
+ pass
256
+ finally:
257
+ self.registry.unregister(event_file)
258
+ global_cancel.reset_token(event_file)
259
+
260
+ # 触发任务完成回调(虽然当前为空,但保持与原代码一致)
261
+ # await trigger_task_completion_callbacks()
262
+
263
+ # 设置任务状态为已完成
264
+ self.task_event.set_state("completed")
265
+
266
+ except KeyboardInterrupt:
267
+ # 消费者收到 KeyboardInterrupt(不太可能直接收到,但保持兼容)
268
+ # 设置取消标志并清理状态
269
+ global_cancel.set_active_tokens()
270
+ self.task_event.set_state("completed")
271
+ continue
272
+ except asyncio.CancelledError:
273
+ break
274
+ except Exception as e:
275
+ if self.debug:
276
+ import traceback
277
+
278
+ traceback.print_exc()
279
+ continue
280
+ finally:
281
+ self.busy_event.set() # 标记为空闲
282
+ if is_queue_geted:
283
+ self.input_queue.task_done()
284
+ # 确保任务状态最终被重置
285
+ if self.task_event.get_state() != "completed":
286
+ self.task_event.set_state("completed")
287
+
288
+ async def run(self):
289
+ """运行终端应用"""
290
+ # 创建 UI 组件
291
+ kb = setup_keybindings(
292
+ self.plugin_manager,
293
+ self.voice_input,
294
+ self.cycle_mode,
295
+ self.toggle_human_as_model,
296
+ self.toggle_agentic_mode,
297
+ self.configure,
298
+ )
299
+
300
+ toolbar_func = get_bottom_toolbar_func(
301
+ self.get_mode,
302
+ self.get_human_as_model_string,
303
+ self.get_agentic_mode_string,
304
+ self.plugin_manager,
305
+ )
306
+
307
+ enhanced_completer = EnhancedCompleter(self.base_completer, self.plugin_manager)
308
+
309
+ self.session = create_session(enhanced_completer, kb, toolbar_func)
310
+
311
+ # 启动消费者协程
312
+ self.consumer_task = asyncio.create_task(self.consumer_loop())
313
+
314
+ # 启动后台任务
315
+ self.background_task_coro = asyncio.create_task(
316
+ background_task(self.stop_ev, self.session, self.debug)
317
+ )
318
+
319
+ # 样式定义
320
+ style = Style.from_dict(
321
+ {
322
+ "username": "#884444",
323
+ "at": "#00aa00",
324
+ "colon": "#0000aa",
325
+ "pound": "#00aa00",
326
+ "host": "#00ffff bg:#444400",
327
+ "busy": "#ff6600 italic",
328
+ }
329
+ )
330
+
331
+ # 显示启动信息
332
+ print(
333
+ f"""
334
+ \033[1;32m ____ _ _ _ _ ____ _
335
+ / ___| |__ __ _| |_ / \\ _ _| |_ ___ / ___|___ __| | ___ _ __
336
+ | | | '_ \\ / _` | __|____ / _ \\| | | | __/ _ \\ _____| | / _ \\ / _` |/ _ \\ '__|
337
+ | |___| | | | (_| | ||_____/ ___ \\ |_| | || (_) |_____| |__| (_) | (_| | __/ |
338
+ \\____|_| |_|\\__,_|\\__| /_/ \\_\\__,_|\\__\\___/ \\____\\___/ \\__,_|\\___|_|
339
+ v{__version__}
340
+ \033[0m"""
341
+ )
342
+ print(f"\033[1;34m{get_message('type_help_to_see_commands')}\033[0m\n")
343
+
344
+ # 显示插件信息
345
+ if self.plugin_manager.plugins:
346
+ print(f"\033[1;34m{get_message('loaded_plugins_title')}\033[0m")
347
+ for name, plugin in self.plugin_manager.plugins.items():
348
+ print(f" - {name} (v{plugin.version}): {plugin.description}")
349
+ print()
350
+
351
+ self.show_help()
352
+
353
+ # 用于设置新提示的回调函数
354
+ new_prompt = ""
355
+
356
+ def set_new_prompt(prompt):
357
+ nonlocal new_prompt
358
+ new_prompt = prompt
359
+
360
+ # 主交互循环
361
+ while True:
362
+ task_state = self.task_event.get_state()
363
+ try:
364
+ # 根据任务状态控制是否渲染prompt
365
+ if task_state in ["started", "running", "pending"]:
366
+ # 任务运行中,不显示prompt,跳过此次循环
367
+ # 使用 sleep 让循环有机会响应 Ctrl+C
368
+ await asyncio.sleep(0.1)
369
+ continue
370
+ else:
371
+ prompt_message = [
372
+ ("class:username", "coding"),
373
+ ("class:at", "@"),
374
+ ("class:host", "auto-coder.chat"),
375
+ ("class:colon", ":"),
376
+ ("class:path", "~"),
377
+ ("class:dollar", "$ "),
378
+ ]
379
+
380
+ if new_prompt:
381
+ user_input = await self.session.prompt_async(
382
+ FormattedText(prompt_message), default=new_prompt, style=style
383
+ )
384
+ new_prompt = ""
385
+ else:
386
+ user_input = await self.session.prompt_async(
387
+ FormattedText(prompt_message), style=style
388
+ )
389
+
390
+ if user_input.strip() == "/exit":
391
+ raise EOFError()
392
+
393
+ # 将输入放入队列
394
+ if user_input.strip():
395
+ await self.input_queue.put(
396
+ (user_input, set_new_prompt, self.session)
397
+ )
398
+ self.task_event.set_state("pending")
399
+
400
+ except (KeyboardInterrupt, asyncio.CancelledError):
401
+ # 按 Ctrl+C 取消当前任务
402
+ global_cancel.set_active_tokens()
403
+ continue
404
+ except CancelRequestedException:
405
+ continue
406
+ except EOFError:
407
+ break
408
+ except Exception as e:
409
+ print_error("2", e, self.debug)
410
+
411
+ # 清理
412
+ await self.shutdown()
413
+
414
+ async def shutdown(self):
415
+ """关闭应用并清理资源"""
416
+ exit_msg = get_i18n_message("exit_ctrl_d")
417
+ print(f"\n\033[93m{exit_msg}\033[0m")
418
+
419
+ # 通知后台任务停止
420
+ self.stop_ev.set()
421
+
422
+ # 取消消费者任务
423
+ if self.consumer_task:
424
+ self.consumer_task.cancel()
425
+ try:
426
+ await self.consumer_task
427
+ except asyncio.CancelledError:
428
+ pass
429
+
430
+ # 取消后台任务
431
+ if self.background_task_coro:
432
+ self.background_task_coro.cancel()
433
+ try:
434
+ await self.background_task_coro
435
+ except asyncio.CancelledError:
436
+ pass
437
+
438
+ # 清理资源
439
+ try:
440
+ # 关闭所有插件
441
+ self.plugin_manager.shutdown_all()
442
+ # 停止 MCP 服务器
443
+ try:
444
+ if self.get_mcp_server():
445
+ self.get_mcp_server().stop()
446
+ except Exception:
447
+ pass
448
+ # 停止引擎
449
+ self.stop_engine()
450
+ except Exception as e:
451
+ print_error("3 (cleanup)", e, self.debug)
452
+
453
+ goodbye_msg = get_i18n_message("goodbye")
454
+ print(f"\n\033[93m{goodbye_msg}\033[0m")
@@ -0,0 +1,32 @@
1
+ """命令行参数解析"""
2
+
3
+ import argparse
4
+
5
+
6
+ def parse_arguments():
7
+ """解析命令行参数"""
8
+ parser = argparse.ArgumentParser(description="Chat Auto Coder")
9
+ parser.add_argument("--debug", action="store_true", help="Enable debug mode")
10
+ parser.add_argument(
11
+ "--quick",
12
+ action="store_true",
13
+ help="Enter the auto-coder.chat without initializing the system",
14
+ )
15
+
16
+ parser.add_argument(
17
+ "--skip_provider_selection",
18
+ action="store_true",
19
+ help="Skip the provider selection",
20
+ )
21
+
22
+ parser.add_argument(
23
+ "--product_mode",
24
+ type=str,
25
+ default="lite",
26
+ help="The mode of the auto-coder.chat, lite/pro default is lite",
27
+ )
28
+
29
+ parser.add_argument("--lite", action="store_true", help="Lite mode")
30
+ parser.add_argument("--pro", action="store_true", help="Pro mode")
31
+
32
+ return parser.parse_args()
@@ -0,0 +1,178 @@
1
+ """引导模块 - 初始化系统并启动应用"""
2
+
3
+ import asyncio
4
+ import os
5
+ from pathlib import Path
6
+ from autocoder.auto_coder_runner import (
7
+ load_tokenizer,
8
+ initialize_system,
9
+ InitializeSystemRequest,
10
+ configure,
11
+ start as start_engine,
12
+ completer,
13
+ ask,
14
+ coding,
15
+ chat,
16
+ design,
17
+ voice_input,
18
+ auto_command,
19
+ run_agentic,
20
+ execute_shell_command,
21
+ active_context,
22
+ get_mcp_server,
23
+ stop as stop_engine,
24
+ )
25
+ from autocoder.common.core_config import (
26
+ cycle_mode,
27
+ get_mode,
28
+ set_mode,
29
+ toggle_human_as_model,
30
+ get_human_as_model_string,
31
+ toggle_agentic_mode,
32
+ get_agentic_mode_string,
33
+ )
34
+ from autocoder.plugins import PluginManager
35
+ from autocoder.chat_auto_coder_lang import (
36
+ get_message,
37
+ get_message_with_format as get_message_with_format_local,
38
+ )
39
+ from autocoder.terminal.args import parse_arguments
40
+ from autocoder.terminal.help import show_help
41
+ from autocoder.terminal.app import TerminalApp
42
+
43
+
44
+ def load_builtin_plugins(plugin_manager):
45
+ """加载内置插件"""
46
+ try:
47
+ # 发现所有可用的插件
48
+ discovered_plugins = plugin_manager.discover_plugins()
49
+
50
+ # 排除的示例插件列表
51
+ excluded_plugins = {
52
+ "autocoder.plugins.dynamic_completion_example",
53
+ "autocoder.plugins.sample_plugin",
54
+ }
55
+
56
+ # 自动加载内置插件(在autocoder.plugins模块中的插件)
57
+ builtin_loaded = 0
58
+ for plugin_class in discovered_plugins:
59
+ module_name = plugin_class.__module__
60
+ if (
61
+ module_name.startswith("autocoder.plugins.")
62
+ and not module_name.endswith(".__init__")
63
+ and module_name not in excluded_plugins
64
+ ):
65
+ try:
66
+ if plugin_manager.load_plugin(plugin_class):
67
+ builtin_loaded += 1
68
+ print(f"✓ Loaded builtin plugin: {plugin_class.plugin_name()}")
69
+ except Exception as e:
70
+ print(
71
+ f"✗ Failed to load builtin plugin {plugin_class.plugin_name()}: {e}"
72
+ )
73
+
74
+ if builtin_loaded > 0:
75
+ print(
76
+ get_message_with_format_local(
77
+ "loaded_plugins_builtin", count=builtin_loaded
78
+ )
79
+ )
80
+ else:
81
+ print(get_message("no_builtin_plugins_loaded"))
82
+
83
+ except Exception as e:
84
+ print(f"Error loading builtin plugins: {e}")
85
+
86
+
87
+ def run_cli():
88
+ """CLI 入口函数"""
89
+ # 加载 tokenizer
90
+ load_tokenizer()
91
+
92
+ # 解析参数
93
+ args = parse_arguments()
94
+
95
+ # 处理 lite/pro 模式
96
+ if args.lite:
97
+ args.product_mode = "lite"
98
+ if args.pro:
99
+ args.product_mode = "pro"
100
+
101
+ # 初始化系统(如果不是 quick 模式)
102
+ if not args.quick:
103
+ initialize_system(
104
+ InitializeSystemRequest(
105
+ product_mode=args.product_mode,
106
+ skip_provider_selection=args.skip_provider_selection,
107
+ debug=args.debug,
108
+ quick=args.quick,
109
+ lite=args.lite,
110
+ pro=args.pro,
111
+ )
112
+ )
113
+
114
+ # 启动引擎
115
+ start_engine()
116
+
117
+ # 初始化插件系统
118
+ plugin_manager = PluginManager()
119
+ plugin_manager.load_global_plugin_dirs()
120
+
121
+ # 添加内置插件目录
122
+ plugins_dir = Path(__file__).parent.parent / "plugins"
123
+ plugin_manager.add_global_plugin_directory(str(plugins_dir))
124
+
125
+ # 加载保存的运行时配置
126
+ plugin_manager.load_runtime_cfg()
127
+
128
+ # 自动加载内置插件
129
+ load_builtin_plugins(plugin_manager)
130
+
131
+ # 配置 product_mode
132
+ configure(f"product_mode:{args.product_mode}")
133
+
134
+ # 创建原始函数字典
135
+ original_functions = {
136
+ "ask": ask,
137
+ "coding": coding,
138
+ "chat": chat,
139
+ "design": design,
140
+ "voice_input": voice_input,
141
+ "auto_command": auto_command,
142
+ "run_agentic": run_agentic,
143
+ "execute_shell_command": execute_shell_command,
144
+ "active_context": active_context,
145
+ }
146
+
147
+ # 创建 wrapped functions
148
+ wrapped_functions = {}
149
+ for func_name, original_func in original_functions.items():
150
+ wrapped_functions[func_name] = plugin_manager.wrap_function(
151
+ original_func, func_name
152
+ )
153
+
154
+ # 创建 show_help 函数
155
+ def show_help_func():
156
+ show_help(plugin_manager)
157
+
158
+ # 创建终端应用
159
+ app = TerminalApp(
160
+ plugin_manager=plugin_manager,
161
+ wrapped_functions=wrapped_functions,
162
+ configure_func=configure,
163
+ show_help_func=show_help_func,
164
+ base_completer=completer,
165
+ get_mode_func=get_mode,
166
+ get_human_as_model_string_func=get_human_as_model_string,
167
+ get_agentic_mode_string_func=get_agentic_mode_string,
168
+ cycle_mode_func=cycle_mode,
169
+ toggle_human_as_model_func=toggle_human_as_model,
170
+ toggle_agentic_mode_func=toggle_agentic_mode,
171
+ voice_input_func=wrapped_functions.get("voice_input"),
172
+ get_mcp_server_func=get_mcp_server,
173
+ stop_engine_func=stop_engine,
174
+ debug=args.debug,
175
+ )
176
+
177
+ # 运行应用
178
+ asyncio.run(app.run())