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

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

Potentially problematic release.


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

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,26 @@
1
+ """
2
+ Auto Coder Terminal - 新的终端入口
3
+
4
+ 这是重构后的终端交互入口,代码结构更清晰,职责更分明。
5
+ 原有的 chat_auto_coder.py 保持不变以保证向后兼容。
6
+ """
7
+
8
+ from loguru import logger
9
+
10
+ logger.remove() # 把默认 sink 去掉,彻底静音
11
+
12
+ from autocoder.run_context import get_run_context, RunMode
13
+
14
+ # 设置运行模式为终端模式
15
+ get_run_context().set_mode(RunMode.TERMINAL)
16
+
17
+ from autocoder.terminal.bootstrap import run_cli
18
+
19
+
20
+ def main():
21
+ """主入口函数"""
22
+ run_cli()
23
+
24
+
25
+ if __name__ == "__main__":
26
+ main()
@@ -0,0 +1,190 @@
1
+ """
2
+ Auto Coder Chat V3 - 入口文件
3
+
4
+ 这是重构后的终端交互入口,使用模块化的设计。
5
+ """
6
+
7
+ from loguru import logger
8
+
9
+ logger.remove() # 把默认 sink 去掉,彻底静音
10
+
11
+ from autocoder.run_context import get_run_context, RunMode
12
+
13
+ # 设置运行模式为终端模式
14
+ get_run_context().set_mode(RunMode.TERMINAL)
15
+
16
+ import asyncio
17
+ import argparse
18
+ from pathlib import Path
19
+ from autocoder.auto_coder_runner import (
20
+ load_tokenizer,
21
+ initialize_system,
22
+ InitializeSystemRequest,
23
+ configure,
24
+ start as start_engine,
25
+ completer,
26
+ ask,
27
+ coding,
28
+ chat,
29
+ design,
30
+ voice_input,
31
+ auto_command,
32
+ run_agentic,
33
+ execute_shell_command,
34
+ active_context,
35
+ get_mcp_server,
36
+ stop as stop_engine,
37
+ )
38
+ from autocoder.chat_auto_coder_lang import (
39
+ get_message,
40
+ get_message_with_format as get_message_with_format_local,
41
+ )
42
+ from autocoder.plugins import PluginManager
43
+ from autocoder.terminal_v3 import AutoCoderChatApp
44
+
45
+
46
+ def parse_arguments():
47
+ parser = argparse.ArgumentParser(
48
+ description="Auto-Coder V3 - Claude-style Chat Interface"
49
+ )
50
+ parser.add_argument("--debug", action="store_true", help="Enable debug mode")
51
+ parser.add_argument(
52
+ "--quick",
53
+ action="store_true",
54
+ help="Enter the auto-coder.chat without initializing the system",
55
+ )
56
+ parser.add_argument(
57
+ "--skip_provider_selection",
58
+ action="store_true",
59
+ help="Skip the provider selection",
60
+ )
61
+ parser.add_argument(
62
+ "--product_mode",
63
+ type=str,
64
+ default="lite",
65
+ help="The mode of the auto-coder.chat, lite/pro default is lite",
66
+ )
67
+ parser.add_argument("--lite", action="store_true", help="Lite mode")
68
+ parser.add_argument("--pro", action="store_true", help="Pro mode")
69
+ return parser.parse_args()
70
+
71
+ def load_builtin_plugins(plugin_manager):
72
+ """加载内置插件"""
73
+ try:
74
+ # 发现所有可用的插件
75
+ discovered_plugins = plugin_manager.discover_plugins()
76
+
77
+ # 排除的示例插件列表
78
+ excluded_plugins = {
79
+ "autocoder.plugins.dynamic_completion_example",
80
+ "autocoder.plugins.sample_plugin",
81
+ }
82
+
83
+ # 自动加载内置插件(在autocoder.plugins模块中的插件)
84
+ builtin_loaded = 0
85
+ for plugin_class in discovered_plugins:
86
+ module_name = plugin_class.__module__
87
+ if (
88
+ module_name.startswith("autocoder.plugins.")
89
+ and not module_name.endswith(".__init__")
90
+ and module_name not in excluded_plugins
91
+ ):
92
+ try:
93
+ if plugin_manager.load_plugin(plugin_class):
94
+ builtin_loaded += 1
95
+ print(f"✓ Loaded builtin plugin: {plugin_class.plugin_name()}")
96
+ except Exception as e:
97
+ print(
98
+ f"✗ Failed to load builtin plugin {plugin_class.plugin_name()}: {e}"
99
+ )
100
+
101
+ if builtin_loaded > 0:
102
+ print(
103
+ get_message_with_format_local(
104
+ "loaded_plugins_builtin", count=builtin_loaded
105
+ )
106
+ )
107
+ else:
108
+ print(get_message("no_builtin_plugins_loaded"))
109
+
110
+ except Exception as e:
111
+ print(f"Error loading builtin plugins: {e}")
112
+
113
+
114
+ async def async_main():
115
+ """异步主函数"""
116
+ load_tokenizer()
117
+ args = parse_arguments()
118
+
119
+ if args.lite:
120
+ args.product_mode = "lite"
121
+
122
+ if args.pro:
123
+ args.product_mode = "pro"
124
+
125
+ if not args.quick:
126
+ initialize_system(
127
+ InitializeSystemRequest(
128
+ product_mode=args.product_mode,
129
+ skip_provider_selection=args.skip_provider_selection,
130
+ debug=args.debug,
131
+ quick=args.quick,
132
+ lite=args.lite,
133
+ pro=args.pro,
134
+ )
135
+ )
136
+
137
+
138
+
139
+ # 启动引擎
140
+ start_engine()
141
+
142
+ # 初始化插件系统
143
+ plugin_manager = PluginManager()
144
+ plugin_manager.load_global_plugin_dirs()
145
+
146
+ # 添加内置插件目录
147
+ plugins_dir = Path(__file__).parent.parent / "plugins"
148
+ plugin_manager.add_global_plugin_directory(str(plugins_dir))
149
+
150
+ # 加载保存的运行时配置
151
+ plugin_manager.load_runtime_cfg()
152
+
153
+ # 自动加载内置插件
154
+ load_builtin_plugins(plugin_manager)
155
+
156
+ # 配置 product_mode
157
+ configure(f"product_mode:{args.product_mode}")
158
+
159
+ # 创建原始函数字典
160
+ original_functions = {
161
+ "ask": ask,
162
+ "coding": coding,
163
+ "chat": chat,
164
+ "design": design,
165
+ "voice_input": voice_input,
166
+ "auto_command": auto_command,
167
+ "run_agentic": run_agentic,
168
+ "execute_shell_command": execute_shell_command,
169
+ "active_context": active_context,
170
+ }
171
+
172
+ # 创建 wrapped functions
173
+ wrapped_functions = {}
174
+ for func_name, original_func in original_functions.items():
175
+ wrapped_functions[func_name] = plugin_manager.wrap_function(
176
+ original_func, func_name
177
+ )
178
+
179
+ # 创建并运行聊天式 TUI 应用
180
+ chat_app = AutoCoderChatApp(plugin_manager=plugin_manager)
181
+ await chat_app.run()
182
+
183
+
184
+ def main():
185
+ """同步入口函数,供 console_scripts 使用"""
186
+ asyncio.run(async_main())
187
+
188
+
189
+ if __name__ == "__main__":
190
+ main()
@@ -9,14 +9,18 @@ from rich.console import Console
9
9
  from rich.panel import Panel
10
10
  from rich.table import Table
11
11
  from rich.text import Text
12
- from autocoder.auto_coder_runner import save_memory # Import save_memory
13
12
  from autocoder.common.conf_validator import ConfigValidator
14
- from autocoder.common.auto_coder_lang import get_message, get_message_with_format
13
+ from autocoder.common.international import get_message, get_message_with_format
14
+ from autocoder.common.ac_style_command_parser import create_config, parse_typed_query
15
+
16
+ # Import core_config functions for direct configuration management
17
+ from autocoder.common.core_config import get_memory_manager
15
18
 
16
19
  # Helper function to print the configuration table (internal implementation)
17
20
  def _print_conf_table(content: Dict[str, Any], title: str = "Configuration Settings"):
18
21
  """Display configuration dictionary in a Rich table format."""
19
- console = Console(file=io.StringIO(), force_terminal=True, color_system="truecolor") # Capture output
22
+ output_buffer = io.StringIO()
23
+ console = Console(file=output_buffer, force_terminal=True, color_system="truecolor") # Capture output
20
24
 
21
25
  # Create a styled table with rounded borders
22
26
  table = Table(
@@ -54,39 +58,40 @@ def _print_conf_table(content: Dict[str, Any], title: str = "Configuration Setti
54
58
  subtitle=f"[italic]{get_message('conf_subtitle')}[/italic]",
55
59
  border_style="blue"
56
60
  ))
57
- return console.file.getvalue() # Return captured string
61
+ return output_buffer.getvalue() # Return captured string
58
62
 
59
63
  # --- Command Handlers ---
60
64
 
61
- def _handle_list_conf(memory: Dict[str, Any], args: List[str]) -> str:
65
+ def _handle_list_conf(args: List[str]) -> str:
62
66
  """Handles listing configuration settings, supports wildcard filtering."""
63
- conf = memory.get("conf", {})
67
+ memory_manager = get_memory_manager()
68
+ conf = memory_manager.get_all_config()
64
69
  pattern = args[0] if args else "*" # Default to all if no pattern
65
70
 
66
71
  if pattern == "*":
67
72
  title = get_message("conf_title")
68
73
  filtered_conf = conf
69
74
  else:
70
- title = f"Filtered Configuration (Pattern: {pattern})"
75
+ title = get_message_with_format("conf_filtered_title", pattern=pattern)
71
76
  filtered_conf = {k: v for k, v in conf.items() if fnmatch.fnmatch(k, pattern)}
72
77
  if not filtered_conf:
73
- return f"No configuration keys found matching pattern: {pattern}"
78
+ return get_message_with_format("conf_no_pattern_matches", pattern=pattern)
74
79
 
75
80
  if not filtered_conf and pattern == "*":
76
- return "No configurations set."
81
+ return get_message("conf_no_configs_found")
77
82
 
78
83
  return _print_conf_table(filtered_conf, title)
79
84
 
80
85
 
81
- def _handle_get_conf(memory: Dict[str, Any], args: List[str]) -> str:
86
+ def _handle_get_conf(args: List[str]) -> str:
82
87
  """Handles getting a specific configuration setting."""
83
88
  if len(args) != 1:
84
- return "Error: 'get' command requires exactly one argument (the key). Usage: /conf get <key>"
89
+ return get_message("conf_get_error_args")
85
90
  key = args[0]
86
- conf = memory.get("conf", {})
87
- value = conf.get(key)
91
+ memory_manager = get_memory_manager()
92
+ value = memory_manager.get_config(key)
88
93
  if value is None:
89
- return f"Error: Configuration key '{key}' not found."
94
+ return get_message_with_format("conf_get_error_not_found", key=key)
90
95
  else:
91
96
  # Format value for better readability
92
97
  if isinstance(value, (list, dict)):
@@ -122,150 +127,245 @@ def _parse_value(value_str: str) -> Any:
122
127
  # If none of the above, return as string
123
128
  return value_str
124
129
 
125
- def _handle_set_conf(memory: Dict[str, Any], args: List[str]) -> str:
130
+ def _handle_set_conf(args: List[str]) -> str:
126
131
  """Handles setting or updating a configuration setting."""
127
132
  if len(args) < 2:
128
- return "Error: 'set' command requires at least two arguments (key and value). Usage: /conf set <key> <value>"
133
+ return get_message("conf_set_error_args")
129
134
  key = args[0]
130
135
  # Join the rest of the arguments to form the value string
131
136
  value_str = " ".join(args[1:])
132
137
  try:
133
138
  parsed_value = _parse_value(value_str)
134
139
 
135
- # Validate before setting
136
- product_mode = memory.get("conf", {}).get("product_mode", "lite")
140
+ # Get memory manager and validate before setting
141
+ memory_manager = get_memory_manager()
142
+ product_mode = memory_manager.get_config("product_mode", "lite")
137
143
  ConfigValidator.validate(key, str(parsed_value), product_mode) # Validate the parsed value as string initially if needed, or adjust validation
138
144
 
139
- if "conf" not in memory:
140
- memory["conf"] = {}
141
- memory["conf"][key] = parsed_value
142
- save_memory() # Save after modification
145
+ # Set configuration using MemoryManager
146
+ memory_manager.set_config(key, parsed_value)
147
+
143
148
  # Use repr for confirmation message for clarity
144
- return f"Configuration updated: {key} = {repr(parsed_value)}"
149
+ return get_message_with_format("conf_set_success", key=key, value=repr(parsed_value))
145
150
  except Exception as e:
146
- return f"Error setting configuration for key '{key}': {e}"
151
+ return get_message_with_format("conf_set_error", key=key, error=str(e))
147
152
 
148
- def _handle_delete_conf(memory: Dict[str, Any], args: List[str]) -> str:
149
- """Handles deleting a configuration setting."""
153
+ def _handle_delete_conf(args: List[str]) -> str:
154
+ """Handles deleting configuration settings. Supports multiple keys separated by commas."""
150
155
  if len(args) != 1:
151
- return "Error: 'delete' command requires exactly one argument (the key). Usage: /conf delete <key>"
152
- key = args[0]
153
- conf = memory.get("conf", {})
154
- if key in conf:
155
- try:
156
- del memory["conf"][key]
157
- save_memory() # Save after modification
158
- return f"Configuration deleted: {key}"
159
- except Exception as e:
160
- return f"Error deleting key '{key}': {e}"
161
- else:
162
- return f"Error: Configuration key '{key}' not found."
156
+ return get_message("conf_delete_error_args")
157
+
158
+ # 支持逗号分隔的多个key
159
+ keys_str = args[0]
160
+ keys = [key.strip() for key in keys_str.split(',') if key.strip()]
161
+
162
+ if not keys:
163
+ return "Error: No valid keys provided for deletion."
164
+
165
+ memory_manager = get_memory_manager()
166
+ results = []
167
+ deleted_keys = []
168
+ not_found_keys = []
169
+ error_keys = []
170
+
171
+ for key in keys:
172
+ if memory_manager.has_config(key):
173
+ try:
174
+ memory_manager.delete_config(key)
175
+ deleted_keys.append(key)
176
+ except Exception as e:
177
+ error_keys.append(f"{key} ({str(e)})")
178
+ else:
179
+ not_found_keys.append(key)
180
+
181
+ # 构建返回消息
182
+ messages = []
183
+ if deleted_keys:
184
+ if len(deleted_keys) == 1:
185
+ messages.append(get_message_with_format("conf_delete_success", key=deleted_keys[0]))
186
+ else:
187
+ messages.append(f"Successfully deleted configurations: {', '.join(deleted_keys)}")
188
+
189
+ if not_found_keys:
190
+ if len(not_found_keys) == 1:
191
+ messages.append(get_message_with_format("conf_delete_not_found", key=not_found_keys[0]))
192
+ else:
193
+ messages.append(f"Configurations not found: {', '.join(not_found_keys)}")
194
+
195
+ if error_keys:
196
+ messages.append(f"Failed to delete: {', '.join(error_keys)}")
197
+
198
+ return '\n'.join(messages)
163
199
 
164
200
 
165
- def _handle_help(memory: Dict[str, Any], args: List[str]) -> str:
201
+ def _handle_help(args: List[str]) -> str:
166
202
  """Provides help text for the /conf command."""
167
203
  if args:
168
- return f"Error: 'help' command takes no arguments. Usage: /conf help"
204
+ return get_message("conf_help_args_error")
169
205
 
170
- help_text = """
171
- /conf command usage:
172
- /conf [pattern] - Show configurations. Optional wildcard pattern (e.g., *_model, api*).
173
- /conf get <key> - Get the value of a specific configuration key.
174
- /conf set <key>:<value> - Set or update a configuration key.
175
- Value parsed (bool, int, float, None) or treated as string.
176
- Use quotes ("value with spaces") for explicit strings.
177
- /conf /drop <key> - Delete a configuration key.
178
- /conf /export <path> - Export current configuration to a file.
179
- /conf /import <path> - Import configuration from a file.
180
- /conf help - Show this help message.
181
- """
182
- return help_text.strip()
206
+ help_text = get_message("conf_help_text")
207
+ return help_text
183
208
 
184
209
  # Command dispatch table
185
- COMMAND_HANDLERS: Dict[str, Callable[[Dict[str, Any], List[str]], str]] = {
186
- "/list": _handle_list_conf,
187
- "/show": _handle_list_conf, # Alias
188
- "/get": _handle_get_conf,
189
- "/set": _handle_set_conf,
190
- "/delete": _handle_delete_conf,
191
- "/del": _handle_delete_conf, # Alias
192
- "/rm": _handle_delete_conf, # Alias
193
- "/drop": _handle_delete_conf, # Add this line for /drop command
194
- "/help": _handle_help,
210
+ COMMAND_HANDLERS: Dict[str, Callable[[List[str]], str]] = {
211
+ "list": _handle_list_conf,
212
+ "show": _handle_list_conf, # Alias
213
+ "get": _handle_get_conf,
214
+ "set": _handle_set_conf,
215
+ "delete": _handle_delete_conf,
216
+ "del": _handle_delete_conf, # Alias
217
+ "rm": _handle_delete_conf, # Alias
218
+ "drop": _handle_delete_conf, # Add this line for /drop command
219
+ "help": _handle_help,
195
220
  }
196
221
 
197
- def handle_conf_command(command_args: str, memory: Dict[str, Any]) -> str:
222
+ def handle_conf_command(command_args: str) -> str:
198
223
  """
199
- Handles the /conf command, its subcommands, and wildcard listing.
224
+ 处理配置命令,支持两种格式:
225
+ 1. 双斜杠格式(/conf /command)
226
+ 2. 键值对格式(/conf key:value)
227
+
228
+ 支持的命令格式:
229
+ - /conf /list [pattern] - 列出配置(可带过滤模式)
230
+ - /conf /show [pattern] - 列出配置(list的别名)
231
+ - /conf /get <key> - 获取单个配置
232
+ - /conf /set <key> <value> - 设置配置
233
+ - /conf /delete <key> - 删除配置
234
+ - /conf /del <key> - 删除配置(别名)
235
+ - /conf /rm <key> - 删除配置(别名)
236
+ - /conf /drop <key> - 删除配置(别名)
237
+ - /conf /help - 显示帮助
238
+ - /conf /export <path> - 导出配置
239
+ - /conf /import <path> - 导入配置
240
+ - /conf key:value - 设置配置(简化格式)
200
241
 
201
242
  Args:
202
- command_args: The arguments string following the /conf command.
203
- Example: "key:value", "get key", "set key value", "*_model", "/export path"
204
- memory: The current session memory dictionary.
243
+ command_args: 命令参数字符串
205
244
 
206
245
  Returns:
207
- A string response to be displayed to the user.
246
+ str: 返回给用户的响应字符串
208
247
  """
209
- conf_str = command_args.strip()
210
-
211
- # Handle special subcommands first
212
- if conf_str.startswith("/export"):
213
- from autocoder.common.conf_import_export import export_conf
214
- export_path = conf_str[len("/export"):].strip()
215
- if not export_path:
248
+ conf_str = command_args.strip()
249
+
250
+ # 检查是否为 key:value 格式
251
+ if ':' in conf_str and not conf_str.startswith('/'):
252
+ # 解析 key:value 格式
253
+ parts = conf_str.split(':', 1) # 只分割第一个冒号
254
+ if len(parts) == 2:
255
+ key = parts[0].strip()
256
+ value = parts[1].strip()
257
+ return _handle_set_conf([key, value])
258
+ else:
259
+ return f"Error: Invalid key:value format. Usage: /conf key:value"
260
+
261
+ # 创建配置解析器
262
+ config = (create_config()
263
+ .collect_remainder("query") # 收集剩余参数
264
+ .command("list")
265
+ .positional("pattern") # 可选的过滤模式
266
+ .max_args(1) # 列出配置
267
+ .command("show") # list的别名
268
+ .positional("pattern")
269
+ .max_args(1)
270
+ .command("get")
271
+ .positional("key", required=True)
272
+ .max_args(1) # 获取单个配置
273
+ .command("set")
274
+ .positional("key", required=True)
275
+ .positional("value", required=True)
276
+ .max_args(2) # 设置配置
277
+ .command("delete")
278
+ .collect_remainder("keys") # 收集所有剩余参数以支持逗号分隔的多个key
279
+ .command("del") # delete的别名
280
+ .collect_remainder("keys")
281
+ .command("rm") # delete的别名
282
+ .collect_remainder("keys")
283
+ .command("drop") # delete的别名
284
+ .collect_remainder("keys")
285
+ .command("help")
286
+ .max_args(0) # 显示帮助
287
+ .command("export")
288
+ .positional("path", required=True)
289
+ .max_args(1) # 导出配置
290
+ .command("import")
291
+ .positional("path", required=True)
292
+ .max_args(1) # 导入配置
293
+ .build()
294
+ )
295
+
296
+ if not conf_str:
297
+ # 默认显示所有配置
298
+ return _handle_list_conf([])
299
+
300
+ # 解析命令
301
+ result = parse_typed_query(conf_str, config)
302
+
303
+ # 检查各种子命令
304
+ if result.has_command("list"):
305
+ list_cmd = result.get_command("list")
306
+ pattern = list_cmd.args[0] if list_cmd.args else "*"
307
+ return _handle_list_conf([pattern] if pattern != "*" else [])
308
+
309
+ if result.has_command("show"):
310
+ show_cmd = result.get_command("show")
311
+ pattern = show_cmd.args[0] if show_cmd.args else "*"
312
+ return _handle_list_conf([pattern] if pattern != "*" else [])
313
+
314
+ if result.has_command("get"):
315
+ get_cmd = result.get_command("get")
316
+ if not get_cmd.args:
317
+ return "Error: 'get' command requires exactly one argument (the key). Usage: /conf /get <key>"
318
+ return _handle_get_conf([get_cmd.args[0]])
319
+
320
+ if result.has_command("set"):
321
+ set_cmd = result.get_command("set")
322
+ if len(set_cmd.args) < 2:
323
+ return "Error: 'set' command requires exactly two arguments (key and value). Usage: /conf /set <key> <value>"
324
+ return _handle_set_conf([set_cmd.args[0], set_cmd.args[1]])
325
+
326
+ if result.has_command("delete") or result.has_command("del") or result.has_command("rm") or result.has_command("drop"):
327
+ # 查找删除命令
328
+ delete_cmd = None
329
+ for cmd_name in ["delete", "del", "rm", "drop"]:
330
+ if result.has_command(cmd_name):
331
+ delete_cmd = result.get_command(cmd_name)
332
+ break
333
+
334
+ if not delete_cmd or not delete_cmd.remainder:
335
+ return "Error: 'delete' command requires at least one key. Usage: /conf /delete <key> or /conf /delete <key1,key2,key3>"
336
+
337
+ # remainder 已经是一个字符串,直接传递给处理函数
338
+ keys_str = delete_cmd.remainder
339
+ return _handle_delete_conf([keys_str])
340
+
341
+ if result.has_command("help"):
342
+ return _handle_help([])
343
+
344
+ if result.has_command("export"):
345
+ export_cmd = result.get_command("export")
346
+ if not export_cmd.args:
216
347
  return "Error: Please specify a path for export. Usage: /conf /export <path>"
348
+
349
+ export_path = export_cmd.args[0]
217
350
  try:
351
+ from autocoder.common.conf_import_export import export_conf
218
352
  export_conf(os.getcwd(), export_path)
219
- return f"Configuration exported successfully to {export_path}"
353
+ return get_message_with_format("conf_export_success", path=export_path)
220
354
  except Exception as e:
221
- return f"Error exporting configuration: {e}"
222
- elif conf_str.startswith("/import"):
223
- from autocoder.common.conf_import_export import import_conf
224
- import_path = conf_str[len("/import"):].strip()
225
- if not import_path:
355
+ return get_message_with_format("conf_export_error", error=str(e))
356
+
357
+ if result.has_command("import"):
358
+ import_cmd = result.get_command("import")
359
+ if not import_cmd.args:
226
360
  return "Error: Please specify a path for import. Usage: /conf /import <path>"
361
+
362
+ import_path = import_cmd.args[0]
227
363
  try:
364
+ from autocoder.common.conf_import_export import import_conf
228
365
  import_conf(os.getcwd(), import_path)
229
- # Reload memory after import might be needed depending on import_conf implementation
230
- # load_memory() # Consider if import_conf modifies the passed memory or global state
231
- return f"Configuration imported successfully from {import_path}. Use '/conf' to see changes."
366
+ return get_message_with_format("conf_import_success", path=import_path)
232
367
  except Exception as e:
233
- return f"Error importing configuration: {e}"
234
-
235
- # Handle regular commands and listing/filtering
236
- args = conf_str.split()
237
-
238
- if not args:
239
- # Default action: list all configurations
240
- return _handle_list_conf(memory, [])
241
- else:
242
- command = args[0].lower()
243
- command_args_list = args[1:]
244
-
245
- # Check if the first argument is a known command or potentially a pattern
246
- handler = COMMAND_HANDLERS.get(command)
247
-
248
- if handler:
249
- # It's a known command (list, get, set, delete, help)
250
- try:
251
- return handler(memory, command_args_list)
252
- except Exception as e:
253
- return f"An unexpected error occurred while executing '/conf {command}': {e}"
254
- elif "*" in command or "?" in command:
255
- # Treat as a list/filter pattern if it contains wildcards and is not a known command
256
- return _handle_list_conf(memory, [command]) # Pass the pattern as the argument to list
257
- else:
258
- # Handle legacy key:value format for setting (optional, can be removed if only set command is preferred)
259
- if ":" in conf_str and len(args) == 1: # Check if it looks like key:value and is a single "word"
260
- parts = conf_str.split(":", 1)
261
- if len(parts) == 2:
262
- key, value_str = parts[0].strip(), parts[1].strip()
263
- if key and value_str:
264
- return _handle_set_conf(memory, [key, value_str])
265
- else:
266
- return f"Error: Invalid key:value format in '{conf_str}'. Use '/conf set {key} {value_str}' or '/conf help'."
267
- else:
268
- return f"Error: Unknown command or invalid format '{conf_str}'. Type '/conf help' for available commands."
269
- else:
270
- # If it's not a known command, not a wildcard, and not key:value format
271
- return f"Error: Unknown command '/conf {command}'. Type '/conf help' for available commands."
368
+ return get_message_with_format("conf_import_error", error=str(e))
369
+
370
+ # 未知命令
371
+ return f"Error: Unknown command '/conf {conf_str}'. Type '/conf /help' for available commands."