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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +970 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +288 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +932 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -5,15 +5,20 @@ SdkRunner 提供生成器接口,适用于SDK环境下的代理运行。
5
5
  它是三种运行模式中最轻量级的一种,适合集成到其他应用程序中。
6
6
  """
7
7
 
8
- import logging
9
- from typing import Generator, Any
8
+ from loguru import logger
9
+ from typing import Generator, Any, Optional
10
+ import os
11
+ import time
10
12
 
11
13
  from autocoder.common.v2.agent.agentic_edit_types import (
12
- AgenticEditRequest, AgentEvent, CompletionEvent
14
+ AgenticEditRequest, AgentEvent, CompletionEvent, PullRequestEvent,
15
+ PullRequestResult, CommitEvent,PreCommitEvent
13
16
  )
14
- from .base_runner import BaseRunner
17
+ from autocoder.common import git_utils
18
+ from autocoder.common.git_utils import CommitResult
19
+ from autocoder.common.pull_requests import create_pull_request
15
20
 
16
- logger = logging.getLogger(__name__)
21
+ from .base_runner import BaseRunner
17
22
 
18
23
  class SdkRunner(BaseRunner):
19
24
  """
@@ -22,17 +27,154 @@ class SdkRunner(BaseRunner):
22
27
  这个运行器返回一个事件生成器,允许外部代码迭代处理代理事件。
23
28
  它是三种运行模式中最轻量级的一种,适合集成到其他应用程序中。
24
29
  """
30
+
31
+ def apply_pre_changes(self)->Optional[CommitResult]:
32
+ # get the file name
33
+ file_name = os.path.basename(self.args.file)
34
+ if not self.args.skip_commit:
35
+ try:
36
+ commit_result = git_utils.commit_changes(
37
+ self.args.source_dir, f"auto_coder_pre_{file_name}")
38
+ return commit_result
39
+
40
+ except Exception as e:
41
+ self.printer.print_in_terminal("git_init_required",
42
+ source_dir=self.args.source_dir, error=str(e))
43
+ return None
44
+
45
+ def apply_changes(self) -> tuple[Optional[CommitResult], Optional[PullRequestResult]]:
46
+ """
47
+ 应用变更并可选地创建 Pull Request
48
+
49
+ Returns:
50
+ tuple: (commit_result, pull_request_result)
51
+ """
52
+ if not self.args.skip_commit:
53
+ try:
54
+ file_name = os.path.basename(self.args.file)
55
+ commit_result = git_utils.commit_changes(
56
+ self.args.source_dir,
57
+ f"{self.args.query}\nauto_coder_{file_name}",
58
+ )
59
+
60
+ pull_request_result = None
61
+ # 检查是否需要创建 Pull Request
62
+ if self.conversation_config and self.conversation_config.pull_request:
63
+ pr_result = self._create_pull_request(commit_result)
64
+ if pr_result:
65
+ # 将 PRResult 转换为 PullRequestResult
66
+ pull_request_result = PullRequestResult.from_pr_result(pr_result)
67
+
68
+ return commit_result, pull_request_result
69
+
70
+ except Exception as e:
71
+ self.printer.print_str_in_terminal(
72
+ str(e),
73
+ style="red"
74
+ )
75
+
76
+ return None, None
77
+
78
+ def _create_pull_request(self, commit_result):
79
+ """
80
+ 创建 Pull Request 的内部方法
81
+
82
+ Args:
83
+ commit_result: Git commit 结果对象
84
+
85
+ Returns:
86
+ PRResult: Pull Request 创建结果
87
+ """
88
+ try:
89
+
90
+ # 获取当前分支名
91
+ current_branch = git_utils.get_current_branch(self.args.source_dir)
92
+ if not current_branch:
93
+ logger.warning("无法获取当前分支名")
94
+ return None
95
+
96
+ # 准备 PR 标题和描述
97
+ query = self.args.query or "Auto-coder generated changes"
98
+ pr_title = f"Auto-coder: {query[:40]}..."
99
+
100
+ # 构建 PR 描述
101
+ file_list = ""
102
+ if commit_result.changed_files:
103
+ for file_path in commit_result.changed_files:
104
+ file_list += f"- `{file_path}`\n"
105
+
106
+ pr_description = f"""## 自动生成的代码变更
107
+
108
+ **查询内容**: {query}
109
+
110
+ **变更文件数量**: {len(commit_result.changed_files or [])}
111
+
112
+ **Commit Hash**: {commit_result.commit_hash}
113
+
114
+ ### 变更文件列表:
115
+ {file_list.strip()}
116
+
117
+ **源分支**: {current_branch}
118
+ **目标分支**: main
119
+ **生成时间**: {time.strftime('%Y-%m-%d %H:%M:%S')}
120
+ ---
121
+ 此 Pull Request 由 Auto-coder 自动生成
122
+ """
123
+
124
+ # 创建 Pull Request
125
+ logger.info(f"正在创建 Pull Request: {pr_title}")
126
+
127
+ result = create_pull_request(
128
+ repo_path=self.args.source_dir,
129
+ title=pr_title,
130
+ description=pr_description,
131
+ )
132
+
133
+ if result.success:
134
+ logger.info("Pull Request 创建成功")
135
+ logger.info(f"PR URL: {result.pr_url}")
136
+ logger.info(f"PR 编号: {result.pr_number}")
137
+
138
+ return result
139
+
140
+ except Exception as e:
141
+ logger.exception(f"创建 Pull Request 时发生异常: {str(e)}")
142
+ # 返回一个失败的 PRResult
143
+ try:
144
+ from autocoder.common.pull_requests.models import PRResult
145
+ return PRResult(
146
+ success=False,
147
+ error_message=f"创建 Pull Request 失败: {str(e)}"
148
+ )
149
+ except ImportError:
150
+ return None
25
151
 
26
152
  def run(self, request: AgenticEditRequest) -> Generator[AgentEvent, None, None]:
27
153
  """
28
154
  Runs the agentic edit process and yields events for external processing.
29
155
  """
30
156
  try:
31
- event_stream = self.analyze(request)
157
+ if self.conversation_config and self.conversation_config.pre_commit:
158
+ pre_commit_result = self.apply_pre_changes()
159
+ yield PreCommitEvent(commit_result=pre_commit_result)
160
+
161
+ event_stream = self.analyze(request)
32
162
  for agent_event in event_stream:
33
163
  if isinstance(agent_event, CompletionEvent):
34
- self.apply_changes()
35
- yield agent_event
164
+ if self.conversation_config and self.conversation_config.post_commit:
165
+ commit_result, pull_request_result = self.apply_changes()
166
+ # 发射 commit 事件
167
+ if commit_result:
168
+ yield CommitEvent(commit_result=commit_result)
169
+
170
+ # 发射 pull request 事件(如果有)
171
+ if pull_request_result:
172
+ yield PullRequestEvent(pull_request_result=pull_request_result)
173
+
174
+ # 总是发射 completion 事件
175
+ yield agent_event
176
+ else:
177
+ yield agent_event
36
178
 
37
179
  except Exception as e:
38
180
  logger.exception(
@@ -17,18 +17,21 @@ from rich.markdown import Markdown
17
17
  from rich.syntax import Syntax
18
18
 
19
19
  from autocoder.common.auto_coder_lang import get_message
20
+ from byzerllm.utils.types import SingleOutputMeta
20
21
  from autocoder.utils import llms as llm_utils
21
22
  from autocoder.common.v2.agent.agentic_edit_types import (
22
23
  AgenticEditRequest, AgentEvent, CompletionEvent,
23
24
  LLMOutputEvent, LLMThinkingEvent, ToolCallEvent,
24
25
  ToolResultEvent, TokenUsageEvent, ErrorEvent,
25
26
  WindowLengthChangeEvent, ConversationIdEvent,
26
- PlanModeRespondEvent, SingleOutputMeta, AttemptCompletionTool
27
+ PlanModeRespondEvent, AttemptCompletionTool,
28
+ ConversationAction, TodoReadTool, TodoWriteTool,
29
+ ConversationMessageIdsWriteTool, ConversationMessageIdsReadTool
27
30
  )
28
- from .tool_display import get_tool_display_message
31
+ from .tool_display import get_tool_display_message, get_tool_title, get_tool_result_title
29
32
  from .base_runner import BaseRunner
30
-
31
- logger = logging.getLogger(__name__)
33
+ from autocoder.common.wrap_llm_hint.utils import extract_content_from_text, has_hint_in_text
34
+ from loguru import logger
32
35
 
33
36
  class TerminalRunner(BaseRunner):
34
37
  """
@@ -38,37 +41,55 @@ class TerminalRunner(BaseRunner):
38
41
  并以用户友好的方式在终端中显示。
39
42
  """
40
43
 
41
- def run(self, request: AgenticEditRequest) -> None:
44
+ def _safe_console_print(self, console: Console, renderable, fallback_content: Optional[str] = None, error_prefix: str = "Rich display"):
45
+ """
46
+ 安全地在控制台打印内容,如果Rich markup失败则回退到纯文本。
47
+
48
+ Args:
49
+ console: Rich Console对象
50
+ renderable: 要渲染的Rich对象(如Panel、Markdown等)
51
+ fallback_content: 回退时显示的内容,如果为None则从renderable中提取
52
+ error_prefix: 错误日志的前缀
53
+ """
54
+ try:
55
+ console.print(renderable)
56
+ except Exception as display_error:
57
+ logger.warning(f"{error_prefix} error, falling back to plain text: {display_error}")
58
+
59
+ # 如果没有提供fallback_content,尝试从renderable中提取
60
+ if fallback_content is None:
61
+ if hasattr(renderable, 'renderable') and hasattr(renderable.renderable, 'markup'):
62
+ # Panel with Markdown
63
+ fallback_content = str(renderable.renderable.markup)
64
+ elif hasattr(renderable, 'renderable'):
65
+ # Panel with other content
66
+ fallback_content = str(renderable.renderable)
67
+ else:
68
+ fallback_content = str(renderable)
69
+
70
+ # 转义Rich markup字符
71
+ safe_content = fallback_content.replace('[', '\\[').replace(']', '\\]')
72
+
73
+ # 如果原来是Panel,保持Panel结构
74
+ if hasattr(renderable, 'title') and hasattr(renderable, 'border_style'):
75
+ console.print(Panel(
76
+ safe_content,
77
+ title=renderable.title,
78
+ border_style=renderable.border_style,
79
+ title_align=getattr(renderable, 'title_align', 'center')
80
+ ))
81
+ else:
82
+ console.print(safe_content)
83
+
84
+ def run(self, request: AgenticEditRequest) -> str:
42
85
  """
43
86
  Runs the agentic edit process based on the request and displays
44
87
  the interaction streamingly in the terminal using Rich.
45
- """
46
- import json
88
+ """
89
+ self.attempt_result = ""
47
90
  console = Console()
48
- project_name = os.path.basename(os.path.abspath(self.args.source_dir))
49
-
50
- if self.conversation_config.action == "list":
51
- conversations = self.agent.conversation_manager.list_conversations()
52
- # 只保留 conversation_id 和 name 字段
53
- filtered_conversations = []
54
- for conv in conversations:
55
- filtered_conv = {
56
- "conversation_id": conv.get("conversation_id"),
57
- "name": conv.get("name")
58
- }
59
- filtered_conversations.append(filtered_conv)
60
-
61
- # 格式化 JSON 输出,使用 JSON 格式渲染而不是 Markdown
62
- json_str = json.dumps(filtered_conversations, ensure_ascii=False, indent=4)
63
- console.print(Panel(json_str,
64
- title="🏁 Task Completion", border_style="green", title_align="left"))
65
- return
66
-
67
-
68
- if self.conversation_config.action == "new" and not request.user_input.strip():
69
- console.print(Panel(Markdown(f"New conversation created: {self.agent.conversation_manager.get_current_conversation_id()}"),
70
- title="🏁 Task Completion", border_style="green", title_align="left"))
71
- return
91
+ source_dir = self.args.source_dir or "."
92
+ project_name = os.path.basename(os.path.abspath(source_dir))
72
93
 
73
94
  console.rule(f"[bold cyan]Starting Agentic Edit: {project_name}[/]")
74
95
  console.print(Panel(
@@ -83,10 +104,10 @@ class TerminalRunner(BaseRunner):
83
104
  "output_cost": 0.0
84
105
  }
85
106
 
86
- try:
87
- self.apply_pre_changes()
88
- event_stream = self.analyze(request)
89
- for event in event_stream:
107
+ try:
108
+ self.apply_pre_changes()
109
+ event_stream = self.analyze(request)
110
+ for event in event_stream:
90
111
  if isinstance(event, ConversationIdEvent):
91
112
  console.print(f"[dim]Conversation ID: {event.conversation_id}[/dim]")
92
113
  continue
@@ -121,7 +142,10 @@ class TerminalRunner(BaseRunner):
121
142
  elif isinstance(event, WindowLengthChangeEvent):
122
143
  # 显示当前会话的token数量
123
144
  logger.info(f"当前会话总 tokens: {event.tokens_used}")
124
- console.print(f"[dim]当前会话总 tokens: {event.tokens_used}[/dim]")
145
+ if event.tokens_used > event.pruned_tokens_used:
146
+ console.print(f"[dim]conversation tokens: {event.tokens_used} -> {event.pruned_tokens_used} (conversation round: {event.conversation_round})[/dim]")
147
+ else:
148
+ console.print(f"[dim]conversation tokens: {event.tokens_used} (conversation round: {event.conversation_round})[/dim]")
125
149
 
126
150
  elif isinstance(event, LLMThinkingEvent):
127
151
  # Render thinking within a less prominent style, maybe grey?
@@ -134,11 +158,38 @@ class TerminalRunner(BaseRunner):
134
158
  if isinstance(event.tool, AttemptCompletionTool):
135
159
  continue # Do not display AttemptCompletionTool tool call
136
160
 
137
- tool_name = type(event.tool).__name__
161
+ # Special handling for ConversationMessageIds tools - only show compacting message
162
+ if isinstance(event.tool, (ConversationMessageIdsWriteTool, ConversationMessageIdsReadTool)):
163
+ # Use internationalization module to get the compacting message
164
+ compacting_message = get_message("conversation_compacting")
165
+ compacting_title = get_message("conversation_compacting_title")
166
+
167
+ self._safe_console_print(
168
+ console,
169
+ Panel(f"[dim]{compacting_message}[/dim]", title=f"🗜️ {compacting_title}", border_style="yellow", title_align="left"),
170
+ fallback_content=compacting_message,
171
+ error_prefix="Compacting display"
172
+ )
173
+ continue
174
+
175
+ # Get the descriptive title for the tool
176
+ title = get_tool_title(event.tool)
177
+
138
178
  # Use the new internationalized display function
139
179
  display_content = get_tool_display_message(event.tool)
140
- console.print(Panel(
141
- display_content, title=f"🔧 Action: {tool_name}", border_style="blue", title_align="left"))
180
+
181
+ # Use cyan border for todo tools, blue for others
182
+ if isinstance(event.tool, (TodoReadTool, TodoWriteTool)):
183
+ border_style = "cyan"
184
+ else:
185
+ border_style = "blue"
186
+
187
+ self._safe_console_print(
188
+ console,
189
+ Panel(display_content, title=f"📝 {title}", border_style=border_style, title_align="left"),
190
+ fallback_content=str(display_content),
191
+ error_prefix="Tool display"
192
+ )
142
193
 
143
194
  elif isinstance(event, ToolResultEvent):
144
195
  # Skip displaying AttemptCompletionTool's result
@@ -148,11 +199,44 @@ class TerminalRunner(BaseRunner):
148
199
  if event.tool_name == "PlanModeRespondTool":
149
200
  continue
150
201
 
202
+ # Skip displaying ConversationMessageIds tools' results - they are handled by the compacting message
203
+ if event.tool_name in ["ConversationMessageIdsWriteTool", "ConversationMessageIdsReadTool"]:
204
+ continue
205
+
151
206
  result = event.result
152
- title = f"✅ Tool Result: {event.tool_name}" if result.success else f"❌ Tool Result: {event.tool_name}"
207
+
208
+ # Use friendly result title instead of tool name
209
+ result_title = get_tool_result_title(event.tool_name, result.success)
210
+ title_icon = "✅" if result.success else "❌"
211
+ title = f"{title_icon} {result_title}"
153
212
  border_style = "green" if result.success else "red"
154
- base_content = f"[bold]Status:[/bold] {'Success' if result.success else 'Failure'}\n"
155
- base_content += f"[bold]Message:[/bold] {result.message}\n"
213
+
214
+ # Special handling for TodoReadTool and TodoWriteTool
215
+ if event.tool_name in ["TodoReadTool", "TodoWriteTool","SessionStartTool","SessionInteractiveTool","SessionStopTool"]:
216
+ # For todo tools, display content directly without syntax highlighting
217
+ if result.content:
218
+ # The content is already nicely formatted by the resolver
219
+ self._safe_console_print(
220
+ console,
221
+ Panel(result.content, title=title, border_style=border_style, title_align="left"),
222
+ fallback_content=str(result.content),
223
+ error_prefix="Todo content display"
224
+ )
225
+ else:
226
+ # If no content, just show the message
227
+ status_message = f"[bold]Status:[/bold] {'Success' if result.success else 'Failure'}\n[bold]Message:[/bold] {result.message}"
228
+ fallback_message = f"Status: {'Success' if result.success else 'Failure'}\nMessage: {result.message}"
229
+ self._safe_console_print(
230
+ console,
231
+ Panel(status_message, title=title, border_style=border_style, title_align="left"),
232
+ fallback_content=fallback_message,
233
+ error_prefix="Todo message display"
234
+ )
235
+ continue # Skip the rest of the processing for todo tools
236
+
237
+ # Regular processing for other tools
238
+ base_content = f"[bold]Status:[/bold] {'Success' if result.success else 'Failure'}"
239
+ base_content += f"\n[bold]Message:[/bold] {result.message}"
156
240
 
157
241
  def _format_content(content):
158
242
  if len(content) > 200:
@@ -167,13 +251,19 @@ class TerminalRunner(BaseRunner):
167
251
  if result.content is not None:
168
252
  content_str = ""
169
253
  try:
170
- if isinstance(result.content, (dict, list)):
171
- import json
254
+ # Remove hints from content before processing
255
+ processed_content = result.content
256
+ if isinstance(result.content, str) and has_hint_in_text(result.content):
257
+ processed_content = extract_content_from_text(result.content)
258
+
259
+ if isinstance(processed_content, (dict, list)):
260
+ if not processed_content:
261
+ continue
172
262
  content_str = json.dumps(
173
- result.content, indent=2, ensure_ascii=False)
263
+ processed_content, indent=2, ensure_ascii=False)
174
264
  syntax_content = Syntax(
175
265
  content_str, "json", theme="default", line_numbers=False)
176
- elif isinstance(result.content, str) and ('\n' in result.content or result.content.strip().startswith('<')):
266
+ elif isinstance(processed_content, str) and ('\n' in processed_content or processed_content.strip().startswith('<')):
177
267
  # Heuristic for code or XML/HTML
178
268
  lexer = "python" # Default guess
179
269
  if event.tool_name == "ReadFileTool" and isinstance(event.result.message, str):
@@ -202,9 +292,9 @@ class TerminalRunner(BaseRunner):
202
292
  lexer = "text"
203
293
 
204
294
  syntax_content = Syntax(
205
- _format_content(result.content), lexer, theme="default", line_numbers=True)
295
+ _format_content(processed_content), lexer, theme="default", line_numbers=True)
206
296
  else:
207
- content_str = str(result.content)
297
+ content_str = str(processed_content)
208
298
  # Append simple string content directly
209
299
  panel_content.append(
210
300
  _format_content(content_str))
@@ -215,16 +305,32 @@ class TerminalRunner(BaseRunner):
215
305
  # Fallback
216
306
  _format_content(str(result.content)))
217
307
 
218
- # Print the base info panel
219
- console.print(Panel("\n".join(
220
- panel_content), title=title, border_style=border_style, title_align="left"))
308
+ # Print the base info panel with error handling for Rich markup
309
+ panel_content_str = "\n".join(panel_content)
310
+ self._safe_console_print(
311
+ console,
312
+ Panel(panel_content_str, title=title, border_style=border_style, title_align="left"),
313
+ fallback_content=panel_content_str,
314
+ error_prefix="Tool result panel"
315
+ )
316
+
221
317
  # Print syntax highlighted content separately if it exists
222
318
  if syntax_content:
223
- console.print(syntax_content)
319
+ content_fallback = f"[bold]Content:[/bold]\n{result.content}"
320
+ self._safe_console_print(
321
+ console,
322
+ syntax_content,
323
+ fallback_content=content_fallback,
324
+ error_prefix="Syntax highlighting"
325
+ )
224
326
 
225
327
  elif isinstance(event, PlanModeRespondEvent):
226
- console.print(Panel(Markdown(event.completion.response),
227
- title="🏁 Task Completion", border_style="green", title_align="left"))
328
+ self._safe_console_print(
329
+ console,
330
+ Panel(Markdown(event.completion.response), title="🏁 Task Completion", border_style="green", title_align="left"),
331
+ fallback_content=event.completion.response,
332
+ error_prefix="Plan mode response"
333
+ )
228
334
 
229
335
  elif isinstance(event, CompletionEvent):
230
336
  # 在这里完成实际合并
@@ -234,8 +340,13 @@ class TerminalRunner(BaseRunner):
234
340
  logger.exception(
235
341
  f"Error merging shadow changes to project: {e}")
236
342
 
237
- console.print(Panel(Markdown(event.completion.result),
238
- title="🏁 Task Completion", border_style="green", title_align="left"))
343
+ self._safe_console_print(
344
+ console,
345
+ Panel(Markdown(event.completion.result), title="🏁 Task Completion", border_style="green", title_align="left"),
346
+ fallback_content=event.completion.result,
347
+ error_prefix="Task completion"
348
+ )
349
+ self.attempt_result = event.completion.result
239
350
  if event.completion.command:
240
351
  console.print(
241
352
  f"[dim]Suggested command:[/dim] [bold cyan]{event.completion.command}[/]")
@@ -257,7 +368,7 @@ class TerminalRunner(BaseRunner):
257
368
  speed=0.0,
258
369
  model_names=accumulated_token_usage["model_name"],
259
370
  sampling_count=1
260
- )
371
+ )
261
372
 
262
373
  except Exception as e:
263
374
  # 在处理异常时也打印累计的token使用情况
@@ -281,3 +392,5 @@ class TerminalRunner(BaseRunner):
281
392
  raise e
282
393
  finally:
283
394
  console.rule("[bold cyan]Agentic Edit Finished[/]")
395
+
396
+ return self.attempt_result