auto-coder 1.0.0__py3-none-any.whl → 2.0.1__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.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.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 +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -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 +409 -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 +316 -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 +356 -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 +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  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 +923 -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 +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -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.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,623 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Optional, Union, Dict, Any
4
+ from rich.console import Console
5
+ from rich.panel import Panel
6
+ from rich.table import Table
7
+ from autocoder.common.international import get_message, get_message_with_format
8
+ from autocoder.common.ac_style_command_parser import create_config, parse_typed_query
9
+ from autocoder.common.v2.agent.agentic_edit_types import AgenticEditConversationConfig
10
+ from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
11
+ from loguru import logger as global_logger
12
+
13
+
14
+ class ConversationNewCommandHandler:
15
+ """处理 new 对话指令相关的操作"""
16
+
17
+ def __init__(self):
18
+ self.console = Console()
19
+ self._config = None
20
+
21
+ def _create_config(self):
22
+ """创建 new 命令的类型化配置"""
23
+ if self._config is None:
24
+ self._config = (
25
+ create_config()
26
+ .collect_remainder("query")
27
+ .command("new")
28
+ .max_args(0)
29
+ .command("name")
30
+ .positional("value", required=True)
31
+ .max_args(1)
32
+ .build()
33
+ )
34
+ return self._config
35
+
36
+ def handle_new_command(self, query: str, conversation_config:AgenticEditConversationConfig) -> Optional[Union[str, None]]:
37
+ """
38
+ 处理 new 指令的主入口
39
+
40
+ Args:
41
+ query: 查询字符串,例如 "/new /name my-conversation create new task"
42
+ conversation_config: 对话配置对象
43
+
44
+ Returns:
45
+ None: 表示处理了 new 指令,应该返回而不继续执行
46
+ 其他值: 表示没有处理 new 指令,应该继续执行
47
+ """
48
+ # 解析命令
49
+ config = self._create_config()
50
+ result = parse_typed_query(query, config)
51
+
52
+ # 检查是否包含 new 命令
53
+ if not result.has_command("new"):
54
+ return "continue" # 不是 new 指令,继续执行
55
+
56
+ # 设置对话动作
57
+ conversation_config.action = "new"
58
+
59
+ # 处理名称参数
60
+ conversation_name = "New Conversation" # 默认名称
61
+ if result.has_command("name"):
62
+ conversation_name = result.name
63
+
64
+ # 处理查询内容
65
+ task_query = result.query.strip() if result.query else ""
66
+
67
+ # 创建新对话
68
+ conversation_manager = get_conversation_manager()
69
+ conversation_id = conversation_manager.create_conversation(
70
+ name=conversation_name,
71
+ description=conversation_name
72
+ )
73
+ conversation_manager.set_current_conversation(conversation_id)
74
+ conversation_config.conversation_id = conversation_id
75
+ conversation_config.query = task_query
76
+
77
+ global_logger.info(f"Created new conversation: {conversation_name} (ID: {conversation_id})")
78
+
79
+ if task_query:
80
+ return "continue"
81
+
82
+ return None # 处理完成
83
+
84
+
85
+ class ConversationResumeCommandHandler:
86
+ """处理 resume 对话指令相关的操作"""
87
+
88
+ def __init__(self):
89
+ self.console = Console()
90
+ self._config = None
91
+
92
+ def _create_config(self):
93
+ """创建 resume 命令的类型化配置"""
94
+ if self._config is None:
95
+ self._config = (
96
+ create_config()
97
+ .collect_remainder("query")
98
+ .command("resume")
99
+ .positional("conversation_id_or_name", required=True)
100
+ .max_args(1)
101
+ .build()
102
+ )
103
+ return self._config
104
+
105
+ def _find_conversation_by_name_or_id(self, name_or_id: str) -> Optional[str]:
106
+ """
107
+ 通过名字或ID查找对话
108
+
109
+ Args:
110
+ name_or_id: 对话名字或ID
111
+
112
+ Returns:
113
+ Optional[str]: 对话ID,如果找不到或有重复返回None
114
+ """
115
+ conversation_manager = get_conversation_manager()
116
+
117
+ # 先尝试作为ID查找
118
+ try:
119
+ # 检查是否存在该ID的对话
120
+ conversations = conversation_manager.list_conversations()
121
+ for conv in conversations:
122
+ if conv.get("conversation_id") == name_or_id:
123
+ return name_or_id
124
+ except:
125
+ pass
126
+
127
+ # 作为名字查找
128
+ conversations = conversation_manager.list_conversations()
129
+ matched_conversations = [
130
+ conv for conv in conversations
131
+ if conv.get("name") == name_or_id
132
+ ]
133
+
134
+ if len(matched_conversations) == 0:
135
+ # 没有找到
136
+ return None
137
+ elif len(matched_conversations) == 1:
138
+ # 找到唯一匹配
139
+ return matched_conversations[0].get("conversation_id")
140
+ else:
141
+ # 找到多个匹配,名字重复
142
+ self.console.print(
143
+ Panel(
144
+ get_message_with_format(
145
+ "conversation_duplicate_name",
146
+ name=name_or_id,
147
+ count=len(matched_conversations)
148
+ ),
149
+ title=get_message("conversation_error"),
150
+ border_style="red",
151
+ )
152
+ )
153
+ # 显示所有匹配的对话
154
+ from rich.table import Table
155
+ table = Table(title=get_message_with_format("conversation_duplicate_list", name=name_or_id))
156
+ table.add_column(get_message("conversation_table_id"), style="cyan", no_wrap=True)
157
+ table.add_column(get_message("conversation_table_name"), style="green")
158
+
159
+ for conv in matched_conversations:
160
+ table.add_row(
161
+ conv.get("conversation_id") or "-",
162
+ conv.get("name") or "-"
163
+ )
164
+
165
+ self.console.print(table)
166
+ self.console.print(
167
+ Panel(
168
+ get_message("conversation_use_id_instead"),
169
+ border_style="yellow",
170
+ )
171
+ )
172
+ return None
173
+
174
+ def handle_resume_command(self, query: str, conversation_config:AgenticEditConversationConfig) -> Optional[Union[str, None]]:
175
+ """
176
+ 处理 resume 指令的主入口
177
+
178
+ Args:
179
+ query: 查询字符串,例如 "/resume conv-123 continue with task" 或 "/resume my-conversation continue"
180
+ conversation_config: 对话配置对象
181
+
182
+ Returns:
183
+ None: 表示处理了 resume 指令,应该返回而不继续执行
184
+ 其他值: 表示没有处理 resume 指令,应该继续执行
185
+ """
186
+ # 解析命令
187
+ config = self._create_config()
188
+ result = parse_typed_query(query, config)
189
+
190
+ # 检查是否包含 resume 命令
191
+ if not result.has_command("resume"):
192
+ return "continue" # 不是 resume 指令,继续执行
193
+
194
+ # 设置对话动作
195
+ conversation_config.action = "resume"
196
+
197
+ # 获取对话ID或名字
198
+ resume_cmd = result.get_command("resume")
199
+ if not resume_cmd or not resume_cmd.args:
200
+ self.console.print(
201
+ Panel(
202
+ get_message("conversation_provide_id_or_name"),
203
+ title=get_message("conversation_param_error"),
204
+ border_style="red",
205
+ )
206
+ )
207
+ return None
208
+
209
+ name_or_id = resume_cmd.args[0]
210
+
211
+ # 通过名字或ID查找对话
212
+ conversation_id = self._find_conversation_by_name_or_id(name_or_id)
213
+
214
+ if conversation_id is None:
215
+ # 没有找到对话(或名字重复,已经在 _find_conversation_by_name_or_id 中显示错误)
216
+ if not any(conv.get("name") == name_or_id for conv in get_conversation_manager().list_conversations()):
217
+ # 只有在不是名字重复的情况下才显示"未找到"错误
218
+ self.console.print(
219
+ Panel(
220
+ get_message_with_format("conversation_not_found_by_name_or_id", name_or_id=name_or_id),
221
+ title=get_message("conversation_error"),
222
+ border_style="red",
223
+ )
224
+ )
225
+ return None
226
+
227
+ conversation_config.conversation_id = conversation_id
228
+
229
+ # 处理查询内容
230
+ task_query = result.query.strip() if result.query else ""
231
+ conversation_config.query = task_query
232
+
233
+ # 验证对话是否存在并设置为当前对话
234
+ conversation_manager = get_conversation_manager()
235
+ try:
236
+ conversation_manager.set_current_conversation(conversation_id)
237
+ global_logger.info(f"Resumed conversation: {conversation_id} (from input: {name_or_id})")
238
+ # 设置完对话后,如果用户还添加了query,直接返回 continue,这样后续
239
+ # 会基于指定的会话继续新的 query
240
+ if task_query:
241
+ return "continue"
242
+ except Exception as e:
243
+ self.console.print(
244
+ Panel(
245
+ get_message_with_format("conversation_not_found", conversation_id=conversation_id),
246
+ title=get_message("conversation_error"),
247
+ border_style="red",
248
+ )
249
+ )
250
+ return None
251
+
252
+ return None # 处理完成
253
+
254
+
255
+ class ConversationRenameCommandHandler:
256
+ """处理 rename 对话指令相关的操作"""
257
+
258
+ def __init__(self):
259
+ self.console = Console()
260
+ self._config = None
261
+
262
+ def _create_config(self):
263
+ """创建 rename 命令的类型化配置"""
264
+ if self._config is None:
265
+ self._config = (
266
+ create_config()
267
+ .command("rename")
268
+ .positional("new_name", required=True)
269
+ .max_args(1)
270
+ .build()
271
+ )
272
+ return self._config
273
+
274
+ def handle_rename_command(self, query: str, conversation_config:AgenticEditConversationConfig) -> Optional[Union[str, None]]:
275
+ """
276
+ 处理 rename 指令的主入口
277
+
278
+ Args:
279
+ query: 查询字符串,例如 "/rename new-conversation-name"
280
+ conversation_config: 对话配置对象
281
+
282
+ Returns:
283
+ None: 表示处理了 rename 指令,应该返回而不继续执行
284
+ 其他值: 表示没有处理 rename 指令,应该继续执行
285
+ """
286
+ # 解析命令
287
+ config = self._create_config()
288
+ result = parse_typed_query(query, config)
289
+
290
+ # 检查是否包含 rename 命令
291
+ if not result.has_command("rename"):
292
+ return "continue" # 不是 rename 指令,继续执行
293
+
294
+ # 获取新名字
295
+ rename_cmd = result.get_command("rename")
296
+ if not rename_cmd or not rename_cmd.args:
297
+ self.console.print(
298
+ Panel(
299
+ get_message("conversation_provide_new_name"),
300
+ title=get_message("conversation_param_error"),
301
+ border_style="red",
302
+ )
303
+ )
304
+ return None
305
+
306
+ new_name = rename_cmd.args[0]
307
+
308
+ # 获取当前对话ID
309
+ conversation_manager = get_conversation_manager()
310
+ current_conversation_id = conversation_manager.get_current_conversation_id()
311
+
312
+ if not current_conversation_id:
313
+ self.console.print(
314
+ Panel(
315
+ get_message("conversation_no_current"),
316
+ title=get_message("conversation_error"),
317
+ border_style="red",
318
+ )
319
+ )
320
+ return None
321
+
322
+ # 执行重命名
323
+ try:
324
+ success = conversation_manager.update_conversation(
325
+ current_conversation_id,
326
+ name=new_name
327
+ )
328
+
329
+ if success:
330
+ self.console.print(
331
+ Panel(
332
+ get_message_with_format(
333
+ "conversation_rename_success",
334
+ old_id=current_conversation_id,
335
+ new_name=new_name
336
+ ),
337
+ title=get_message("conversation_rename_title"),
338
+ border_style="green",
339
+ )
340
+ )
341
+ global_logger.info(f"Renamed conversation {current_conversation_id} to '{new_name}'")
342
+ else:
343
+ self.console.print(
344
+ Panel(
345
+ get_message("conversation_rename_failed"),
346
+ title=get_message("conversation_error"),
347
+ border_style="red",
348
+ )
349
+ )
350
+
351
+ except Exception as e:
352
+ self.console.print(
353
+ Panel(
354
+ get_message_with_format("conversation_rename_error", error=str(e)),
355
+ title=get_message("conversation_error"),
356
+ border_style="red",
357
+ )
358
+ )
359
+
360
+ return None # 处理完成
361
+
362
+
363
+ class ConversationCommandCommandHandler:
364
+ """处理 command 对话指令相关的操作"""
365
+
366
+ def __init__(self):
367
+ self.console = Console()
368
+ self._config = None
369
+
370
+ def _create_config(self):
371
+ """创建 command 命令的类型化配置
372
+
373
+ 支持格式:
374
+ 1. /command /dryrun hello.md name="name"
375
+ 2. /command hello.md name="name" query="query"
376
+ """
377
+ if self._config is None:
378
+ self._config = (
379
+ create_config()
380
+ .command("command")
381
+ .positional("file_path", required=True)
382
+ # command 命令不限制键值对参数,接受任意键值对
383
+ .command("dryrun")
384
+ .max_args(0) # dryrun 是标志命令,不接受参数
385
+ .build()
386
+ )
387
+ return self._config
388
+
389
+ def _render_command_file_with_variables(self, parsed_command: Any) -> str:
390
+ """
391
+ 使用 CommandManager 加载并渲染命令文件
392
+
393
+ Args:
394
+ parsed_command: 类型化解析后的 command 命令对象(ParsedCommand)
395
+
396
+ Returns:
397
+ str: 渲染后的文件内容
398
+
399
+ Raises:
400
+ ValueError: 当参数不足或文件不存在时
401
+ Exception: 当渲染过程出现错误时
402
+ """
403
+ from autocoder.common.command_file_manager import CommandManager
404
+
405
+ try:
406
+ # 从类型化解析结果中获取文件路径(第一个位置参数)
407
+ if not parsed_command.args:
408
+ raise ValueError("未提供文件路径参数")
409
+
410
+ file_path = parsed_command.args[0] # file_path 位置参数
411
+
412
+ # 获取关键字参数作为渲染参数
413
+ kwargs = parsed_command.kwargs
414
+
415
+ # 初始化 CommandManager
416
+ command_manager = CommandManager()
417
+
418
+ # 使用 read_command_file_with_render 直接读取并渲染命令文件
419
+ rendered_content = command_manager.read_command_file_with_render(
420
+ file_path, kwargs
421
+ )
422
+ if rendered_content is None:
423
+ raise ValueError(f"无法读取或渲染命令文件: {file_path}")
424
+
425
+ global_logger.info(f"成功渲染命令文件: {file_path}, 使用参数: {kwargs}")
426
+ return rendered_content
427
+
428
+ except Exception as e:
429
+ global_logger.error(f"render_command_file_with_variables 执行失败: {str(e)}")
430
+ raise
431
+
432
+ def handle_command_command(
433
+ self,
434
+ query: str,
435
+ conversation_config,
436
+ command_infos: dict
437
+ ) -> Optional[Union[str, None]]:
438
+ """
439
+ 处理 command 指令的主入口
440
+
441
+ Args:
442
+ query: 查询字符串
443
+ conversation_config: 对话配置对象
444
+ command_infos: parse_query 返回的命令信息(兼容性参数,不再使用)
445
+
446
+ Returns:
447
+ None: 表示处理了 command 指令且是 dryrun,应该返回
448
+ "continue": 表示处理了 command 指令但不是 dryrun,应该继续执行
449
+ 其他值: 表示没有处理 command 指令,应该继续执行
450
+ """
451
+ # 使用类型化解析器解析命令
452
+ config = self._create_config()
453
+ result = parse_typed_query(query, config)
454
+
455
+ # 检查是否包含 command 命令
456
+ if not result.has_command("command"):
457
+ return "continue" # 不是 command 指令,继续执行
458
+
459
+
460
+ # 渲染命令文件
461
+ try:
462
+ # 获取 command 命令的 ParsedCommand 对象
463
+ command_parsed = result.get_command("command")
464
+ if not command_parsed:
465
+ raise ValueError("无法获取 command 命令的解析结果")
466
+
467
+ # 使用类型化解析结果渲染命令文件
468
+ task_query = self._render_command_file_with_variables(command_parsed)
469
+ conversation_config.query = task_query
470
+
471
+ # 判断是否是 dryrun 模式
472
+ is_dryrun = result.has_command("dryrun")
473
+
474
+ if is_dryrun:
475
+ # dryrun 模式,只显示渲染结果,不执行
476
+ self.console.print(task_query)
477
+ global_logger.info("Command executed in dryrun mode")
478
+ return None # 返回 None 表示处理完成,不继续执行
479
+ else:
480
+ # 非 dryrun 模式,继续执行
481
+ global_logger.info(f"Command rendered, continuing execution")
482
+ return "continue" # 返回 continue 表示继续执行后续逻辑
483
+
484
+ except Exception as e:
485
+ self.console.print(
486
+ Panel(
487
+ get_message_with_format("conversation_command_render_error", error=str(e)),
488
+ title=get_message("conversation_error"),
489
+ border_style="red",
490
+ )
491
+ )
492
+ return None # 出错时返回 None
493
+
494
+
495
+ class ConversationListCommandHandler:
496
+ """处理 list 对话指令相关的操作"""
497
+
498
+ def __init__(self):
499
+ self.console = Console()
500
+ self._config = None
501
+
502
+ def _create_config(self):
503
+ """创建 list 命令的类型化配置"""
504
+ if self._config is None:
505
+ self._config = (
506
+ create_config()
507
+ .command("list")
508
+ .max_args(0)
509
+ .build()
510
+ )
511
+ return self._config
512
+
513
+ def handle_list_command(self, query: str, conversation_config:AgenticEditConversationConfig) -> Optional[Union[str, None]]:
514
+ """
515
+ 处理 list 指令的主入口
516
+
517
+ Args:
518
+ query: 查询字符串,例如 "/list"
519
+ conversation_config: 对话配置对象
520
+
521
+ Returns:
522
+ None: 表示处理了 list 指令,应该返回而不继续执行
523
+ 其他值: 表示没有处理 list 指令,应该继续执行
524
+ """
525
+ # 解析命令
526
+ config = self._create_config()
527
+ result = parse_typed_query(query, config)
528
+
529
+ # 检查是否包含 list 命令
530
+ if not result.has_command("list"):
531
+ return "continue" # 不是 list 指令,继续执行
532
+
533
+ # 设置对话动作
534
+ conversation_config.action = "list"
535
+
536
+ try:
537
+ # 获取对话列表和当前对话ID
538
+ conversation_manager = get_conversation_manager()
539
+ conversations = conversation_manager.list_conversations()
540
+ current_conversation_id = conversation_manager.get_current_conversation_id()
541
+
542
+ # 只保留 conversation_id 和 name 字段
543
+ filtered_conversations = []
544
+ for conv in conversations:
545
+ filtered_conv = {
546
+ "conversation_id": conv.get("conversation_id"),
547
+ "name": conv.get("name"),
548
+ }
549
+ filtered_conversations.append(filtered_conv)
550
+
551
+ if not filtered_conversations:
552
+ self.console.print(
553
+ Panel(
554
+ get_message("conversation_list_no_conversations"),
555
+ title=get_message("conversation_list_title"),
556
+ border_style="yellow",
557
+ )
558
+ )
559
+ return None
560
+
561
+ # 创建表格显示对话列表
562
+ table = Table(title=get_message("conversation_list_title"))
563
+ table.add_column(
564
+ get_message("conversation_table_status"), style="yellow", width=8
565
+ )
566
+ table.add_column(
567
+ get_message("conversation_table_id"), style="cyan", no_wrap=True
568
+ )
569
+ table.add_column(get_message("conversation_table_name"), style="green", no_wrap=True)
570
+
571
+ # 添加对话行
572
+ for conv in filtered_conversations:
573
+ conv_id = conv["conversation_id"] or "-"
574
+ # 检查是否是当前对话
575
+ is_current = conv_id == current_conversation_id
576
+ status = get_message("conversation_status_current") if is_current else ""
577
+
578
+ table.add_row(
579
+ status,
580
+ conv_id,
581
+ conv["name"] or "-"
582
+ )
583
+
584
+ self.console.print(table)
585
+
586
+ # 显示汇总信息,包含当前对话
587
+ summary_text = get_message_with_format(
588
+ "conversation_list_summary",
589
+ total=len(filtered_conversations)
590
+ )
591
+ if current_conversation_id:
592
+ # 找到当前对话的名字
593
+ current_name = None
594
+ for conv in filtered_conversations:
595
+ if conv["conversation_id"] == current_conversation_id:
596
+ current_name = conv["name"]
597
+ break
598
+
599
+ if current_name:
600
+ summary_text += "\n" + get_message_with_format(
601
+ "conversation_current_info",
602
+ name=current_name,
603
+ id=current_conversation_id
604
+ )
605
+
606
+ self.console.print(
607
+ Panel(
608
+ summary_text,
609
+ title="📊 Summary",
610
+ border_style="blue",
611
+ )
612
+ )
613
+
614
+ except Exception as e:
615
+ self.console.print(
616
+ Panel(
617
+ get_message_with_format("conversation_list_error", error=str(e)),
618
+ title=get_message("conversation_error"),
619
+ border_style="red",
620
+ )
621
+ )
622
+
623
+ return None # 处理完成