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
@@ -6,186 +6,584 @@
6
6
  """
7
7
 
8
8
  import json
9
- from typing import Dict, Callable, Type
9
+ import yaml
10
+ import re
10
11
 
11
- from autocoder.common.auto_coder_lang import get_system_language, format_str_jinja2
12
+ # Import the messages module to ensure auto-registration
13
+ from autocoder.common.international import get_message, get_message_with_format
12
14
  from autocoder.common.v2.agent.agentic_edit_types import (
13
15
  BaseTool,
14
- ReadFileTool, WriteToFileTool, ReplaceInFileTool, ExecuteCommandTool,
15
- ListFilesTool, SearchFilesTool, ListCodeDefinitionNamesTool,
16
- AskFollowupQuestionTool, UseMcpTool, AttemptCompletionTool
16
+ ReadFileTool,
17
+ WriteToFileTool,
18
+ ReplaceInFileTool,
19
+ ExecuteCommandTool,
20
+ ListFilesTool,
21
+ SearchFilesTool,
22
+ ListCodeDefinitionNamesTool,
23
+ AskFollowupQuestionTool,
24
+ UseMcpTool,
25
+ AttemptCompletionTool,
26
+ TodoReadTool,
27
+ TodoWriteTool,
28
+ UseRAGTool,
29
+ ACModReadTool,
30
+ ACModWriteTool,
31
+ ACModListTool,
32
+ CountTokensTool,
33
+ SessionStartTool,
34
+ SessionInteractiveTool,
35
+ SessionStopTool,
36
+ ConversationMessageIdsWriteTool,
37
+ ConversationMessageIdsReadTool,
38
+ RunNamedSubagentsTool,
39
+ LoadExtraDocumentTool,
40
+ ExecuteWorkflowTool,
17
41
  )
18
42
 
19
- # Define message templates for each tool in English and Chinese
20
- TOOL_DISPLAY_MESSAGES: Dict[Type[BaseTool], Dict[str, str]] = {
21
- ReadFileTool: {
22
- "en": "AutoCoder wants to read this file:\n[bold cyan]{{ path }}[/]",
23
- "zh": "AutoCoder 想要读取此文件:\n[bold cyan]{{ path }}[/]"
24
- },
25
- WriteToFileTool: {
26
- "en": (
27
- "AutoCoder wants to write to this file:\n[bold cyan]{{ path }}[/]\n\n"
28
- "[dim]Content Snippet:[/dim]\n{{ content_snippet }}{{ ellipsis }}"
29
- ),
30
- "zh": (
31
- "AutoCoder 想要写入此文件:\n[bold cyan]{{ path }}[/]\n\n"
32
- "[dim]内容片段:[/dim]\n{{ content_snippet }}{{ ellipsis }}"
33
- )
34
- },
35
- ReplaceInFileTool: {
36
- "en": (
37
- "AutoCoder wants to replace content in this file:\n[bold cyan]{{ path }}[/]\n\n"
38
- "[dim]Diff Snippet:[/dim]\n{{ diff_snippet }}{{ ellipsis }}"
39
- ),
40
- "zh": (
41
- "AutoCoder 想要替换此文件中的内容:\n[bold cyan]{{ path }}[/]\n\n"
42
- "[dim]差异片段:[/dim]\n{{ diff_snippet }}{{ ellipsis }}"
43
+
44
+ def get_tool_display_message(tool: BaseTool) -> str:
45
+ """
46
+ 生成工具调用的用户友好、国际化的字符串表示。
47
+
48
+ Args:
49
+ tool: 工具实例(Pydantic模型)。
50
+
51
+ Returns:
52
+ 用于在终端中显示的格式化字符串。
53
+ """
54
+ tool_type = type(tool)
55
+
56
+ # 准备特定于每种工具类型的上下文
57
+ try:
58
+ if isinstance(tool, ReadFileTool):
59
+ return get_message_with_format("tool_display.read_file", path=tool.path)
60
+
61
+ elif isinstance(tool, WriteToFileTool):
62
+ snippet = tool.content[:150]
63
+ return get_message_with_format(
64
+ "tool_display.write_to_file",
65
+ path=tool.path,
66
+ content_snippet=snippet,
67
+ ellipsis="..." if len(tool.content) > 150 else "",
68
+ )
69
+
70
+ elif isinstance(tool, ReplaceInFileTool):
71
+ return get_message_with_format(
72
+ "tool_display.replace_in_file",
73
+ path=tool.path,
74
+ diff_snippet=tool.diff,
75
+ ellipsis="",
76
+ )
77
+
78
+ elif isinstance(tool, ExecuteCommandTool):
79
+ return get_message_with_format(
80
+ "tool_display.execute_command",
81
+ command=tool.command,
82
+ requires_approval=tool.requires_approval,
83
+ )
84
+
85
+ elif isinstance(tool, ListFilesTool):
86
+ recursive_text = (
87
+ get_message("tool_text.recursive")
88
+ if tool.recursive
89
+ else get_message("tool_text.top_level")
90
+ )
91
+ return get_message_with_format(
92
+ "tool_display.list_files", path=tool.path, recursive_text=recursive_text
93
+ )
94
+
95
+ elif isinstance(tool, SearchFilesTool):
96
+ return get_message_with_format(
97
+ "tool_display.search_files",
98
+ path=tool.path,
99
+ file_pattern=tool.file_pattern or "*",
100
+ regex=tool.regex,
101
+ )
102
+
103
+ elif isinstance(tool, ListCodeDefinitionNamesTool):
104
+ return get_message_with_format(
105
+ "tool_display.list_code_definition_names", path=tool.path
106
+ )
107
+
108
+ elif isinstance(tool, AskFollowupQuestionTool):
109
+ options_text = ""
110
+ if tool.options:
111
+ options_list = "\n".join([f"- {opt}" for opt in tool.options])
112
+ options_label = get_message("tool_text.options")
113
+ options_text = f"[dim]{options_label}[/dim]\n{options_list}"
114
+
115
+ return get_message_with_format(
116
+ "tool_display.ask_followup_question",
117
+ question=tool.question,
118
+ options_text=options_text,
119
+ )
120
+
121
+ elif isinstance(tool, UseMcpTool):
122
+ args_str = tool.query
123
+ snippet = args_str[:100]
124
+ return get_message_with_format(
125
+ "tool_display.use_mcp",
126
+ server_name=tool.server_name,
127
+ tool_name=tool.tool_name,
128
+ arguments_snippet=snippet,
129
+ ellipsis="..." if len(args_str) > 100 else "",
130
+ )
131
+
132
+ elif isinstance(tool, TodoReadTool):
133
+ return get_message("tool_display.todo_read")
134
+
135
+ elif isinstance(tool, UseRAGTool):
136
+ return get_message_with_format(
137
+ "tool_display.use_rag", server_name=tool.server_name, query=tool.query
138
+ )
139
+
140
+ elif isinstance(tool, ACModReadTool):
141
+ return get_message_with_format("tool_display.ac_mod_read", path=tool.path)
142
+
143
+ elif isinstance(tool, ACModWriteTool):
144
+ diff_snippet = tool.diff[:300]
145
+ return get_message_with_format(
146
+ "tool_display.ac_mod_write",
147
+ path=tool.path,
148
+ diff_snippet=diff_snippet,
149
+ ellipsis="..." if len(tool.diff) > 300 else "",
150
+ )
151
+
152
+ elif isinstance(tool, ACModListTool):
153
+ if tool.path:
154
+ search_text = (
155
+ get_message_with_format("tool_text.search_path")
156
+ + f" [green]{tool.path}[/]"
157
+ )
158
+ else:
159
+ project_root = get_message("tool_text.project_root")
160
+ all_text = get_message("tool_text.all")
161
+ search_text = f"[dim]{get_message('tool_text.search_path')}[/dim] [green]{project_root}[/]{all_text}"
162
+
163
+ return get_message_with_format(
164
+ "tool_display.ac_mod_list", search_text=search_text
165
+ )
166
+
167
+ elif isinstance(tool, CountTokensTool):
168
+ recursive_text = (
169
+ get_message("tool_text.yes")
170
+ if tool.recursive
171
+ else get_message("tool_text.no")
172
+ )
173
+ summary_text = (
174
+ get_message("tool_text.yes")
175
+ if tool.include_summary
176
+ else get_message("tool_text.no")
177
+ )
178
+
179
+ return get_message_with_format(
180
+ "tool_display.count_tokens",
181
+ path=tool.path,
182
+ recursive_text=recursive_text,
183
+ summary_text=summary_text,
184
+ )
185
+
186
+ elif isinstance(tool, TodoWriteTool):
187
+ return _format_todo_write_tool(tool)
188
+
189
+ elif isinstance(tool, SessionStartTool):
190
+ timeout_text = ""
191
+ if tool.timeout:
192
+ timeout_label = get_message("tool_text.timeout")
193
+ timeout_text = f"[dim]{timeout_label}[/dim] {tool.timeout}s\n"
194
+
195
+ cwd_text = ""
196
+ if tool.cwd:
197
+ cwd_label = get_message("tool_text.working_directory")
198
+ cwd_text = f"[dim]{cwd_label}[/dim] [green]{tool.cwd}[/]\n"
199
+
200
+ env_text = ""
201
+ if tool.env:
202
+ env_count = len(tool.env)
203
+ env_label = get_message("tool_text.environment_variables")
204
+ variables_label = get_message("tool_text.variables")
205
+ env_text = f"[dim]{env_label}:[/dim] {env_count} {variables_label}\n"
206
+
207
+ return get_message_with_format(
208
+ "tool_display.session_start",
209
+ command=tool.command,
210
+ timeout_text=timeout_text,
211
+ cwd_text=cwd_text,
212
+ env_text=env_text,
213
+ )
214
+
215
+ elif isinstance(tool, SessionInteractiveTool):
216
+ input_snippet = tool.input[:100]
217
+ prompt_text = ""
218
+ if tool.expect_prompt and tool.prompt_regex:
219
+ prompt_label = get_message("tool_text.expected_prompt")
220
+ prompt_text = (
221
+ f"[dim]{prompt_label}[/dim] [yellow]{tool.prompt_regex}[/]"
222
+ )
223
+
224
+ return get_message_with_format(
225
+ "tool_display.session_interactive",
226
+ session_id=tool.session_id,
227
+ input_snippet=input_snippet,
228
+ ellipsis="..." if len(tool.input) > 100 else "",
229
+ prompt_text=prompt_text,
230
+ )
231
+
232
+ elif isinstance(tool, SessionStopTool):
233
+ force_text = (
234
+ get_message("tool_text.yes")
235
+ if tool.force
236
+ else get_message("tool_text.no")
237
+ )
238
+
239
+ return get_message_with_format(
240
+ "tool_display.session_stop",
241
+ session_id=tool.session_id,
242
+ force_text=force_text,
243
+ )
244
+
245
+ elif isinstance(tool, ConversationMessageIdsReadTool):
246
+ return get_message("tool_display.conversation_message_ids_read")
247
+
248
+ elif isinstance(tool, ConversationMessageIdsWriteTool):
249
+ message_ids_snippet = tool.message_ids[:100]
250
+ return get_message_with_format(
251
+ "tool_display.conversation_message_ids_write",
252
+ action=tool.action,
253
+ message_ids_snippet=message_ids_snippet,
254
+ ellipsis="..." if len(tool.message_ids) > 100 else "",
255
+ )
256
+
257
+ elif isinstance(tool, RunNamedSubagentsTool):
258
+ return _format_run_named_subagents_tool(tool)
259
+
260
+ elif isinstance(tool, LoadExtraDocumentTool):
261
+ return get_message_with_format(
262
+ "tool_display.load_extra_document", name=tool.name
263
+ )
264
+
265
+ elif isinstance(tool, ExecuteWorkflowTool):
266
+ vars_text = ""
267
+ if tool.vars_override:
268
+ try:
269
+ vars_data = json.loads(tool.vars_override)
270
+ vars_preview = json.dumps(vars_data, ensure_ascii=False)
271
+ if len(vars_preview) > 100:
272
+ vars_preview = vars_preview[:100] + "..."
273
+ vars_label = get_message("tool_text.variables")
274
+ vars_text = f"[dim]{vars_label}:[/dim] {vars_preview}\n"
275
+ except:
276
+ vars_text = f"[dim]Variables:[/dim] {tool.vars_override[:100]}\n"
277
+
278
+ return get_message_with_format(
279
+ "tool_display.execute_workflow", name=tool.name, vars_text=vars_text
280
+ )
281
+
282
+ else:
283
+ # 未专门处理的工具的通用上下文
284
+ return get_message_with_format(
285
+ "tool_display.unknown_tool",
286
+ tool_type=tool_type.__name__,
287
+ data=tool.model_dump_json(indent=2),
288
+ )
289
+
290
+ except Exception as e:
291
+ # 格式化错误时的回退处理
292
+ return get_message_with_format(
293
+ "tool_display.format_error",
294
+ tool_type=tool_type.__name__,
295
+ error=str(e),
296
+ template="unknown",
297
+ context=str(tool.model_dump()),
43
298
  )
44
- },
45
- ExecuteCommandTool: {
46
- "en": (
47
- "AutoCoder wants to execute this command:\n[bold yellow]{{ command }}[/]\n"
48
- "[dim](Requires Approval: {{ requires_approval }})[/]"
49
- ),
50
- "zh": (
51
- "AutoCoder 想要执行此命令:\n[bold yellow]{{ command }}[/]\n"
52
- "[dim](需要批准:{{ requires_approval }})[/]"
299
+
300
+
301
+ def _format_todo_write_tool(tool: TodoWriteTool) -> str:
302
+ """格式化TodoWriteTool的显示"""
303
+ task_details = ""
304
+
305
+ # For create action, show the tasks being created
306
+ if tool.action == "create" and tool.content:
307
+ # Parse task content to show individual tasks
308
+ task_pattern = r"<task>(.*?)</task>"
309
+ task_matches = re.findall(task_pattern, tool.content, re.DOTALL)
310
+
311
+ if task_matches:
312
+ task_list = []
313
+ for i, task_content in enumerate(task_matches, 1):
314
+ task_content = task_content.strip()
315
+ if task_content:
316
+ task_list.append(f" {i}. {task_content}")
317
+
318
+ if task_list:
319
+ tasks_label = get_message("tool_text.tasks_to_create")
320
+ task_details += f"[dim]{tasks_label}[/dim]\n"
321
+ task_details += "\n".join(task_list) + "\n"
322
+ else:
323
+ # Fallback to showing raw content if no <task> tags
324
+ lines = tool.content.strip().split("\n")
325
+ task_list = []
326
+ for line in lines:
327
+ line = line.strip()
328
+ if line and not line.startswith("<"):
329
+ # Remove common prefixes like "1.", "- ", "* ", etc.
330
+ cleaned_line = re.sub(r"^[0-9]+\.\s*|-\s*|\*\s*", "", line)
331
+ if cleaned_line:
332
+ task_list.append(f" • {cleaned_line}")
333
+
334
+ if task_list:
335
+ tasks_label = get_message("tool_text.tasks_to_create")
336
+ task_details += f"[dim]{tasks_label}[/dim]\n"
337
+ task_details += "\n".join(task_list) + "\n"
338
+
339
+ # For other actions, show relevant details
340
+ if tool.task_id:
341
+ task_id_label = get_message("tool_text.task_id")
342
+ task_details += f"[dim]{task_id_label}[/dim] [yellow]{tool.task_id}[/]\n"
343
+
344
+ if tool.content and tool.action != "create":
345
+ content_snippet = tool.content[:200]
346
+ ellipsis = "..." if len(tool.content) > 200 else ""
347
+ content_label = get_message("tool_text.content")
348
+ task_details += f"[dim]{content_label}[/dim] {content_snippet}{ellipsis}\n"
349
+
350
+ if tool.priority:
351
+ priority_icons = {"high": "🔴", "medium": "🟡", "low": "🟢"}
352
+ priority_icon = priority_icons.get(tool.priority, "⚪")
353
+ priority_display = get_message(f"tool_text.priority.{tool.priority}")
354
+ priority_label = get_message("tool_text.priority")
355
+ task_details += (
356
+ f"[dim]{priority_label}[/dim] {priority_icon} {priority_display}\n"
53
357
  )
54
- },
55
- ListFilesTool: {
56
- "en": (
57
- "AutoCoder wants to list files in:\n[bold green]{{ path }}[/] "
58
- "{{ recursive_text }}"
59
- ),
60
- "zh": (
61
- "AutoCoder 想要列出此目录中的文件:\n[bold green]{{ path }}[/] "
62
- "{{ recursive_text }}"
358
+
359
+ if tool.status:
360
+ status_icons = {"pending": "⏳", "in_progress": "🔄", "completed": "✅"}
361
+ status_icon = status_icons.get(tool.status, "❓")
362
+ status_display = get_message(f"tool_text.status.{tool.status}")
363
+ status_label = get_message("tool_text.status")
364
+ task_details += f"[dim]{status_label}[/dim] {status_icon} {status_display}\n"
365
+
366
+ # Notes text with better formatting
367
+ notes_text = ""
368
+ if tool.notes:
369
+ notes_snippet = tool.notes[:300]
370
+ ellipsis = "..." if len(tool.notes) > 300 else ""
371
+ notes_label = get_message("tool_text.notes")
372
+ notes_text = f"\n[dim]{notes_label}[/dim] 📝 {notes_snippet}{ellipsis}"
373
+
374
+ # Add action summary at the end for better context
375
+ action_summary = ""
376
+ if tool.action == "create":
377
+ task_count = (
378
+ len(re.findall(r"<task>.*?</task>", tool.content, re.DOTALL))
379
+ if tool.content
380
+ else 0
63
381
  )
64
- },
65
- SearchFilesTool: {
66
- "en": (
67
- "AutoCoder wants to search files in:\n[bold green]{{ path }}[/]\n"
68
- "[dim]File Pattern:[/dim] [yellow]{{ file_pattern }}[/]\n"
69
- "[dim]Regex:[/dim] [yellow]{{ regex }}[/]"
70
- ),
71
- "zh": (
72
- "AutoCoder 想要在此目录中搜索文件:\n[bold green]{{ path }}[/]\n"
73
- "[dim]文件模式:[/dim] [yellow]{{ file_pattern }}[/]\n"
74
- "[dim]正则表达式:[/dim] [yellow]{{ regex }}[/]"
382
+ if task_count == 0 and tool.content:
383
+ # Count lines as tasks if no <task> tags
384
+ lines = [
385
+ line.strip()
386
+ for line in tool.content.strip().split("\n")
387
+ if line.strip()
388
+ ]
389
+ task_count = len(lines)
390
+ total_tasks_label = get_message("tool_text.total_tasks")
391
+ action_summary = f"\n[dim]{total_tasks_label}[/dim] {task_count}"
392
+
393
+ return get_message_with_format(
394
+ "tool_display.todo_write",
395
+ task_details=task_details,
396
+ notes_text=notes_text + action_summary,
397
+ )
398
+
399
+
400
+ def _format_run_named_subagents_tool(tool: RunNamedSubagentsTool) -> str:
401
+ """格式化RunNamedSubagentsTool的显示"""
402
+ # Parse subagents configuration and extract display info
403
+ try:
404
+ # Try to parse as JSON first
405
+ try:
406
+ subagents_data = json.loads(tool.subagents)
407
+ if isinstance(subagents_data, list):
408
+ execution_mode = "parallel"
409
+ subagents_list = subagents_data
410
+ else:
411
+ execution_mode = "parallel"
412
+ subagents_list = []
413
+ except json.JSONDecodeError:
414
+ # Try to parse as YAML
415
+ try:
416
+ subagents_data = yaml.safe_load(tool.subagents)
417
+ if isinstance(subagents_data, dict):
418
+ execution_mode = subagents_data.get("mode", "parallel")
419
+ subagents_list = subagents_data.get("subagents", [])
420
+ elif isinstance(subagents_data, list):
421
+ execution_mode = "parallel"
422
+ subagents_list = subagents_data
423
+ else:
424
+ execution_mode = "unknown"
425
+ subagents_list = []
426
+ except yaml.YAMLError:
427
+ execution_mode = "unknown"
428
+ subagents_list = []
429
+
430
+ # Translate execution mode
431
+ execution_mode_display = get_message(
432
+ f"tool_text.execution_mode.{execution_mode}"
75
433
  )
76
- },
77
- ListCodeDefinitionNamesTool: {
78
- "en": "AutoCoder wants to list definitions in:\n[bold green]{{ path }}[/]",
79
- "zh": "AutoCoder 想要列出此路径中的定义:\n[bold green]{{ path }}[/]"
80
- },
81
- AskFollowupQuestionTool: {
82
- "en": (
83
- "AutoCoder is asking a question:\n[bold magenta]{{ question }}[/]\n"
84
- "{{ options_text }}"
85
- ),
86
- "zh": (
87
- "AutoCoder 正在提问:\n[bold magenta]{{ question }}[/]\n"
88
- "{{ options_text }}"
434
+
435
+ # Build subagent details
436
+ subagent_details = ""
437
+ if subagents_list:
438
+ detail_lines = []
439
+ for i, subagent in enumerate(subagents_list[:3], 1): # Show max 3 subagents
440
+ if isinstance(subagent, dict):
441
+ name = subagent.get("name", "unnamed")
442
+ task = subagent.get("task", "no task specified")
443
+ # Truncate task if too long
444
+ task_display = task[:80] + "..." if len(task) > 80 else task
445
+
446
+ agent_label = get_message("tool_text.agent")
447
+ task_label = get_message("tool_text.task")
448
+ detail_lines.append(f" {i}. [green]{name}[/] ({agent_label})")
449
+ detail_lines.append(f" [dim]{task_label}:[/dim] {task_display}")
450
+
451
+ if len(subagents_list) > 3:
452
+ more_count = len(subagents_list) - 3
453
+ more_label = get_message_with_format(
454
+ "tool_text.and_more", count=more_count
455
+ )
456
+ detail_lines.append(f" [dim]{more_label}[/dim]")
457
+
458
+ subagent_details = "\n".join(detail_lines)
459
+ else:
460
+ # No subagents found
461
+ no_agents_msg = get_message("tool_text.no_agents_configured")
462
+ subagent_details = f"[dim]{no_agents_msg}[/dim]"
463
+
464
+ return get_message_with_format(
465
+ "tool_display.run_named_subagents",
466
+ execution_mode=execution_mode_display,
467
+ subagent_count=len(subagents_list),
468
+ subagent_details=subagent_details,
89
469
  )
90
- },
91
- UseMcpTool: {
92
- "en": (
93
- "AutoCoder wants to use an MCP tool:\n"
94
- "[dim]Server:[/dim] [blue]{{ server_name }}[/]\n"
95
- "[dim]Tool:[/dim] [blue]{{ tool_name }}[/]\n"
96
- "[dim]Args:[/dim] {{ arguments_snippet }}{{ ellipsis }}"
97
- ),
98
- "zh": (
99
- "AutoCoder 想要使用 MCP 工具:\n"
100
- "[dim]服务器:[/dim] [blue]{{ server_name }}[/]\n"
101
- "[dim]工具:[/dim] [blue]{{ tool_name }}[/]\n"
102
- "[dim]参数:[/dim] {{ arguments_snippet }}{{ ellipsis }}"
470
+
471
+ except Exception as e:
472
+ # Fallback to showing raw content if parsing fails
473
+ snippet = tool.subagents[:200]
474
+ ellipsis = "..." if len(tool.subagents) > 200 else ""
475
+ raw_label = get_message("tool_text.raw_config")
476
+ unknown_text = get_message("tool_text.unknown")
477
+ subagent_details = f"[dim]{raw_label}:[/dim] {snippet}{ellipsis}"
478
+
479
+ return get_message_with_format(
480
+ "tool_display.run_named_subagents",
481
+ execution_mode=unknown_text,
482
+ subagent_count=unknown_text,
483
+ subagent_details=subagent_details,
103
484
  )
104
- }
105
- }
106
485
 
107
- def get_tool_display_message(tool: BaseTool) -> str:
486
+
487
+ def get_tool_title(tool: BaseTool) -> str:
108
488
  """
109
- 生成工具调用的用户友好、国际化的字符串表示。
489
+ 获取工具的标题,用于在 Panel 标题中显示。
110
490
 
111
491
  Args:
112
- tool: 工具实例(Pydantic模型)。
492
+ tool: 工具实例
113
493
 
114
494
  Returns:
115
- 用于在终端中显示的格式化字符串。
495
+ 适合显示在标题栏的简短描述
116
496
  """
117
- lang = get_system_language()
118
497
  tool_type = type(tool)
119
498
 
120
- if tool_type not in TOOL_DISPLAY_MESSAGES:
121
- # 未知工具的回退处理
122
- return f"未知工具类型: {tool_type.__name__}\n数据: {tool.model_dump_json(indent=2)}"
499
+ # Special handling for TodoWriteTool to show action-specific titles
500
+ if isinstance(tool, TodoWriteTool) and tool.action:
501
+ try:
502
+ return get_message(f"tool_title.todo_write.{tool.action}")
503
+ except:
504
+ pass # Fall back to generic title
505
+
506
+ # Map tool types to message keys
507
+ tool_type_to_key = {
508
+ ReadFileTool: "tool_title.read_file",
509
+ WriteToFileTool: "tool_title.write_to_file",
510
+ ReplaceInFileTool: "tool_title.replace_in_file",
511
+ ExecuteCommandTool: "tool_title.execute_command",
512
+ ListFilesTool: "tool_title.list_files",
513
+ SearchFilesTool: "tool_title.search_files",
514
+ ListCodeDefinitionNamesTool: "tool_title.list_code_definition_names",
515
+ AskFollowupQuestionTool: "tool_title.ask_followup_question",
516
+ UseMcpTool: "tool_title.use_mcp",
517
+ UseRAGTool: "tool_title.use_rag",
518
+ ACModReadTool: "tool_title.ac_mod_read",
519
+ ACModWriteTool: "tool_title.ac_mod_write",
520
+ ACModListTool: "tool_title.ac_mod_list",
521
+ CountTokensTool: "tool_title.count_tokens",
522
+ TodoReadTool: "tool_title.todo_read",
523
+ TodoWriteTool: "tool_title.todo_write",
524
+ SessionStartTool: "tool_title.session_start",
525
+ SessionInteractiveTool: "tool_title.session_interactive",
526
+ SessionStopTool: "tool_title.session_stop",
527
+ ConversationMessageIdsReadTool: "tool_title.conversation_message_ids_read",
528
+ ConversationMessageIdsWriteTool: "tool_title.conversation_message_ids_write",
529
+ RunNamedSubagentsTool: "tool_title.run_named_subagents",
530
+ LoadExtraDocumentTool: "tool_title.load_extra_document",
531
+ ExecuteWorkflowTool: "tool_title.execute_workflow",
532
+ }
123
533
 
124
- templates = TOOL_DISPLAY_MESSAGES[tool_type]
125
- template = templates.get(lang, templates.get("en", "工具显示模板未找到")) # 回退到英文
534
+ message_key = tool_type_to_key.get(tool_type)
535
+ if message_key:
536
+ try:
537
+ return get_message(message_key)
538
+ except:
539
+ pass # Fall back to generic title
540
+
541
+ # Fallback to generic message
542
+ return f"AutoCoder is using {tool_type.__name__}"
126
543
 
127
- # 准备特定于每种工具类型的上下文
128
- context = {}
129
- if isinstance(tool, ReadFileTool):
130
- context = {"path": tool.path}
131
- elif isinstance(tool, WriteToFileTool):
132
- snippet = tool.content[:150]
133
- context = {
134
- "path": tool.path,
135
- "content_snippet": snippet,
136
- "ellipsis": '...' if len(tool.content) > 150 else ''
137
- }
138
- elif isinstance(tool, ReplaceInFileTool):
139
- snippet = tool.diff
140
- context = {
141
- "path": tool.path,
142
- "diff_snippet": snippet,
143
- "ellipsis": ''
144
- }
145
- elif isinstance(tool, ExecuteCommandTool):
146
- context = {"command": tool.command, "requires_approval": tool.requires_approval}
147
- elif isinstance(tool, ListFilesTool):
148
- rec_text_en = '(Recursively)' if tool.recursive else '(Top Level)'
149
- rec_text_zh = '(递归)' if tool.recursive else '(顶层)'
150
- context = {
151
- "path": tool.path,
152
- "recursive_text": rec_text_zh if lang == 'zh' else rec_text_en
153
- }
154
- elif isinstance(tool, SearchFilesTool):
155
- context = {
156
- "path": tool.path,
157
- "file_pattern": tool.file_pattern or '*',
158
- "regex": tool.regex
159
- }
160
- elif isinstance(tool, ListCodeDefinitionNamesTool):
161
- context = {"path": tool.path}
162
- elif isinstance(tool, AskFollowupQuestionTool):
163
- options_text_en = ""
164
- options_text_zh = ""
165
- if tool.options:
166
- options_list_en = "\n".join([f"- {opt}" for opt in tool.options])
167
- options_list_zh = "\n".join([f"- {opt}" for opt in tool.options]) # 假设选项足够简单,不需要翻译
168
- options_text_en = f"[dim]Options:[/dim]\n{options_list_en}"
169
- options_text_zh = f"[dim]选项:[/dim]\n{options_list_zh}"
170
- context = {
171
- "question": tool.question,
172
- "options_text": options_text_zh if lang == 'zh' else options_text_en
173
- }
174
- elif isinstance(tool, UseMcpTool):
175
- args_str = tool.query
176
- snippet = args_str[:100]
177
- context = {
178
- "server_name": tool.server_name,
179
- "tool_name": tool.tool_name,
180
- "arguments_snippet": snippet,
181
- "ellipsis": '...' if len(args_str) > 100 else ''
182
- }
183
- else:
184
- # 未专门处理的工具的通用上下文
185
- context = tool.model_dump()
544
+
545
+ def get_tool_result_title(tool_name: str, success: bool) -> str:
546
+ """
547
+ 获取工具结果的标题,用于在 Panel 标题中显示。
548
+
549
+ Args:
550
+ tool_name: 工具名称(如 TodoWriteToolResolver)
551
+ success: 操作是否成功
552
+
553
+ Returns:
554
+ 适合显示在结果标题栏的描述
555
+ """
556
+ # Remove "ToolResolver" suffix and "Resolver" suffix to get base name
557
+ base_name = tool_name
558
+ if base_name.endswith("ToolResolver"):
559
+ base_name = base_name[:-12] # Remove "ToolResolver"
560
+ elif base_name.endswith("Resolver"):
561
+ base_name = base_name[:-8] # Remove "Resolver"
562
+
563
+ # Add "Tool" back if it was part of the resolver name but not the base name
564
+ if not base_name.endswith("Tool"):
565
+ base_name += "Tool"
566
+
567
+ # Convert tool name to message key format (e.g., "TodoWriteTool" -> "todo_write")
568
+ # Split camelCase and convert to lowercase with underscores
569
+ tool_key = re.sub(r"(?<!^)(?=[A-Z])", "_", base_name).lower()
570
+ if tool_key.endswith("_tool"):
571
+ tool_key = tool_key[:-5] # Remove "_tool" suffix
572
+
573
+ # Try to get specific message for this tool
574
+ result_type = "success" if success else "failure"
575
+ message_key = f"tool_result.{tool_key}.{result_type}"
186
576
 
187
577
  try:
188
- return format_str_jinja2(template, **context)
189
- except Exception as e:
190
- # 格式化错误时的回退处理
191
- return f"格式化 {tool_type.__name__} 的显示时出错: {e}\n模板: {template}\n上下文: {context}"
578
+ return get_message(message_key)
579
+ except:
580
+ # Fallback to generic messages
581
+ fallback_key = f"tool_result.{result_type}_generic"
582
+ try:
583
+ return get_message(fallback_key)
584
+ except:
585
+ # Final fallback
586
+ if success:
587
+ return "Operation completed successfully"
588
+ else:
589
+ return "Operation failed"