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
@@ -0,0 +1,265 @@
1
+
2
+ import pytest
3
+ from typing import List
4
+ from unittest.mock import Mock
5
+
6
+ from .agentic_callbacks import (
7
+ AgenticCallBacks,
8
+ AgenticCallbackPoint,
9
+ AgenticContext,
10
+ AgenticCallbackFunction,
11
+ get_global_callbacks,
12
+ register_global_callback,
13
+ execute_global_callbacks
14
+ )
15
+
16
+
17
+ class TestAgenticCallBacks:
18
+ """测试 AgenticCallBacks 类的功能"""
19
+
20
+ def setup_method(self):
21
+ """每个测试方法执行前的设置"""
22
+ self.callbacks = AgenticCallBacks()
23
+ self.context = AgenticContext()
24
+
25
+ # 创建测试用的回调函数
26
+ self.mock_callback1 = Mock()
27
+ self.mock_callback2 = Mock()
28
+ self.mock_callback3 = Mock()
29
+
30
+ def test_enum_values(self):
31
+ """测试枚举值是否正确定义"""
32
+ expected_values = {
33
+ "conversation_start",
34
+ "conversation_end",
35
+ "pre_tool_call",
36
+ "post_tool_call",
37
+ "api_request_start",
38
+ "api_request_end",
39
+ "tool_generated_started",
40
+ "tool_generated_end"
41
+ }
42
+
43
+ actual_values = {point.value for point in AgenticCallbackPoint}
44
+ assert actual_values == expected_values
45
+
46
+ def test_register_callback(self):
47
+ """测试注册回调函数"""
48
+ # 测试成功注册
49
+ result = self.callbacks.register(
50
+ AgenticCallbackPoint.CONVERSATION_START,
51
+ self.mock_callback1
52
+ )
53
+ assert result is True
54
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.CONVERSATION_START) == 1
55
+
56
+ # 测试重复注册同一个函数
57
+ result = self.callbacks.register(
58
+ AgenticCallbackPoint.CONVERSATION_START,
59
+ self.mock_callback1
60
+ )
61
+ assert result is False
62
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.CONVERSATION_START) == 1
63
+
64
+ # 测试注册不同函数到同一回调点
65
+ result = self.callbacks.register(
66
+ AgenticCallbackPoint.CONVERSATION_START,
67
+ self.mock_callback2
68
+ )
69
+ assert result is True
70
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.CONVERSATION_START) == 2
71
+
72
+ def test_unregister_callback(self):
73
+ """测试注销回调函数"""
74
+ # 先注册两个回调函数
75
+ self.callbacks.register(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback1)
76
+ self.callbacks.register(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback2)
77
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.PRE_TOOL_CALL) == 2
78
+
79
+ # 测试成功注销
80
+ result = self.callbacks.unregister(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback1)
81
+ assert result is True
82
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.PRE_TOOL_CALL) == 1
83
+
84
+ # 测试注销不存在的函数
85
+ result = self.callbacks.unregister(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback3)
86
+ assert result is False
87
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.PRE_TOOL_CALL) == 1
88
+
89
+ def test_execute_callbacks(self):
90
+ """测试执行回调函数"""
91
+ # 注册多个回调函数
92
+ self.callbacks.register(AgenticCallbackPoint.POST_TOOL_CALL, self.mock_callback1)
93
+ self.callbacks.register(AgenticCallbackPoint.POST_TOOL_CALL, self.mock_callback2)
94
+
95
+ # 执行回调函数
96
+ errors = self.callbacks.execute_callbacks(AgenticCallbackPoint.POST_TOOL_CALL, self.context)
97
+
98
+ # 验证所有回调函数都被调用
99
+ assert len(errors) == 0
100
+ self.mock_callback1.assert_called_once_with(self.context)
101
+ self.mock_callback2.assert_called_once_with(self.context)
102
+
103
+ def test_execute_callbacks_with_exception(self):
104
+ """测试执行回调函数时处理异常"""
105
+ # 创建会抛出异常的回调函数
106
+ def error_callback(context: AgenticContext):
107
+ raise ValueError("测试异常")
108
+
109
+ self.callbacks.register(AgenticCallbackPoint.API_REQUEST_START, error_callback)
110
+ self.callbacks.register(AgenticCallbackPoint.API_REQUEST_START, self.mock_callback1)
111
+
112
+ # 执行回调函数
113
+ errors = self.callbacks.execute_callbacks(AgenticCallbackPoint.API_REQUEST_START, self.context)
114
+
115
+ # 验证异常被捕获,但其他回调函数仍然执行
116
+ assert len(errors) == 1
117
+ assert isinstance(errors[0], ValueError)
118
+ assert str(errors[0]) == "测试异常"
119
+ self.mock_callback1.assert_called_once_with(self.context)
120
+
121
+ def test_execute_callbacks_with_none_context(self):
122
+ """测试使用 None 上下文执行回调函数"""
123
+ self.callbacks.register(AgenticCallbackPoint.CONVERSATION_END, self.mock_callback1)
124
+
125
+ # 传入 None 上下文
126
+ errors = self.callbacks.execute_callbacks(AgenticCallbackPoint.CONVERSATION_END, None)
127
+
128
+ # 验证自动创建了空上下文
129
+ assert len(errors) == 0
130
+ self.mock_callback1.assert_called_once()
131
+ call_args = self.mock_callback1.call_args[0]
132
+ assert isinstance(call_args[0], AgenticContext)
133
+
134
+ def test_get_callback_count(self):
135
+ """测试获取回调函数数量"""
136
+ # 初始状态应该为0
137
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.TOOL_GENERATED_STARTED) == 0
138
+
139
+ # 注册回调函数后数量应该增加
140
+ self.callbacks.register(AgenticCallbackPoint.TOOL_GENERATED_STARTED, self.mock_callback1)
141
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.TOOL_GENERATED_STARTED) == 1
142
+
143
+ self.callbacks.register(AgenticCallbackPoint.TOOL_GENERATED_STARTED, self.mock_callback2)
144
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.TOOL_GENERATED_STARTED) == 2
145
+
146
+ def test_get_all_callback_counts(self):
147
+ """测试获取所有回调点的回调函数数量"""
148
+ # 注册一些回调函数
149
+ self.callbacks.register(AgenticCallbackPoint.CONVERSATION_START, self.mock_callback1)
150
+ self.callbacks.register(AgenticCallbackPoint.CONVERSATION_START, self.mock_callback2)
151
+ self.callbacks.register(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback1)
152
+
153
+ counts = self.callbacks.get_all_callback_counts()
154
+
155
+ assert counts["conversation_start"] == 2
156
+ assert counts["pre_tool_call"] == 1
157
+ assert counts["conversation_end"] == 0
158
+
159
+ def test_clear_callbacks(self):
160
+ """测试清除指定回调点的回调函数"""
161
+ # 注册一些回调函数
162
+ self.callbacks.register(AgenticCallbackPoint.API_REQUEST_END, self.mock_callback1)
163
+ self.callbacks.register(AgenticCallbackPoint.API_REQUEST_END, self.mock_callback2)
164
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.API_REQUEST_END) == 2
165
+
166
+ # 清除回调函数
167
+ cleared_count = self.callbacks.clear_callbacks(AgenticCallbackPoint.API_REQUEST_END)
168
+ assert cleared_count == 2
169
+ assert self.callbacks.get_callback_count(AgenticCallbackPoint.API_REQUEST_END) == 0
170
+
171
+ def test_clear_all_callbacks(self):
172
+ """测试清除所有回调函数"""
173
+ # 注册一些回调函数到不同回调点
174
+ self.callbacks.register(AgenticCallbackPoint.CONVERSATION_START, self.mock_callback1)
175
+ self.callbacks.register(AgenticCallbackPoint.PRE_TOOL_CALL, self.mock_callback2)
176
+ self.callbacks.register(AgenticCallbackPoint.POST_TOOL_CALL, self.mock_callback3)
177
+
178
+ total_cleared = self.callbacks.clear_all_callbacks()
179
+ assert total_cleared == 3
180
+
181
+ # 验证所有回调点都被清空
182
+ counts = self.callbacks.get_all_callback_counts()
183
+ for count in counts.values():
184
+ assert count == 0
185
+
186
+ def test_has_callbacks(self):
187
+ """测试检查回调点是否有回调函数"""
188
+ # 初始状态应该没有回调函数
189
+ assert self.callbacks.has_callbacks(AgenticCallbackPoint.TOOL_GENERATED_END) is False
190
+
191
+ # 注册回调函数后应该返回 True
192
+ self.callbacks.register(AgenticCallbackPoint.TOOL_GENERATED_END, self.mock_callback1)
193
+ assert self.callbacks.has_callbacks(AgenticCallbackPoint.TOOL_GENERATED_END) is True
194
+
195
+ # 清除后应该返回 False
196
+ self.callbacks.clear_callbacks(AgenticCallbackPoint.TOOL_GENERATED_END)
197
+ assert self.callbacks.has_callbacks(AgenticCallbackPoint.TOOL_GENERATED_END) is False
198
+
199
+
200
+ class TestGlobalCallbacks:
201
+ """测试全局回调函数功能"""
202
+
203
+ def setup_method(self):
204
+ """每个测试方法执行前的设置"""
205
+ # 清除全局回调函数,避免测试间相互影响
206
+ get_global_callbacks().clear_all_callbacks()
207
+ self.mock_callback = Mock()
208
+
209
+ def test_register_global_callback(self):
210
+ """测试注册全局回调函数"""
211
+ result = register_global_callback(AgenticCallbackPoint.CONVERSATION_START, self.mock_callback)
212
+ assert result is True
213
+
214
+ global_callbacks = get_global_callbacks()
215
+ assert global_callbacks.has_callbacks(AgenticCallbackPoint.CONVERSATION_START) is True
216
+
217
+ def test_execute_global_callbacks(self):
218
+ """测试执行全局回调函数"""
219
+ register_global_callback(AgenticCallbackPoint.CONVERSATION_END, self.mock_callback)
220
+
221
+ context = AgenticContext()
222
+ errors = execute_global_callbacks(AgenticCallbackPoint.CONVERSATION_END, context)
223
+
224
+ assert len(errors) == 0
225
+ self.mock_callback.assert_called_once_with(context)
226
+
227
+
228
+ class TestAgenticContext:
229
+ """测试 AgenticContext 类"""
230
+
231
+ def test_create_empty_context(self):
232
+ """测试创建空的上下文"""
233
+ context = AgenticContext()
234
+ assert isinstance(context, AgenticContext)
235
+
236
+ # 验证可以序列化
237
+ data = context.model_dump()
238
+ assert isinstance(data, dict)
239
+
240
+
241
+ def test_callback_function_signature():
242
+ """测试回调函数签名的类型检查"""
243
+ def valid_callback(context: AgenticContext) -> None:
244
+ """有效的回调函数"""
245
+ pass
246
+
247
+ def invalid_callback(wrong_param: str) -> None:
248
+ """无效的回调函数(参数类型错误)"""
249
+ pass
250
+
251
+ callbacks = AgenticCallBacks()
252
+
253
+ # 注册有效的回调函数应该成功
254
+ result = callbacks.register(AgenticCallbackPoint.CONVERSATION_START, valid_callback)
255
+ assert result is True
256
+
257
+ # 注册无效的回调函数也会成功(Python的动态特性),但执行时可能出错
258
+ # 这里主要测试类型提示的正确性
259
+ result = callbacks.register(AgenticCallbackPoint.CONVERSATION_START, invalid_callback)
260
+ assert result is True
261
+
262
+
263
+ if __name__ == "__main__":
264
+ pytest.main([__file__, "-v"])
265
+
@@ -0,0 +1,194 @@
1
+ import pytest
2
+ import os
3
+ import tempfile
4
+ import shutil
5
+ from pathlib import Path
6
+ import byzerllm
7
+
8
+ from autocoder.common.v2.agent.agentic_edit import AgenticEdit
9
+ from autocoder.common.v2.agent.agentic_edit_types import (
10
+ AgenticEditRequest, AgenticEditConversationConfig,
11
+ ToolResultEvent, CompletionEvent, AttemptCompletionTool,
12
+ ConversationAction
13
+ )
14
+ from autocoder.common import AutoCoderArgs
15
+ import importlib.resources as resources
16
+
17
+ @pytest.fixture
18
+ def temp_project_dir():
19
+ """创建临时项目目录"""
20
+ temp_dir = tempfile.mkdtemp()
21
+ yield temp_dir
22
+ shutil.rmtree(temp_dir)
23
+
24
+
25
+ @pytest.fixture
26
+ def sample_project(temp_project_dir):
27
+ """创建一个示例项目"""
28
+ # 创建项目结构
29
+ src_dir = os.path.join(temp_project_dir, "src")
30
+ os.makedirs(src_dir, exist_ok=True)
31
+
32
+ # 创建一个简单的Python文件
33
+ main_py = os.path.join(src_dir, "main.py")
34
+ with open(main_py, 'w', encoding='utf-8') as f:
35
+ f.write("""def hello():
36
+ print("Hello, World!")
37
+
38
+ if __name__ == "__main__":
39
+ hello()
40
+ """)
41
+
42
+ # 创建README.md
43
+ readme_path = os.path.join(temp_project_dir, "README.md")
44
+ with open(readme_path, 'w', encoding='utf-8') as f:
45
+ f.write("""# Test Project
46
+
47
+ This is a test project for AgenticEdit.
48
+ """)
49
+
50
+ return temp_project_dir
51
+
52
+
53
+ @pytest.fixture
54
+ def real_llm():
55
+ """创建真实的LLM对象"""
56
+ from autocoder.utils.llms import get_single_llm
57
+ # 使用get_single_llm获取LLM实例
58
+ llm = get_single_llm("v3_chat", "lite")
59
+ return llm
60
+
61
+
62
+ @pytest.fixture
63
+ def mock_args(temp_project_dir):
64
+ """创建AutoCoderArgs对象"""
65
+ args = AutoCoderArgs(
66
+ source_dir=temp_project_dir,
67
+ model="v3_chat",
68
+ event_file=None,
69
+ skip_commit=True, # 跳过git commit
70
+ query="修改main.py文件",
71
+ file="test.yml",
72
+ product_mode="lite",
73
+ context_prune_model="v3_chat",
74
+ conversation_prune_safe_zone_tokens=50*1024,
75
+ enable_agentic_auto_approve=True,
76
+ skip_build_index=True,
77
+ skip_filter_index=True,
78
+ enable_active_context=False,
79
+ enable_active_context_in_generate=False,
80
+ )
81
+ return args
82
+
83
+
84
+ @pytest.fixture
85
+ def conversation_config():
86
+ """创建对话配置"""
87
+ return AgenticEditConversationConfig(
88
+ action=ConversationAction.NEW,
89
+ query="修改main.py文件",
90
+ conversation_name="test_conversation",
91
+ conversation_id=None, # 对于 NEW action,应该使用 None 让系统自动创建
92
+ pull_request=False
93
+ )
94
+
95
+
96
+ class TestAgenticEdit:
97
+ """AgenticEdit类的单元测试"""
98
+
99
+ def test_modify_file_with_real_llm(self, sample_project, real_llm,
100
+ mock_args, conversation_config):
101
+ """测试使用真实LLM的文件修改功能"""
102
+
103
+ # 保存当前工作目录
104
+ original_cwd = os.getcwd()
105
+
106
+ try:
107
+ # 切换到临时项目目录
108
+ os.chdir(sample_project)
109
+
110
+ # 先创建一个临时的对话管理器来生成 conversation_id
111
+ from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
112
+ temp_conversation_manager = get_conversation_manager()
113
+ conversation_id = temp_conversation_manager.create_conversation(
114
+ name=conversation_config.conversation_name,
115
+ metadata={"test": True}
116
+ )
117
+
118
+ # 更新 conversation_config 的 conversation_id
119
+ conversation_config.conversation_id = conversation_id
120
+
121
+ # 创建AgenticEdit实例
122
+ agentic_edit = AgenticEdit(
123
+ llm=real_llm,
124
+ args=mock_args,
125
+ conversation_config=conversation_config
126
+ )
127
+
128
+ # 读取原始文件内容
129
+ original_main_py = os.path.join(sample_project, "src", "main.py")
130
+ with open(original_main_py, 'r', encoding='utf-8') as f:
131
+ original_content = f.read()
132
+
133
+ print(f"原始文件内容:\n{original_content}")
134
+
135
+ # 创建请求 - 使用简单明确的指令
136
+ request = AgenticEditRequest(
137
+ user_input="请将src/main.py文件中的'Hello, World!'改为'Hello, AgenticEdit!'"
138
+ )
139
+
140
+ # 执行analyze方法,限制最大事件数量避免无限循环
141
+ events = []
142
+ max_events = 10000 # 限制最大事件数量
143
+
144
+ for i, event in enumerate(agentic_edit.analyze(request)):
145
+ events.append(event)
146
+ print(f"事件 {i}: {type(event).__name__}")
147
+
148
+ # 如果收到完成事件,停止处理
149
+ if isinstance(event, CompletionEvent):
150
+ print("收到完成事件,测试结束")
151
+ break
152
+
153
+ # 如果事件太多,停止处理
154
+ if i >= max_events:
155
+ print(f"达到最大事件数量限制({max_events}),停止处理")
156
+ break
157
+
158
+ # 验证事件类型
159
+ assert len(events) > 0, "应该产生至少一个事件"
160
+
161
+ # 查找工具结果事件
162
+ tool_result_events = [e for e in events if isinstance(e, ToolResultEvent)]
163
+ print(f"找到 {len(tool_result_events)} 个工具结果事件")
164
+
165
+ # 检查是否有文件被修改
166
+ try:
167
+ with open(original_main_py, 'r', encoding='utf-8') as f:
168
+ modified_content = f.read()
169
+
170
+ print(f"修改后文件内容:\n{modified_content}")
171
+
172
+ # 如果文件内容发生变化,说明测试成功
173
+ if modified_content != original_content:
174
+ print("✅ 文件内容已被修改")
175
+ assert "Hello, AgenticEdit!" in modified_content or modified_content != original_content
176
+ else:
177
+ print("⚠️ 文件内容未发生变化,但测试仍然通过(可能LLM选择了其他操作)")
178
+ except Exception as e:
179
+ print(f"读取文件时出错: {e}")
180
+
181
+ # 验证文件变更记录
182
+ file_changes = agentic_edit.get_all_file_changes()
183
+ print(f"记录的文件变更数量: {len(file_changes)}")
184
+
185
+ # 测试认为成功的条件:有事件产生且没有崩溃
186
+ assert len(events) > 0, "应该产生事件"
187
+ print("✅ 测试通过:AgenticEdit成功处理了请求")
188
+ finally:
189
+ # 恢复原有工作目录
190
+ os.chdir(original_cwd)
191
+
192
+
193
+ if __name__ == "__main__":
194
+ pytest.main(["-xvs", __file__])
@@ -0,0 +1,24 @@
1
+ """
2
+ Tool Caller Module
3
+
4
+ 提供工具调用和插件管理功能的AC模块。
5
+ 支持工具执行的插件机制,允许插件拦截和修改工具的输入参数和输出结果。
6
+ """
7
+
8
+ from .tool_caller import ToolCaller
9
+ from .tool_call_plugin_manager import ToolCallPluginManager
10
+ from .plugins.plugin_interface import ToolCallPlugin, PluginPriority
11
+ from .plugins.base_plugin import BaseToolCallPlugin
12
+ from .default_tool_resolver_map import get_default_tool_resolver_map, DEFAULT_TOOL_RESOLVER_MAP
13
+
14
+ __all__ = [
15
+ "ToolCaller",
16
+ "ToolCallPluginManager",
17
+ "ToolCallPlugin",
18
+ "BaseToolCallPlugin",
19
+ "PluginPriority",
20
+ "get_default_tool_resolver_map",
21
+ "DEFAULT_TOOL_RESOLVER_MAP"
22
+ ]
23
+
24
+ __version__ = "1.0.0"
@@ -0,0 +1,135 @@
1
+ """
2
+ Default Tool Resolver Map
3
+
4
+ 定义默认的工具解析器映射,集中管理所有工具类型和解析器类的对应关系。
5
+ """
6
+
7
+ from typing import Dict, Type
8
+ from autocoder.common.v2.agent.agentic_edit_types import (
9
+ BaseTool,
10
+ ExecuteCommandTool,
11
+ ReadFileTool,
12
+ WriteToFileTool,
13
+ ReplaceInFileTool,
14
+ SearchFilesTool,
15
+ ListFilesTool,
16
+ ListCodeDefinitionNamesTool,
17
+ AskFollowupQuestionTool,
18
+ AttemptCompletionTool,
19
+ PlanModeRespondTool,
20
+ UseMcpTool,
21
+ UseRAGTool,
22
+ RunNamedSubagentsTool,
23
+ ACModReadTool,
24
+ ACModWriteTool,
25
+ ACModListTool,
26
+ TodoReadTool,
27
+ TodoWriteTool,
28
+ CountTokensTool,
29
+ ExtractToTextTool,
30
+ SessionStartTool,
31
+ SessionInteractiveTool,
32
+ SessionStopTool,
33
+ ConversationMessageIdsWriteTool,
34
+ ConversationMessageIdsReadTool,
35
+ BackgroundTaskTool,
36
+ WebCrawlTool,
37
+ WebSearchTool,
38
+ LoadExtraDocumentTool,
39
+ ExecuteWorkflowTool,
40
+ )
41
+ from autocoder.common.v2.agent.agentic_edit_tools import (
42
+ BaseToolResolver,
43
+ ExecuteCommandToolResolver,
44
+ ReadFileToolResolver,
45
+ WriteToFileToolResolver,
46
+ ReplaceInFileToolResolver,
47
+ SearchFilesToolResolver,
48
+ ListFilesToolResolver,
49
+ ListCodeDefinitionNamesToolResolver,
50
+ AskFollowupQuestionToolResolver,
51
+ AttemptCompletionToolResolver,
52
+ PlanModeRespondToolResolver,
53
+ UseMcpToolResolver,
54
+ UseRAGToolResolver,
55
+ ACModReadToolResolver,
56
+ ACModWriteToolResolver,
57
+ ACModListToolResolver,
58
+ TodoReadToolResolver,
59
+ TodoWriteToolResolver,
60
+ CountTokensToolResolver,
61
+ ExtractToTextToolResolver,
62
+ SessionStartToolResolver,
63
+ SessionInteractiveToolResolver,
64
+ SessionStopToolResolver,
65
+ BackgroundTaskToolResolver,
66
+ )
67
+ from autocoder.common.v2.agent.agentic_edit_tools.run_named_subagents_tool_resolver import (
68
+ RunNamedSubagentsToolResolver,
69
+ )
70
+ from autocoder.common.v2.agent.agentic_edit_tools.conversation_message_ids_write_tool_resolver import (
71
+ ConversationMessageIdsWriteToolResolver,
72
+ )
73
+ from autocoder.common.v2.agent.agentic_edit_tools.conversation_message_ids_read_tool_resolver import (
74
+ ConversationMessageIdsReadToolResolver,
75
+ )
76
+ from autocoder.common.v2.agent.agentic_edit_tools.web_crawl_tool_resolver import (
77
+ WebCrawlToolResolver,
78
+ )
79
+ from autocoder.common.v2.agent.agentic_edit_tools.web_search_tool_resolver import (
80
+ WebSearchToolResolver,
81
+ )
82
+ from autocoder.common.v2.agent.agentic_edit_tools.extract_to_text_tool_resolver import (
83
+ ExtractToTextToolResolver,
84
+ )
85
+ from autocoder.common.v2.agent.agentic_edit_tools.load_extra_document_tool_resolver import (
86
+ LoadExtraDocumentToolResolver,
87
+ )
88
+ from autocoder.common.v2.agent.agentic_edit_tools.execute_workflow_tool_resolver import (
89
+ ExecuteWorkflowToolResolver,
90
+ )
91
+
92
+
93
+ def get_default_tool_resolver_map() -> Dict[Type[BaseTool], Type[BaseToolResolver]]:
94
+ """
95
+ 获取默认的工具解析器映射
96
+
97
+ Returns:
98
+ Dict[Type[BaseTool], Type[BaseToolResolver]]: 工具类型到解析器类的映射
99
+ """
100
+ return {
101
+ ExecuteCommandTool: ExecuteCommandToolResolver,
102
+ ReadFileTool: ReadFileToolResolver,
103
+ WriteToFileTool: WriteToFileToolResolver,
104
+ ReplaceInFileTool: ReplaceInFileToolResolver,
105
+ SearchFilesTool: SearchFilesToolResolver,
106
+ ListFilesTool: ListFilesToolResolver,
107
+ ListCodeDefinitionNamesTool: ListCodeDefinitionNamesToolResolver,
108
+ ACModReadTool: ACModReadToolResolver,
109
+ ACModWriteTool: ACModWriteToolResolver,
110
+ ACModListTool: ACModListToolResolver,
111
+ AskFollowupQuestionTool: AskFollowupQuestionToolResolver,
112
+ AttemptCompletionTool: AttemptCompletionToolResolver, # Will stop the loop anyway
113
+ PlanModeRespondTool: PlanModeRespondToolResolver,
114
+ UseMcpTool: UseMcpToolResolver,
115
+ UseRAGTool: UseRAGToolResolver,
116
+ RunNamedSubagentsTool: RunNamedSubagentsToolResolver,
117
+ TodoReadTool: TodoReadToolResolver,
118
+ TodoWriteTool: TodoWriteToolResolver,
119
+ CountTokensTool: CountTokensToolResolver,
120
+ ExtractToTextTool: ExtractToTextToolResolver,
121
+ SessionStartTool: SessionStartToolResolver,
122
+ SessionInteractiveTool: SessionInteractiveToolResolver,
123
+ SessionStopTool: SessionStopToolResolver,
124
+ ConversationMessageIdsWriteTool: ConversationMessageIdsWriteToolResolver,
125
+ ConversationMessageIdsReadTool: ConversationMessageIdsReadToolResolver,
126
+ BackgroundTaskTool: BackgroundTaskToolResolver,
127
+ WebCrawlTool: WebCrawlToolResolver,
128
+ WebSearchTool: WebSearchToolResolver,
129
+ LoadExtraDocumentTool: LoadExtraDocumentToolResolver,
130
+ ExecuteWorkflowTool: ExecuteWorkflowToolResolver,
131
+ }
132
+
133
+
134
+ # 导出默认映射,供模块级别直接使用
135
+ DEFAULT_TOOL_RESOLVER_MAP = get_default_tool_resolver_map()