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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +970 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +288 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +932 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,521 @@
1
+ """命令处理器 - 处理各种用户命令"""
2
+
3
+ from pathlib import Path
4
+ import asyncio
5
+
6
+ from autocoder.common.terminal_paste import resolve_paste_placeholders
7
+ from autocoder.common.core_config import get_memory_manager
8
+ from autocoder.common.global_cancel import CancelRequestedException
9
+ from autocoder.events.event_manager_singleton import gengerate_event_file_path
10
+ from autocoder.terminal.utils.shell import get_shell, run_shell_command_async
11
+ from autocoder.chat_auto_coder_lang import get_message as get_message_lang
12
+ from autocoder.common.ac_style_command_parser import parse_query
13
+ from autocoder.common.international import get_message, get_message_with_format
14
+ from autocoder.workflow_agents import (
15
+ run_workflow_from_yaml,
16
+ print_workflow_result,
17
+ list_available_workflows,
18
+ )
19
+
20
+
21
+ class CommandProcessor:
22
+ """命令处理器类,封装所有命令处理逻辑"""
23
+
24
+ def __init__(
25
+ self,
26
+ plugin_manager,
27
+ wrapped_functions,
28
+ configure_func,
29
+ global_cancel,
30
+ show_help_func,
31
+ debug=False,
32
+ ):
33
+ self.plugin_manager = plugin_manager
34
+ self.wrapped_functions = wrapped_functions
35
+ self.configure = configure_func
36
+ self.global_cancel = global_cancel
37
+ self.show_help = show_help_func
38
+ self.debug = debug
39
+
40
+ # 从 wrapped_functions 中提取常用函数
41
+ self.run_agentic = wrapped_functions.get("run_agentic")
42
+ self.coding = wrapped_functions.get("coding")
43
+ self.chat = wrapped_functions.get("chat")
44
+ self.execute_shell_command = wrapped_functions.get("execute_shell_command")
45
+ self.voice_input = wrapped_functions.get("voice_input")
46
+ self.design = wrapped_functions.get("design")
47
+ self.active_context = wrapped_functions.get("active_context")
48
+
49
+ def preprocess_input(self, user_input: str) -> str:
50
+ """预处理用户输入"""
51
+ # 首先解析粘贴占位符
52
+ user_input = resolve_paste_placeholders(user_input)
53
+
54
+ # 处理 user_input 的空格
55
+ if user_input:
56
+ temp_user_input = user_input.lstrip() # 去掉左侧空格
57
+ if temp_user_input.startswith("/"):
58
+ user_input = temp_user_input
59
+
60
+ return user_input
61
+
62
+ async def handle_shell_enter(self, user_input: str, context: dict) -> bool:
63
+ """处理 /shell 命令(进入 shell)"""
64
+ session = context.get("session")
65
+ shell = get_shell()
66
+ await run_shell_command_async(shell, session)
67
+ return True
68
+
69
+ async def handle_shell_single(self, user_input: str, context: dict) -> bool:
70
+ """处理 ! 开头的单行 shell 命令"""
71
+ session = context.get("session")
72
+ command = user_input[1:] # 去掉 ! 前缀
73
+ await run_shell_command_async(command, session)
74
+ return True
75
+
76
+ def handle_plugin_command(self, user_input: str, context: dict) -> bool:
77
+ """尝试让插件处理命令"""
78
+ if user_input.startswith("/"):
79
+ plugin_result = self.plugin_manager.process_command(user_input)
80
+ if plugin_result:
81
+ plugin_name, handler, args = plugin_result
82
+ if handler:
83
+ handler(*args)
84
+ return True
85
+ return False
86
+
87
+ async def handle_shell_mode(self, user_input: str, context: dict) -> bool:
88
+ """处理 shell 模式下的输入"""
89
+ memory_manager = get_memory_manager()
90
+ if (
91
+ memory_manager.is_shell_mode()
92
+ and user_input
93
+ and not user_input.startswith("/")
94
+ ):
95
+ session = context.get("session")
96
+ shell = get_shell()
97
+ if session and hasattr(session, "app"):
98
+ try:
99
+ await session.app.run_system_command(
100
+ user_input, wait_for_enter=False
101
+ )
102
+ except Exception:
103
+ import subprocess
104
+
105
+ subprocess.call([shell, "-c", user_input])
106
+ else:
107
+ output = self.execute_shell_command(user_input)
108
+ if output:
109
+ print(output)
110
+ return True
111
+ return False
112
+
113
+ def handle_auto_detect_mode(self, user_input: str, context: dict) -> bool:
114
+ """处理自动检测模式"""
115
+ memory_manager = get_memory_manager()
116
+ if (
117
+ memory_manager.is_auto_detect_mode()
118
+ and user_input
119
+ and not user_input.startswith("/")
120
+ ):
121
+ event_file, file_id = gengerate_event_file_path()
122
+ self.configure(f"event_file:{event_file}")
123
+ self.global_cancel.register_token(event_file)
124
+ self.run_agentic(user_input, cancel_token=event_file)
125
+ return True
126
+ return False
127
+
128
+ def handle_voice_input_mode(self, user_input: str, context: dict) -> bool:
129
+ """处理语音输入模式"""
130
+ memory_manager = get_memory_manager()
131
+ new_prompt_callback = context.get("new_prompt_callback")
132
+
133
+ if memory_manager.is_voice_input_mode() and not user_input.startswith("/"):
134
+ text = self.voice_input()
135
+ if text:
136
+ new_prompt_callback("/coding " + text)
137
+ return True
138
+ return False
139
+
140
+ def handle_voice_input_command(self, user_input: str, context: dict) -> bool:
141
+ """/voice_input 命令"""
142
+ new_prompt_callback = context.get("new_prompt_callback")
143
+ text = self.voice_input()
144
+ if text:
145
+ new_prompt_callback("/coding " + text)
146
+ return True
147
+
148
+ def handle_clear(self, user_input: str, context: dict) -> bool:
149
+ """/clear 或 /cls 命令"""
150
+ print("\033c")
151
+ return True
152
+
153
+ def handle_add_files(self, user_input: str, context: dict) -> bool:
154
+ """/add_files 命令"""
155
+ from autocoder.auto_coder_runner import add_files
156
+
157
+ args = user_input[len("/add_files") :].strip().split()
158
+ add_files(args)
159
+ return True
160
+
161
+ def handle_remove_files(self, user_input: str, context: dict) -> bool:
162
+ """/remove_files 命令"""
163
+ from autocoder.auto_coder_runner import remove_files
164
+
165
+ file_names = user_input[len("/remove_files") :].strip().split(",")
166
+ remove_files(file_names)
167
+ return True
168
+
169
+ def handle_index_query(self, user_input: str, context: dict) -> bool:
170
+ """/index/query 命令"""
171
+ from autocoder.auto_coder_runner import index_query
172
+
173
+ query = user_input[len("/index/query") :].strip()
174
+ index_query(query)
175
+ return True
176
+
177
+ def handle_index_build(self, user_input: str, context: dict) -> bool:
178
+ """/index/build 命令"""
179
+ from autocoder.auto_coder_runner import index_build
180
+
181
+ event_file, file_id = gengerate_event_file_path()
182
+ self.configure(f"event_file:{event_file}")
183
+ self.global_cancel.register_token(event_file)
184
+ index_build()
185
+ return True
186
+
187
+ def handle_index_export(self, user_input: str, context: dict) -> bool:
188
+ """/index/export 命令"""
189
+ from autocoder.auto_coder_runner import index_export
190
+
191
+ export_path = user_input[len("/index/export") :].strip()
192
+ index_export(export_path)
193
+ return True
194
+
195
+ def handle_index_import(self, user_input: str, context: dict) -> bool:
196
+ """/index/import 命令"""
197
+ from autocoder.auto_coder_runner import index_import
198
+
199
+ import_path = user_input[len("/index/import") :].strip()
200
+ index_import(import_path)
201
+ return True
202
+
203
+ def handle_list_files(self, user_input: str, context: dict) -> bool:
204
+ """/list_files 命令"""
205
+ from autocoder.auto_coder_runner import list_files
206
+
207
+ list_files()
208
+ return True
209
+
210
+ def handle_models(self, user_input: str, context: dict) -> bool:
211
+ """/models 命令"""
212
+ from autocoder.chat.models_command import handle_models_command
213
+
214
+ query = user_input[len("/models") :].strip()
215
+ handle_models_command(query)
216
+ return True
217
+
218
+ def handle_mode(self, user_input: str, context: dict) -> bool:
219
+ """/mode 命令"""
220
+ from autocoder.common.core_config import get_mode, set_mode
221
+
222
+ conf = user_input[len("/mode") :].strip()
223
+ if not conf:
224
+ print(get_mode())
225
+ else:
226
+ set_mode(conf)
227
+ return True
228
+
229
+ def handle_conf_export(self, user_input: str, context: dict) -> bool:
230
+ """/conf/export 命令"""
231
+ from autocoder.common.conf_import_export import export_conf
232
+ import os
233
+
234
+ export_conf(os.getcwd(), user_input[len("/conf/export") :].strip() or ".")
235
+ return True
236
+
237
+ def handle_plugins(self, user_input: str, context: dict) -> bool:
238
+ """/plugins 命令"""
239
+ args = user_input[len("/plugins") :].strip().split()
240
+ result = self.plugin_manager.handle_plugins_command(args)
241
+ print(result, end="")
242
+ return True
243
+
244
+ def handle_conf(self, user_input: str, context: dict) -> bool:
245
+ """/conf 命令"""
246
+ from autocoder.chat.conf_command import handle_conf_command
247
+
248
+ command_args = user_input[len("/conf") :].strip()
249
+ result_message = handle_conf_command(command_args)
250
+ print(result_message)
251
+ return True
252
+
253
+ def handle_revert(self, user_input: str, context: dict) -> bool:
254
+ """/revert 命令"""
255
+ from autocoder.auto_coder_runner import revert
256
+
257
+ revert()
258
+ return True
259
+
260
+ def handle_commit(self, user_input: str, context: dict) -> bool:
261
+ """/commit 命令"""
262
+ from autocoder.auto_coder_runner import commit
263
+
264
+ query = user_input[len("/commit") :].strip()
265
+ commit(query)
266
+ return True
267
+
268
+ def handle_help(self, user_input: str, context: dict) -> bool:
269
+ """/help 命令"""
270
+ query = user_input[len("/help") :].strip()
271
+ if not query:
272
+ self.show_help()
273
+ else:
274
+ from autocoder.auto_coder_runner import help
275
+
276
+ help(query)
277
+ return True
278
+
279
+ def handle_exclude_dirs(self, user_input: str, context: dict) -> bool:
280
+ """/exclude_dirs 命令"""
281
+ from autocoder.auto_coder_runner import exclude_dirs
282
+
283
+ dir_names = user_input[len("/exclude_dirs") :].strip().split(",")
284
+ exclude_dirs(dir_names)
285
+ return True
286
+
287
+ def handle_exclude_files(self, user_input: str, context: dict) -> bool:
288
+ """/exclude_files 命令"""
289
+ from autocoder.auto_coder_runner import exclude_files
290
+
291
+ query = user_input[len("/exclude_files") :].strip()
292
+ exclude_files(query)
293
+ return True
294
+
295
+ def handle_exit(self, user_input: str, context: dict) -> None:
296
+ """/exit 命令"""
297
+ raise EOFError()
298
+
299
+ def handle_coding(self, user_input: str, context: dict) -> bool:
300
+ """/coding 命令"""
301
+ event_file, file_id = gengerate_event_file_path()
302
+ self.configure(f"event_file:{event_file}")
303
+ self.global_cancel.register_token(event_file)
304
+ query = user_input[len("/coding") :].strip()
305
+ if not query:
306
+ print(f"\033[91m{get_message_lang('please_enter_request')}\033[0m")
307
+ return True
308
+ self.coding(query, cancel_token=event_file)
309
+ return True
310
+
311
+ def handle_chat(self, user_input: str, context: dict) -> bool:
312
+ """/chat 命令"""
313
+ event_file, file_id = gengerate_event_file_path()
314
+ self.configure(f"event_file:{event_file}")
315
+ self.global_cancel.register_token(event_file)
316
+ query = user_input[len("/chat") :].strip()
317
+ if not query:
318
+ print(f"\033[91m{get_message_lang('please_enter_request')}\033[0m")
319
+ else:
320
+ self.chat(query)
321
+ return True
322
+
323
+ def handle_design(self, user_input: str, context: dict) -> bool:
324
+ """/design 命令"""
325
+ query = user_input[len("/design") :].strip()
326
+ if not query:
327
+ print(f"\033[91m{get_message_lang('please_enter_design_request')}\033[0m")
328
+ else:
329
+ self.design(query)
330
+ return True
331
+
332
+ def handle_summon(self, user_input: str, context: dict) -> bool:
333
+ """/summon 命令"""
334
+ from autocoder.auto_coder_runner import summon
335
+
336
+ query = user_input[len("/summon") :].strip()
337
+ if not query:
338
+ print(f"\033[91m{get_message_lang('please_enter_request')}\033[0m")
339
+ else:
340
+ summon(query)
341
+ return True
342
+
343
+ def handle_lib(self, user_input: str, context: dict) -> bool:
344
+ """/lib 命令"""
345
+ from autocoder.auto_coder_runner import lib_command
346
+
347
+ args = user_input[len("/lib") :].strip().split()
348
+ lib_command(args)
349
+ return True
350
+
351
+ def handle_rules(self, user_input: str, context: dict) -> bool:
352
+ """/rules 命令"""
353
+ from autocoder.auto_coder_runner import rules
354
+
355
+ query = user_input[len("/rules") :].strip()
356
+ rules(query)
357
+ return True
358
+
359
+ def handle_mcp(self, user_input: str, context: dict) -> bool:
360
+ """/mcp 命令"""
361
+ from autocoder.auto_coder_runner import mcp
362
+
363
+ query = user_input[len("/mcp") :].strip()
364
+ if not query:
365
+ print(get_message_lang("please_enter_query"))
366
+ else:
367
+ mcp(query)
368
+ return True
369
+
370
+ def handle_active_context(self, user_input: str, context: dict) -> bool:
371
+ """/active_context 命令"""
372
+ query = user_input[len("/active_context") :].strip()
373
+ self.active_context(query)
374
+ return True
375
+
376
+ def handle_auto(self, user_input: str, context: dict) -> bool:
377
+ """/auto 命令"""
378
+ query = user_input[len("/auto") :].strip()
379
+ event_file, _ = gengerate_event_file_path()
380
+ self.global_cancel.register_token(event_file)
381
+ self.configure(f"event_file:{event_file}")
382
+ self.run_agentic(query, cancel_token=event_file)
383
+ return True
384
+
385
+ def handle_debug(self, user_input: str, context: dict) -> bool:
386
+ """/debug 命令"""
387
+ code = user_input[len("/debug") :].strip()
388
+ try:
389
+ result = eval(code)
390
+ print(f"Debug result: {result}")
391
+ except Exception as e:
392
+ print(f"Debug error: {str(e)}")
393
+ return True
394
+
395
+ def handle_shell_command(self, user_input: str, context: dict) -> bool:
396
+ """/shell <command> 命令"""
397
+ from autocoder.auto_coder_runner import gen_and_exec_shell_command
398
+
399
+ memory_manager = get_memory_manager()
400
+
401
+ command = user_input[len("/shell") :].strip()
402
+ if not command:
403
+ # 如果没有命令参数,切换到 shell 模式
404
+ memory_manager.set_mode("shell")
405
+ print(get_message_lang("switched_to_shell_mode"))
406
+ else:
407
+ if command.startswith("/chat"):
408
+ event_file, file_id = gengerate_event_file_path()
409
+ self.global_cancel.register_token(event_file)
410
+ self.configure(f"event_file:{event_file}")
411
+ command = command[len("/chat") :].strip()
412
+ gen_and_exec_shell_command(command)
413
+ else:
414
+ self.execute_shell_command(command)
415
+ return True
416
+
417
+ def handle_workflow(self, user_input: str, context: dict) -> bool:
418
+ """/workflow 命令"""
419
+ # 解析命令参数
420
+ query = user_input[len("/workflow") :].strip()
421
+
422
+ # 如果是 /workflow /help,打印帮助信息
423
+ if query == "/help" or query == "help" or not query:
424
+ self._print_workflow_help()
425
+ return True
426
+
427
+ event_file, _ = gengerate_event_file_path()
428
+ self.global_cancel.register_token(event_file)
429
+ self.configure(f"event_file:{event_file}")
430
+
431
+ # 使用 ac_style_command_parser 解析参数
432
+ parsed = parse_query(f"/workflow {query}")
433
+ workflow_info = parsed.get("workflow", {})
434
+ args = workflow_info.get("args", [])
435
+ kwargs = workflow_info.get("kwargs", {})
436
+
437
+ if not args:
438
+ print(f"\033[91m{get_message('workflow_error_no_name')}\033[0m")
439
+ print(get_message("workflow_help_hint"))
440
+ return True
441
+
442
+ workflow_name = args[0]
443
+
444
+ # 获取当前目录
445
+ source_dir = str(Path.cwd())
446
+
447
+ # 运行 workflow
448
+ try:
449
+ print(
450
+ f"\n🚀 {get_message_with_format('workflow_running', workflow_name=workflow_name)}"
451
+ )
452
+ if kwargs:
453
+ print(
454
+ f"📋 {get_message_with_format('workflow_parameters', kwargs=kwargs)}"
455
+ )
456
+ print()
457
+
458
+ result = run_workflow_from_yaml(
459
+ yaml_path=workflow_name,
460
+ source_dir=source_dir,
461
+ vars_override=kwargs,
462
+ cancel_token=event_file,
463
+ )
464
+
465
+ # 打印结果
466
+ print_workflow_result(result)
467
+
468
+ except FileNotFoundError as e:
469
+ print(
470
+ f"\033[91m❌ {get_message_with_format('workflow_not_found', workflow_name=workflow_name)}\033[0m"
471
+ )
472
+ print(f"\n{get_message('workflow_available_list')}")
473
+ workflows = list_available_workflows(source_dir)
474
+ if workflows:
475
+ for name, path in workflows.items():
476
+ print(f" - {name}: {path}")
477
+ else:
478
+ print(f" {get_message('workflow_none_found')}")
479
+ except Exception as e:
480
+ print(
481
+ f"\033[91m❌ {get_message_with_format('workflow_run_failed', error=str(e))}\033[0m"
482
+ )
483
+ if self.debug:
484
+ import traceback
485
+
486
+ traceback.print_exc()
487
+
488
+ return True
489
+
490
+ def _print_workflow_help(self):
491
+ """打印 workflow 命令帮助信息"""
492
+ # 使用国际化的帮助文本
493
+ print(get_message("workflow_help_text"))
494
+
495
+ # 列出可用的 workflows
496
+ source_dir = str(Path.cwd())
497
+ workflows = list_available_workflows(source_dir)
498
+
499
+ if workflows:
500
+ print(f"\n✨ {get_message('workflow_available_title')}")
501
+ for name, path in workflows.items():
502
+ print(f" - {name}")
503
+ print(f" {path}")
504
+ else:
505
+ print(f"\n⚠️ {get_message('workflow_no_workflows_found')}")
506
+
507
+ print()
508
+
509
+ def handle_unknown_or_fallback(self, user_input: str, context: dict) -> bool:
510
+ """处理未知命令或非命令输入"""
511
+ if user_input and user_input.strip():
512
+ if user_input.startswith("/"):
513
+ command = user_input.split(" ")[0][1:]
514
+ query = user_input[len(command) + 1 :].strip()
515
+ user_input = f"/auto /command {command}.md {query}"
516
+ else:
517
+ user_input = f"/auto {user_input}"
518
+
519
+ # 只有非命令输入才执行auto_command
520
+ self.handle_auto(user_input, context)
521
+ return True
@@ -0,0 +1,57 @@
1
+ """命令注册和路由"""
2
+
3
+ from typing import Dict, Callable, Optional, Tuple, Any
4
+
5
+
6
+ class CommandRegistry:
7
+ """命令注册器,管理所有命令的路由"""
8
+
9
+ def __init__(self):
10
+ self.commands: Dict[str, Callable] = {}
11
+ self.fallback_handler: Optional[Callable] = None
12
+
13
+ def register(self, prefix: str, handler: Callable):
14
+ """注册一个命令处理器
15
+
16
+ Args:
17
+ prefix: 命令前缀(如 "/coding", "/chat")
18
+ handler: 处理函数
19
+ """
20
+ self.commands[prefix] = handler
21
+
22
+ def set_fallback(self, handler: Callable):
23
+ """设置兜底处理器,用于处理未匹配的命令"""
24
+ self.fallback_handler = handler
25
+
26
+ async def dispatch(
27
+ self, user_input: str, context: Dict[str, Any]
28
+ ) -> Optional[bool]:
29
+ """分发命令到对应的处理器
30
+
31
+ Args:
32
+ user_input: 用户输入
33
+ context: 上下文信息(包含 session, new_prompt_callback 等)
34
+
35
+ Returns:
36
+ Optional[bool]: True 表示命令已处理,False 表示未处理,None 表示需要退出
37
+ """
38
+ # 按前缀长度排序,优先匹配更长的前缀(如 /conf/export 优先于 /conf)
39
+ sorted_prefixes = sorted(self.commands.keys(), key=len, reverse=True)
40
+
41
+ for prefix in sorted_prefixes:
42
+ if user_input.startswith(prefix):
43
+ handler = self.commands[prefix]
44
+ result = handler(user_input, context)
45
+ # 如果是协程,await 它
46
+ if hasattr(result, "__await__"):
47
+ result = await result
48
+ return result
49
+
50
+ # 没有匹配的命令,使用兜底处理器
51
+ if self.fallback_handler:
52
+ result = self.fallback_handler(user_input, context)
53
+ if hasattr(result, "__await__"):
54
+ result = await result
55
+ return result
56
+
57
+ return False
@@ -0,0 +1,97 @@
1
+ """帮助信息显示"""
2
+
3
+ from autocoder.chat_auto_coder_lang import get_message
4
+
5
+
6
+ def show_help(plugin_manager):
7
+ """显示帮助信息"""
8
+ print(f"\033[1m{get_message('official_doc')}\033[0m")
9
+ print()
10
+ print(f"\033[1m{get_message('supported_commands')}\033[0m")
11
+ print()
12
+ print(
13
+ f" \033[94m{get_message('commands')}\033[0m - \033[93m{get_message('description')}\033[0m"
14
+ )
15
+ print(
16
+ f" \033[94m/auto\033[0m \033[93m<query>\033[0m - \033[92m{get_message('auto_desc')}\033[0m"
17
+ )
18
+ print(
19
+ f" \033[94m/auto /new\033[0m \033[93m<query>\033[0m - \033[92m{get_message('auto_new_desc')}\033[0m"
20
+ )
21
+ print(
22
+ f" \033[94m/auto /resume\033[0m \033[93m<id> <query>\033[0m - \033[92m{get_message('auto_resume_desc')}\033[0m"
23
+ )
24
+ print(
25
+ f" \033[94m/auto /list\033[0m - \033[92m{get_message('auto_list_desc')}\033[0m"
26
+ )
27
+ print(
28
+ f" \033[94m/auto /command\033[0m \033[93m<file>\033[0m - \033[92m{get_message('auto_command_desc')}\033[0m"
29
+ )
30
+
31
+ print(f" \033[94m/commit\033[0m - \033[92m{get_message('commit_desc')}\033[0m")
32
+
33
+ print(
34
+ f" \033[94m/conf\033[0m \033[93m<key>:<value>\033[0m - \033[92m{get_message('conf_desc')}\033[0m"
35
+ )
36
+
37
+ print(
38
+ f" \033[94m/shell\033[0m \033[93m<command>\033[0m - \033[92m{get_message('shell_desc')}\033[0m"
39
+ )
40
+ print(
41
+ f" \033[94m/shell\033[0m - \033[92m{get_message('shell_interactive_desc')}\033[0m"
42
+ )
43
+ print(
44
+ f" \033[94m!\033[0m\033[93m<command>\033[0m - \033[92m{get_message('shell_single_command_desc')}\033[0m"
45
+ )
46
+
47
+ print(
48
+ f" \033[94m/add_files\033[0m \033[93m<file1> <file2> ...\033[0m - \033[92m{get_message('add_files_desc')}\033[0m"
49
+ )
50
+ print(
51
+ f" \033[94m/remove_files\033[0m \033[93m<file1>,<file2> ...\033[0m - \033[92m{get_message('remove_files_desc')}\033[0m"
52
+ )
53
+ print(
54
+ f" \033[94m/chat\033[0m \033[93m<query>\033[0m - \033[92m{get_message('chat_desc')}\033[0m"
55
+ )
56
+ print(
57
+ f" \033[94m/coding\033[0m \033[93m<query>\033[0m - \033[92m{get_message('coding_desc')}\033[0m"
58
+ )
59
+
60
+ print(f" \033[94m/revert\033[0m - \033[92m{get_message('revert_desc')}\033[0m")
61
+ print(
62
+ f" \033[94m/index/query\033[0m \033[93m<args>\033[0m - \033[92m{get_message('index_query_desc')}\033[0m"
63
+ )
64
+ print(
65
+ f" \033[94m/index/build\033[0m - \033[92m{get_message('index_build_desc')}\033[0m"
66
+ )
67
+ print(
68
+ f" \033[94m/list_files\033[0m - \033[92m{get_message('list_files_desc')}\033[0m"
69
+ )
70
+ print(f" \033[94m/help\033[0m - \033[92m{get_message('help_desc')}\033[0m")
71
+ print(f" \033[94m/mode\033[0m - \033[92m{get_message('mode_desc')}\033[0m")
72
+ print(f" \033[94m/lib\033[0m - \033[92m{get_message('lib_desc')}\033[0m")
73
+ print(f" \033[94m/models\033[0m - \033[92m{get_message('models_desc')}\033[0m")
74
+ print(f" \033[94m/plugins\033[0m - \033[92m{get_message('plugins_desc')}\033[0m")
75
+ print(
76
+ f" \033[94m/active_context\033[0m - \033[92m{get_message('active_context_desc')}\033[0m"
77
+ )
78
+ print(f" \033[94m/exit\033[0m - \033[92m{get_message('exit_desc')}\033[0m")
79
+ print()
80
+
81
+ # 显示插件命令
82
+ if plugin_manager.command_handlers:
83
+ print(f"\033[1m{get_message('plugin_commands_title')}\033[0m")
84
+ print(
85
+ f" \033[94m{get_message('plugin_command_header')}\033[0m - \033[93m{get_message('plugin_description_header')}\033[0m"
86
+ )
87
+ for cmd, (_, desc, plugin_id) in plugin_manager.command_handlers.items():
88
+ plugin = plugin_manager.get_plugin(plugin_id)
89
+ if plugin:
90
+ print(
91
+ f" \033[94m{cmd}\033[0m - \033[92m{desc} ({get_message('plugin_from')} {plugin.plugin_name()})\033[0m"
92
+ )
93
+ else:
94
+ print(
95
+ f" \033[94m{cmd}\033[0m - \033[92m{desc} ({get_message('plugin_from_unknown')})\033[0m"
96
+ )
97
+ print()
@@ -0,0 +1,5 @@
1
+ """任务管理模块"""
2
+
3
+ from .task_event import TaskEvent, CancellationRegistry
4
+
5
+ __all__ = ["TaskEvent", "CancellationRegistry"]