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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +409 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Tool Caller Usage Example
4
+
5
+ 展示如何使用 tool_caller 模块进行工具调用和插件管理。
6
+ """
7
+
8
+ import sys
9
+ import os
10
+
11
+ # 添加项目根目录到 Python 路径
12
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../../../..'))
13
+
14
+ from autocoder.common import AutoCoderArgs
15
+ from autocoder.common.v2.agent.agentic_edit_types import ExecuteCommandTool, ReadFileTool, ToolResult
16
+ from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
17
+ from autocoder.common.v2.agent.tool_caller import ToolCaller
18
+ from autocoder.common.v2.agent.tool_caller.plugins.examples import LoggingPlugin, SecurityFilterPlugin
19
+
20
+
21
+ class DemoToolResolver(BaseToolResolver):
22
+ """演示用的简单工具解析器"""
23
+
24
+ def resolve(self) -> ToolResult:
25
+ """简化的工具解析实现"""
26
+ if isinstance(self.tool, ExecuteCommandTool):
27
+ return ToolResult(
28
+ success=True,
29
+ message=f"Demo: Command '{self.tool.command}' executed",
30
+ content={"output": f"Mock output for: {self.tool.command}"}
31
+ )
32
+ elif isinstance(self.tool, ReadFileTool):
33
+ return ToolResult(
34
+ success=True,
35
+ message=f"Demo: File '{self.tool.path}' read",
36
+ content={"content": f"Mock content of {self.tool.path}"}
37
+ )
38
+ else:
39
+ return ToolResult(
40
+ success=False,
41
+ message=f"Demo: Unsupported tool type {type(self.tool).__name__}"
42
+ )
43
+
44
+
45
+ def main():
46
+ """主演示函数"""
47
+ print("=" * 60)
48
+ print("Tool Caller Module Usage Example")
49
+ print("=" * 60)
50
+
51
+ # 1. 创建工具解析器映射
52
+ print("\n1. Setting up tool resolver mapping...")
53
+ tool_resolver_map = {
54
+ ExecuteCommandTool: DemoToolResolver,
55
+ ReadFileTool: DemoToolResolver
56
+ }
57
+
58
+ # 2. 创建工具调用器
59
+ print("2. Creating ToolCaller instance...")
60
+ args = AutoCoderArgs(source_dir=".")
61
+ tool_caller = ToolCaller(
62
+ tool_resolver_map=tool_resolver_map,
63
+ args=args,
64
+ enable_plugins=True
65
+ )
66
+
67
+ # 3. 注册插件
68
+ print("3. Registering plugins...")
69
+ logging_plugin = LoggingPlugin(enabled=True, detailed_logging=True)
70
+ security_plugin = SecurityFilterPlugin(enabled=True)
71
+
72
+ tool_caller.register_plugin(logging_plugin)
73
+ tool_caller.register_plugin(security_plugin)
74
+
75
+ print(f" - Registered logging plugin (priority: {logging_plugin.priority.value})")
76
+ print(f" - Registered security filter plugin (priority: {security_plugin.priority.value})")
77
+
78
+ # 4. 获取插件状态
79
+ print("\n4. Plugin system status:")
80
+ status = tool_caller.get_plugin_status()
81
+ print(f" - Total plugins: {status['total_plugins']}")
82
+ print(f" - Enabled plugins: {status['enabled_plugins']}")
83
+ for plugin_info in status['plugins']:
84
+ print(f" - {plugin_info['name']}: priority={plugin_info['priority']}, enabled={plugin_info['enabled']}")
85
+
86
+ # 5. 执行一些工具调用
87
+ print("\n5. Executing tool calls...")
88
+
89
+ # 安全命令
90
+ safe_tool = ExecuteCommandTool(command="echo 'Hello World'", requires_approval=False)
91
+ print(f"\n Executing safe command: {safe_tool.command}")
92
+ result = tool_caller.call_tool(safe_tool)
93
+ print(f" Result: {result.success} - {result.message}")
94
+
95
+ # 包含敏感信息的命令(会被过滤)
96
+ sensitive_tool = ExecuteCommandTool(command="mysql -u root -p secret123", requires_approval=False)
97
+ print(f"\n Executing sensitive command: {sensitive_tool.command}")
98
+ result = tool_caller.call_tool(sensitive_tool)
99
+ print(f" Result: {result.success} - {result.message}")
100
+
101
+ # 危险命令(会被阻止)
102
+ dangerous_tool = ExecuteCommandTool(command="rm -rf /", requires_approval=False)
103
+ print(f"\n Executing dangerous command: {dangerous_tool.command}")
104
+ result = tool_caller.call_tool(dangerous_tool)
105
+ print(f" Result: {result.success} - {result.message}")
106
+
107
+ # 文件读取
108
+ read_tool = ReadFileTool(path="example.txt")
109
+ print(f"\n Reading file: {read_tool.path}")
110
+ result = tool_caller.call_tool(read_tool)
111
+ print(f" Result: {result.success} - {result.message}")
112
+
113
+ # 6. 查看统计信息
114
+ print("\n6. Tool execution statistics:")
115
+ stats = tool_caller.get_stats()
116
+ print(f" - Total calls: {stats['total_calls']}")
117
+ print(f" - Successful calls: {stats['successful_calls']}")
118
+ print(f" - Failed calls: {stats['failed_calls']}")
119
+ print(f" - Success rate: {stats['success_rate']:.2%}")
120
+ print(f" - Plugin intercepted calls: {stats['plugin_intercepted_calls']}")
121
+ print(f" - Average execution time: {stats['average_execution_time']:.3f}s")
122
+
123
+ # 7. 查看插件统计
124
+ print("\n7. Plugin statistics:")
125
+
126
+ # 日志插件统计
127
+ log_stats = logging_plugin.get_statistics()
128
+ print(f" Logging plugin:")
129
+ print(f" - Total logged calls: {log_stats['total_logged_calls']}")
130
+ print(f" - Success rate: {log_stats['success_rate']:.2%}")
131
+ print(f" - Call history entries: {len(logging_plugin.get_call_history())}")
132
+
133
+ # 安全过滤插件统计
134
+ filter_stats = security_plugin.get_filter_statistics()
135
+ print(f" Security filter plugin:")
136
+ print(f" - Filtered count: {filter_stats['filtered_count']}")
137
+ print(f" - Blocked count: {filter_stats['blocked_count']}")
138
+ print(f" - Sensitive patterns: {filter_stats['sensitive_patterns_count']}")
139
+ print(f" - Dangerous patterns: {filter_stats['dangerous_patterns_count']}")
140
+
141
+ # 8. 插件管理演示
142
+ print("\n8. Plugin management demo:")
143
+
144
+ # 禁用日志插件
145
+ print(" Disabling logging plugin...")
146
+ tool_caller.disable_plugin("logging")
147
+
148
+ # 执行一个命令(不会被日志插件记录)
149
+ test_tool = ExecuteCommandTool(command="echo 'test without logging'", requires_approval=False)
150
+ old_history_length = len(logging_plugin.get_call_history())
151
+ result = tool_caller.call_tool(test_tool)
152
+ new_history_length = len(logging_plugin.get_call_history())
153
+
154
+ print(f" Command executed, logging plugin did not record it")
155
+ print(f" History length before: {old_history_length}, after: {new_history_length}")
156
+
157
+ # 重新启用日志插件
158
+ print(" Re-enabling logging plugin...")
159
+ tool_caller.enable_plugin("logging")
160
+
161
+ # 9. 全局插件控制
162
+ print("\n9. Global plugin control demo:")
163
+ print(" Disabling all plugins globally...")
164
+ tool_caller.set_plugins_enabled(False)
165
+
166
+ # 执行命令(所有插件都被禁用)
167
+ test_tool2 = ExecuteCommandTool(command="rm -rf /tmp", requires_approval=False) # 通常会被安全插件阻止
168
+ result = tool_caller.call_tool(test_tool2)
169
+ print(f" Dangerous command executed without plugin protection: {result.success}")
170
+
171
+ # 重新启用插件系统
172
+ print(" Re-enabling plugin system...")
173
+ tool_caller.set_plugins_enabled(True)
174
+
175
+ # 10. 最终统计
176
+ print("\n10. Final statistics:")
177
+ final_stats = tool_caller.get_stats()
178
+ print(f" - Total calls in demo: {final_stats['total_calls']}")
179
+ print(f" - Overall success rate: {final_stats['success_rate']:.2%}")
180
+
181
+ print("\n" + "=" * 60)
182
+ print("Demo completed successfully!")
183
+ print("=" * 60)
184
+
185
+
186
+ if __name__ == "__main__":
187
+ try:
188
+ main()
189
+ except Exception as e:
190
+ print(f"Demo failed with error: {e}")
191
+ import traceback
192
+ traceback.print_exc()
193
+ sys.exit(1)
@@ -15,7 +15,7 @@ from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
15
15
  from autocoder.common.stream_out_type import LintStreamOutType, CompileStreamOutType, UnmergedBlocksStreamOutType, ContextMissingCheckStreamOutType
16
16
  from autocoder.common.auto_coder_lang import get_message_with_format
17
17
  from autocoder.common.printer import Printer
18
- from autocoder.rag.token_counter import count_tokens
18
+ from autocoder.common.tokens import count_string_tokens as count_tokens
19
19
  from autocoder.utils import llms as llm_utils
20
20
  from autocoder.memory.active_context_manager import ActiveContextManager
21
21
  from autocoder.common.v2.code_auto_generate_editblock import CodeAutoGenerateEditBlock
@@ -433,7 +433,7 @@ class CodeEditBlockManager:
433
433
  return (unmerged_formatted_text, merged_formatted_text)
434
434
 
435
435
  for attempt in range(self.args.auto_fix_merge_max_attempts):
436
- global_cancel.check_and_raise(token=self.args.event_file)
436
+ global_cancel.check_and_raise(token=self.args.cancel_token)
437
437
  unmerged_formatted_text, merged_formatted_text = _format_blocks(
438
438
  merge)
439
439
  fix_prompt = self.fix_unmerged_blocks.prompt(
@@ -657,7 +657,7 @@ class CodeEditBlockManager:
657
657
  token_cost_calculator = TokenCostCalculator(args=self.args)
658
658
 
659
659
  for attempt in range(self.auto_fix_compile_max_attempts):
660
- global_cancel.check_and_raise(token=self.args.event_file)
660
+ global_cancel.check_and_raise(token=self.args.cancel_token)
661
661
  # 先更新增量影子系统的文件
662
662
  self.shadow_manager.clean_shadows()
663
663
  shadow_files = self._create_shadow_files_from_edits(
@@ -804,7 +804,7 @@ class CodeEditBlockManager:
804
804
  # 生成代码并自动修复lint错误
805
805
 
806
806
  generation_result = self.generate_and_fix(query, source_code_list)
807
- global_cancel.check_and_raise(token=self.args.event_file)
807
+ global_cancel.check_and_raise(token=self.args.cancel_token)
808
808
 
809
809
  # 合并代码
810
810
  self.code_merger.merge_code(generation_result)
@@ -6,18 +6,26 @@ from autocoder.common import sys_prompt
6
6
  from autocoder.privacy.model_filter import ModelPathFilter
7
7
  import json
8
8
  from concurrent.futures import ThreadPoolExecutor
9
- from autocoder.common.utils_code_auto_generate import chat_with_continue,stream_chat_with_continue,ChatWithContinueResult
9
+ from autocoder.common.utils_code_auto_generate import (
10
+ chat_with_continue,
11
+ stream_chat_with_continue,
12
+ ChatWithContinueResult,
13
+ )
10
14
  from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
11
15
  from autocoder.common.stream_out_type import CodeGenerateStreamOutType
12
16
  from autocoder.common.auto_coder_lang import get_message_with_format
13
17
  from autocoder.common.printer import Printer
14
- from autocoder.rag.token_counter import count_tokens
18
+ from autocoder.common.tokens import count_string_tokens as count_tokens
15
19
  from autocoder.utils import llms as llm_utils
16
20
  from autocoder.common import SourceCodeList
17
21
  from autocoder.memory.active_context_manager import ActiveContextManager
18
22
  from loguru import logger
19
- from autocoder.common.rulefiles.autocoderrules_utils import get_rules
20
- from autocoder.run_context import get_run_context,RunMode
23
+ from autocoder.common.rulefiles import get_rules
24
+ from autocoder.run_context import get_run_context, RunMode
25
+ import os
26
+ from datetime import datetime
27
+ import platform
28
+
21
29
 
22
30
  class CodeAutoGenerate:
23
31
  def __init__(
@@ -40,9 +48,19 @@ class CodeAutoGenerate:
40
48
 
41
49
  @byzerllm.prompt(llm=lambda self: self.llm)
42
50
  def single_round_instruction(
43
- self, instruction: str, content: str, context: str = "", package_context: str = ""
51
+ self,
52
+ instruction: str,
53
+ content: str,
54
+ context: str = "",
55
+ package_context: str = "",
44
56
  ) -> str:
45
57
  """
58
+ <env>
59
+ 当前工作目录: {{ current_dir }}
60
+ 操作系统: {{ os_info }}
61
+ 当前时间: {{ current_time }}
62
+ </env>
63
+
46
64
  {%- if structure %}
47
65
  ====
48
66
  {{ structure }}
@@ -64,7 +82,7 @@ class CodeAutoGenerate:
64
82
  {%- endif %}
65
83
 
66
84
  {%- if context %}
67
- ====
85
+ ====
68
86
  {{ context }}
69
87
  {%- endif %}
70
88
 
@@ -80,7 +98,7 @@ class CodeAutoGenerate:
80
98
  ##File: {{ key }}
81
99
  {{ value }}
82
100
  </user_rule>
83
- {% endfor %}
101
+ {% endfor %}
84
102
  {% endif %}
85
103
 
86
104
  下面是用户的需求:
@@ -103,14 +121,21 @@ class CodeAutoGenerate:
103
121
 
104
122
  请确保每份代码的完整性,而不要只生成修改部分。
105
123
  """
106
-
124
+ # 收集环境信息
125
+ current_dir = os.getcwd()
126
+ os_info = f"{platform.system()} {platform.release()}"
127
+ current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
128
+
107
129
  if not self.args.include_project_structure:
108
130
  return {
109
- "structure": "",
131
+ "structure": "",
132
+ "current_dir": current_dir,
133
+ "os_info": os_info,
134
+ "current_time": current_time,
110
135
  }
111
-
112
- extra_docs = get_rules()
113
-
136
+
137
+ extra_docs = get_rules()
138
+
114
139
  return {
115
140
  "structure": (
116
141
  self.action.pp.get_tree_like_directory_structure()
@@ -118,38 +143,46 @@ class CodeAutoGenerate:
118
143
  else ""
119
144
  ),
120
145
  "extra_docs": extra_docs,
121
- }
146
+ "current_dir": current_dir,
147
+ "os_info": os_info,
148
+ "current_time": current_time,
149
+ }
122
150
 
123
151
  def single_round_run(
124
- self, query: str, source_code_list: SourceCodeList
152
+ self, query: str, source_code_list: SourceCodeList
125
153
  ) -> CodeGenerateResult:
126
-
154
+
127
155
  # Apply model filter for code_llm
128
156
  printer = Printer()
129
157
  for llm in self.llms:
130
158
  model_filter = ModelPathFilter.from_model_object(llm, self.args)
131
159
  filtered_sources = []
132
160
  for source in source_code_list.sources:
133
- if model_filter.is_accessible(source.module_name):
161
+ if model_filter.is_accessible(source.module_name):
134
162
  filtered_sources.append(source)
135
163
  else:
136
- printer.print_in_terminal("index_file_filtered",
137
- style="yellow",
138
- file_path=source.module_name,
139
- model_name=",".join(llm_utils.get_llm_names(llm)))
164
+ printer.print_in_terminal(
165
+ "index_file_filtered",
166
+ style="yellow",
167
+ file_path=source.module_name,
168
+ model_name=",".join(llm_utils.get_llm_names(llm)),
169
+ )
140
170
 
141
171
  source_code_list = SourceCodeList(filtered_sources)
142
-
172
+
143
173
  llm_config = {"human_as_model": self.args.human_as_model}
144
174
 
145
175
  source_content = source_code_list.to_str()
146
176
 
147
177
  active_context_manager = ActiveContextManager(self.llm, self.args.source_dir)
148
-
178
+
149
179
  # 获取包上下文信息
150
180
  package_context = ""
151
-
152
- if self.args.enable_active_context and self.args.enable_active_context_in_generate:
181
+
182
+ if (
183
+ self.args.enable_active_context
184
+ and self.args.enable_active_context_in_generate
185
+ ):
153
186
  # 获取活动上下文信息
154
187
  result = active_context_manager.load_active_contexts_for_files(
155
188
  [source.module_name for source in source_code_list.sources]
@@ -158,28 +191,32 @@ class CodeAutoGenerate:
158
191
  if result.contexts:
159
192
  package_context_parts = []
160
193
  for dir_path, context in result.contexts.items():
161
- package_context_parts.append(f"<package_info>{context.content}</package_info>")
162
-
194
+ package_context_parts.append(
195
+ f"<package_info>{context.content}</package_info>"
196
+ )
197
+
163
198
  package_context = "\n".join(package_context_parts)
164
199
 
165
200
  init_prompt = self.single_round_instruction.prompt(
166
- instruction=query, content=source_content, context=self.args.context,
167
- package_context=package_context
168
- )
201
+ instruction=query,
202
+ content=source_content,
203
+ context=self.args.context,
204
+ package_context=package_context,
205
+ )
169
206
 
170
- with open(self.args.target_file, "w",encoding="utf-8") as file:
207
+ with open(self.args.target_file, "w", encoding="utf-8") as file:
171
208
  file.write(init_prompt)
172
209
 
173
210
  conversations = []
174
211
 
175
212
  if self.args.system_prompt and self.args.system_prompt.strip() == "claude":
176
213
  conversations.append(
177
- {"role": "system", "content": sys_prompt.claude_sys_prompt.prompt()})
214
+ {"role": "system", "content": sys_prompt.claude_sys_prompt.prompt()}
215
+ )
178
216
  elif self.args.system_prompt:
179
- conversations.append(
180
- {"role": "system", "content": self.args.system_prompt})
217
+ conversations.append({"role": "system", "content": self.args.system_prompt})
181
218
 
182
- conversations.append({"role": "user", "content": init_prompt})
219
+ conversations.append({"role": "user", "content": init_prompt})
183
220
 
184
221
  conversations_list = []
185
222
  results = []
@@ -193,93 +230,114 @@ class CodeAutoGenerate:
193
230
 
194
231
  printer = Printer()
195
232
  estimated_input_tokens = count_tokens(
196
- json.dumps(conversations, ensure_ascii=False))
197
- printer.print_in_terminal("estimated_input_tokens_in_generate",
198
- style="yellow",
199
- estimated_input_tokens_in_generate=estimated_input_tokens,
200
- generate_mode="diff"
201
- )
233
+ json.dumps(conversations, ensure_ascii=False)
234
+ )
235
+ printer.print_in_terminal(
236
+ "estimated_input_tokens_in_generate",
237
+ style="yellow",
238
+ estimated_input_tokens_in_generate=estimated_input_tokens,
239
+ generate_mode="diff",
240
+ )
202
241
 
203
242
  if not self.args.human_as_model or get_run_context().mode == RunMode.WEB:
204
- with ThreadPoolExecutor(max_workers=len(self.llms) * self.generate_times_same_model) as executor:
243
+ with ThreadPoolExecutor(
244
+ max_workers=len(self.llms) * self.generate_times_same_model
245
+ ) as executor:
205
246
  futures = []
206
247
  count = 0
207
248
  for llm in self.llms:
208
-
209
- model_names_list = llm_utils.get_llm_names(llm)
249
+
250
+ model_names_list = llm_utils.get_llm_names(llm)
210
251
  model_name = None
211
252
  if model_names_list:
212
- model_name = model_names_list[0]
253
+ model_name = model_names_list[0]
213
254
 
214
255
  for _ in range(self.generate_times_same_model):
215
- model_names.append(model_name)
256
+ model_names.append(model_name)
216
257
  if count == 0:
258
+
217
259
  def job():
218
260
  stream_generator = stream_chat_with_continue(
219
- llm=llm,
220
- conversations=conversations,
261
+ llm=llm,
262
+ conversations=conversations,
221
263
  llm_config=llm_config,
222
- args=self.args
264
+ args=self.args,
223
265
  )
224
266
  full_response, last_meta = stream_out(
225
- stream_generator,
226
- model_name=model_name,
227
- title=get_message_with_format(
228
- "code_generate_title", model_name=model_name),
229
- args=self.args,
230
- extra_meta={
231
- "stream_out_type": CodeGenerateStreamOutType.CODE_GENERATE.value
232
- })
267
+ stream_generator,
268
+ model_name=model_name,
269
+ title=get_message_with_format(
270
+ "code_generate_title", model_name=model_name
271
+ ),
272
+ args=self.args,
273
+ extra_meta={
274
+ "stream_out_type": CodeGenerateStreamOutType.CODE_GENERATE.value
275
+ },
276
+ )
233
277
  return ChatWithContinueResult(
234
278
  content=full_response,
235
279
  input_tokens_count=last_meta.input_tokens_count,
236
- generated_tokens_count=last_meta.generated_tokens_count
280
+ generated_tokens_count=last_meta.generated_tokens_count,
237
281
  )
282
+
238
283
  futures.append(executor.submit(job))
239
- else:
240
- futures.append(executor.submit(
241
- chat_with_continue,
242
- llm=llm,
243
- conversations=conversations,
244
- llm_config=llm_config,
245
- args=self.args
246
- ))
284
+ else:
285
+ futures.append(
286
+ executor.submit(
287
+ chat_with_continue,
288
+ llm=llm,
289
+ conversations=conversations,
290
+ llm_config=llm_config,
291
+ args=self.args,
292
+ )
293
+ )
247
294
  count += 1
248
-
295
+
249
296
  temp_results = [future.result() for future in futures]
250
-
251
- for result,model_name in zip(temp_results,model_names):
297
+
298
+ for result, model_name in zip(temp_results, model_names):
252
299
  results.append(result.content)
253
300
  input_tokens_count += result.input_tokens_count
254
301
  generated_tokens_count += result.generated_tokens_count
255
- model_info = llm_utils.get_model_info(model_name,self.args.product_mode)
302
+ model_info = llm_utils.get_model_info(
303
+ model_name, self.args.product_mode
304
+ )
256
305
  input_cost = model_info.get("input_price", 0) if model_info else 0
257
306
  output_cost = model_info.get("output_price", 0) if model_info else 0
258
- input_tokens_cost += input_cost * result.input_tokens_count / 1000000
259
- generated_tokens_cost += output_cost * result.generated_tokens_count / 1000000
307
+ input_tokens_cost += (
308
+ input_cost * result.input_tokens_count / 1000000
309
+ )
310
+ generated_tokens_cost += (
311
+ output_cost * result.generated_tokens_count / 1000000
312
+ )
260
313
 
261
314
  for result in results:
262
315
  conversations_list.append(
263
- conversations + [{"role": "assistant", "content": result}])
316
+ conversations + [{"role": "assistant", "content": result}]
317
+ )
264
318
  else:
265
319
  for _ in range(self.args.human_model_num):
266
320
  single_result = chat_with_continue(
267
- llm=self.llms[0],
268
- conversations=conversations,
321
+ llm=self.llms[0],
322
+ conversations=conversations,
269
323
  llm_config=llm_config,
270
- args=self.args
324
+ args=self.args,
271
325
  )
272
326
  results.append(single_result.content)
273
327
  input_tokens_count += single_result.input_tokens_count
274
328
  generated_tokens_count += single_result.generated_tokens_count
275
329
  conversations_list.append(
276
- conversations + [{"role": "assistant", "content": single_result.content}])
330
+ conversations
331
+ + [{"role": "assistant", "content": single_result.content}]
332
+ )
277
333
 
278
334
  statistics = {
279
335
  "input_tokens_count": input_tokens_count,
280
336
  "generated_tokens_count": generated_tokens_count,
281
337
  "input_tokens_cost": input_tokens_cost,
282
- "generated_tokens_cost": generated_tokens_cost
338
+ "generated_tokens_cost": generated_tokens_cost,
283
339
  }
284
340
 
285
- return CodeGenerateResult(contents=results, conversations=conversations_list, metadata=statistics)
341
+ return CodeGenerateResult(
342
+ contents=results, conversations=conversations_list, metadata=statistics
343
+ )