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

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

Potentially problematic release.


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

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,307 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ FileMonitor 模块测试
5
+
6
+ 测试 FileMonitor 的基本功能:文件的增删改查监控
7
+ """
8
+
9
+ import os
10
+ import tempfile
11
+ import shutil
12
+ import time
13
+ import threading
14
+ from pathlib import Path
15
+ from typing import List, Tuple
16
+ from unittest.mock import Mock
17
+
18
+ try:
19
+ from watchfiles import Change
20
+ except ImportError:
21
+ print("警告:watchfiles 未安装,请运行: pip install watchfiles")
22
+ Change = None
23
+
24
+ from autocoder.common.file_monitor.monitor import get_file_monitor, FileMonitor
25
+
26
+
27
+ class FileMonitorTester:
28
+ """FileMonitor 测试类"""
29
+
30
+ def __init__(self):
31
+ self.temp_dir = None
32
+ self.monitor = None
33
+ self.events = []
34
+ self.event_lock = threading.Lock()
35
+
36
+ def setup(self):
37
+ """设置测试环境"""
38
+ # 创建临时目录
39
+ self.temp_dir = tempfile.mkdtemp(prefix="file_monitor_test_")
40
+ print(f"创建临时测试目录: {self.temp_dir}")
41
+
42
+ # 重置单例实例以确保测试隔离
43
+ FileMonitor.reset_instance()
44
+
45
+ # 获取监控实例
46
+ self.monitor = get_file_monitor(self.temp_dir)
47
+
48
+ # 清空事件记录
49
+ self.events.clear()
50
+
51
+ def teardown(self):
52
+ """清理测试环境"""
53
+ if self.monitor and self.monitor.is_running():
54
+ self.monitor.stop()
55
+
56
+ if self.temp_dir and os.path.exists(self.temp_dir):
57
+ shutil.rmtree(self.temp_dir)
58
+ print(f"清理临时测试目录: {self.temp_dir}")
59
+
60
+ # 重置单例实例
61
+ FileMonitor.reset_instance()
62
+
63
+ def record_event(self, change_type: 'Change', changed_path: str):
64
+ """记录文件变化事件"""
65
+ with self.event_lock:
66
+ self.events.append((change_type, changed_path))
67
+ print(f"📝 记录事件: {change_type.name} - {os.path.basename(changed_path)}")
68
+
69
+ def wait_for_events(self, expected_count: int, timeout: float = 3.0):
70
+ """等待指定数量的事件"""
71
+ start_time = time.time()
72
+ while time.time() - start_time < timeout:
73
+ with self.event_lock:
74
+ if len(self.events) >= expected_count:
75
+ return True
76
+ time.sleep(0.1)
77
+ return False
78
+
79
+ def wait_for_specific_event(self, expected_type: 'Change', expected_path: str, timeout: float = 3.0):
80
+ """等待特定类型的事件"""
81
+ start_time = time.time()
82
+ while time.time() - start_time < timeout:
83
+ with self.event_lock:
84
+ for event_type, event_path in self.events:
85
+ if event_type == expected_type and expected_path in event_path:
86
+ return True
87
+ time.sleep(0.1)
88
+ return False
89
+
90
+ def test_file_create(self):
91
+ """测试文件创建监控"""
92
+ print("\n🔍 测试用例 1: 文件创建监控")
93
+
94
+ # 注册监控所有 .txt 文件
95
+ self.monitor.register("**/*.txt", self.record_event)
96
+
97
+ # 启动监控
98
+ self.monitor.start()
99
+ time.sleep(0.5) # 等待监控启动
100
+
101
+ # 创建测试文件
102
+ test_file = os.path.join(self.temp_dir, "test_create.txt")
103
+ with open(test_file, 'w') as f:
104
+ f.write("Hello, World!")
105
+ print(f"✅ 创建文件: {os.path.basename(test_file)}")
106
+
107
+ # 等待事件
108
+ if self.wait_for_events(1):
109
+ with self.event_lock:
110
+ event_type, event_path = self.events[-1]
111
+ if event_type == Change.added and test_file in event_path:
112
+ print("✅ 文件创建事件检测成功")
113
+ return True
114
+ else:
115
+ print(f"❌ 事件类型不匹配: 期望 {Change.added.name}, 实际 {event_type.name}")
116
+ else:
117
+ print("❌ 未检测到文件创建事件")
118
+
119
+ return False
120
+
121
+ def test_file_modify(self):
122
+ """测试文件修改监控"""
123
+ print("\n🔍 测试用例 2: 文件修改监控")
124
+
125
+ # 先创建一个文件
126
+ test_file = os.path.join(self.temp_dir, "test_modify.txt")
127
+ with open(test_file, 'w') as f:
128
+ f.write("Initial content")
129
+
130
+ # 等待文件创建完成
131
+ time.sleep(1.0)
132
+
133
+ # 清空事件记录
134
+ with self.event_lock:
135
+ self.events.clear()
136
+
137
+ # 注册监控
138
+ self.monitor.register(test_file, self.record_event)
139
+
140
+ # 等待一下确保监控注册完成
141
+ time.sleep(0.5)
142
+
143
+ # 尝试多种修改方式来触发修改事件
144
+ # 方式1: 追加内容
145
+ with open(test_file, 'a') as f:
146
+ f.write("\nModified content")
147
+ time.sleep(0.5)
148
+
149
+ # 方式2: 重写文件(如果追加没有触发修改事件)
150
+ if not self.wait_for_specific_event(Change.modified, test_file, timeout=1.0):
151
+ with open(test_file, 'w') as f:
152
+ f.write("Completely new content")
153
+
154
+ print(f"✅ 修改文件: {os.path.basename(test_file)}")
155
+
156
+ # 等待修改事件或添加事件(某些系统可能报告为添加)
157
+ if (self.wait_for_specific_event(Change.modified, test_file, timeout=2.0) or
158
+ self.wait_for_specific_event(Change.added, test_file, timeout=1.0)):
159
+ print("✅ 文件修改事件检测成功")
160
+ return True
161
+ else:
162
+ # 打印所有事件用于调试
163
+ with self.event_lock:
164
+ print(f"所有事件: {[(e[0].name, os.path.basename(e[1])) for e in self.events]}")
165
+ # 如果检测到任何事件,说明监控是工作的,只是事件类型不同
166
+ if self.events:
167
+ print("⚠️ 检测到文件变化事件,但类型与预期不符(这在某些文件系统中是正常的)")
168
+ return True
169
+ else:
170
+ print("❌ 未检测到任何文件修改事件")
171
+
172
+ return False
173
+
174
+ def test_file_delete(self):
175
+ """测试文件删除监控"""
176
+ print("\n🔍 测试用例 3: 文件删除监控")
177
+
178
+ # 先创建一个文件
179
+ test_file = os.path.join(self.temp_dir, "test_delete.txt")
180
+ with open(test_file, 'w') as f:
181
+ f.write("To be deleted")
182
+
183
+ # 等待文件创建完成
184
+ time.sleep(1.0)
185
+
186
+ # 清空事件记录
187
+ with self.event_lock:
188
+ self.events.clear()
189
+
190
+ # 注册监控
191
+ self.monitor.register(test_file, self.record_event)
192
+
193
+ # 等待一下确保监控注册完成
194
+ time.sleep(0.5)
195
+
196
+ # 删除文件
197
+ os.remove(test_file)
198
+ print(f"✅ 删除文件: {os.path.basename(test_file)}")
199
+
200
+ # 等待删除事件
201
+ if self.wait_for_specific_event(Change.deleted, test_file):
202
+ print("✅ 文件删除事件检测成功")
203
+ return True
204
+ else:
205
+ # 打印所有事件用于调试
206
+ with self.event_lock:
207
+ print(f"所有事件: {[(e[0].name, os.path.basename(e[1])) for e in self.events]}")
208
+ print("❌ 未检测到文件删除事件")
209
+
210
+ return False
211
+
212
+ def test_directory_monitoring(self):
213
+ """测试目录监控"""
214
+ print("\n🔍 测试用例 4: 目录监控")
215
+
216
+ # 创建子目录
217
+ sub_dir = os.path.join(self.temp_dir, "subdir")
218
+ os.makedirs(sub_dir)
219
+
220
+ # 等待目录创建完成
221
+ time.sleep(1.0)
222
+
223
+ # 清空事件记录
224
+ with self.event_lock:
225
+ self.events.clear()
226
+
227
+ # 注册监控整个子目录
228
+ self.monitor.register(sub_dir, self.record_event)
229
+
230
+ # 等待一下确保监控注册完成
231
+ time.sleep(0.5)
232
+
233
+ # 在子目录中创建文件
234
+ test_file = os.path.join(sub_dir, "subdir_file.txt")
235
+ with open(test_file, 'w') as f:
236
+ f.write("File in subdirectory")
237
+ print(f"✅ 在子目录中创建文件: {os.path.basename(test_file)}")
238
+
239
+ # 等待文件创建事件
240
+ if self.wait_for_specific_event(Change.added, test_file):
241
+ print("✅ 目录监控事件检测成功")
242
+ return True
243
+ else:
244
+ # 打印所有事件用于调试
245
+ with self.event_lock:
246
+ print(f"所有事件: {[(e[0].name, os.path.basename(e[1])) for e in self.events]}")
247
+ print("❌ 未检测到目录监控事件")
248
+
249
+ return False
250
+
251
+ def run_all_tests(self):
252
+ """运行所有测试"""
253
+ print("🚀 开始 FileMonitor 功能测试")
254
+ print("=" * 50)
255
+
256
+ if Change is None:
257
+ print("❌ 测试失败: watchfiles 库未安装")
258
+ return False
259
+
260
+ try:
261
+ self.setup()
262
+
263
+ # 运行测试用例
264
+ test_results = []
265
+ test_results.append(self.test_file_create())
266
+ test_results.append(self.test_file_modify())
267
+ test_results.append(self.test_file_delete())
268
+ test_results.append(self.test_directory_monitoring())
269
+
270
+ # 统计结果
271
+ passed = sum(test_results)
272
+ total = len(test_results)
273
+
274
+ print("\n" + "=" * 50)
275
+ print(f"📊 测试结果: {passed}/{total} 个测试用例通过")
276
+
277
+ if passed == total:
278
+ print("🎉 所有测试用例通过!FileMonitor 功能正常")
279
+ return True
280
+ else:
281
+ print(f"⚠️ {total - passed} 个测试用例失败")
282
+ return False
283
+
284
+ except Exception as e:
285
+ print(f"❌ 测试过程中发生异常: {e}")
286
+ import traceback
287
+ traceback.print_exc()
288
+ return False
289
+ finally:
290
+ self.teardown()
291
+
292
+
293
+ def main():
294
+ """主函数"""
295
+ tester = FileMonitorTester()
296
+ success = tester.run_all_tests()
297
+
298
+ if success:
299
+ print("\n✅ FileMonitor 测试完成,所有功能正常")
300
+ exit(0)
301
+ else:
302
+ print("\n❌ FileMonitor 测试失败")
303
+ exit(1)
304
+
305
+
306
+ if __name__ == "__main__":
307
+ main()
@@ -1,6 +1,4 @@
1
1
  import os
2
- from git import Repo, GitCommandError
3
- import git
4
2
  from loguru import logger
5
3
  from typing import List, Optional, Dict, Any
6
4
  from pydantic import BaseModel
@@ -12,6 +10,29 @@ from rich.table import Table
12
10
  from rich.text import Text
13
11
 
14
12
 
13
+ # 尝试导入git模块,如果失败则提供优雅降级
14
+ try:
15
+ from git import Repo, GitCommandError
16
+ import git
17
+ GIT_AVAILABLE = True
18
+ except ImportError as e:
19
+ logger.warning(f"Git module not available: {e}. Some git features will be disabled.")
20
+ # 提供虚拟类以避免NameError
21
+ class Repo:
22
+ def __init__(self, *args, **kwargs):
23
+ raise RuntimeError("Git is not available on this system")
24
+
25
+ class GitCommandError(Exception):
26
+ pass
27
+
28
+ class _GitMock:
29
+ def __getattr__(self, name):
30
+ raise RuntimeError("Git is not available on this system")
31
+
32
+ git = _GitMock()
33
+ GIT_AVAILABLE = False
34
+
35
+
15
36
  class FileChange(BaseModel):
16
37
  file_path: str
17
38
  before: Optional[str] = None
@@ -32,6 +53,10 @@ class CommitResult(BaseModel):
32
53
 
33
54
 
34
55
  def init(repo_path: str) -> bool:
56
+ if not GIT_AVAILABLE:
57
+ logger.warning("Git is not available. Skipping Git initialization.")
58
+ return False
59
+
35
60
  if not os.path.exists(repo_path):
36
61
  os.makedirs(repo_path)
37
62
 
@@ -44,21 +69,33 @@ def init(repo_path: str) -> bool:
44
69
  repo = Repo.init(repo_path)
45
70
  logger.info(f"Initialized new Git repository at {repo_path}")
46
71
  return True
47
- except GitCommandError as e:
72
+ except (GitCommandError, RuntimeError) as e:
48
73
  logger.error(f"Error during Git initialization: {e}")
49
74
  return False
50
75
 
51
76
 
52
- def get_repo(repo_path: str) -> Repo:
53
- repo = Repo(repo_path)
54
- return repo
77
+ def get_repo(repo_path: str) -> Optional[Repo]:
78
+ if not GIT_AVAILABLE:
79
+ logger.warning("Git is not available. Cannot create repository object.")
80
+ return None
81
+ try:
82
+ repo = Repo(repo_path)
83
+ return repo
84
+ except (GitCommandError, RuntimeError) as e:
85
+ logger.error(f"Error accessing Git repository at {repo_path}: {e}")
86
+ return None
55
87
 
56
88
 
57
89
  def commit_changes(repo_path: str, message: str) -> CommitResult:
90
+ if not GIT_AVAILABLE:
91
+ return CommitResult(
92
+ success=False, error_message="Git is not available on this system."
93
+ )
94
+
58
95
  repo = get_repo(repo_path)
59
96
  if repo is None:
60
97
  return CommitResult(
61
- success=False, error_message="Repository is not initialized."
98
+ success=False, error_message="Repository is not initialized or Git is not available."
62
99
  )
63
100
 
64
101
  try:
@@ -294,7 +331,7 @@ def get_uncommitted_changes(repo_path: str) -> str:
294
331
  return f"Error: {str(e)}"
295
332
 
296
333
  @byzerllm.prompt()
297
- def generate_commit_message(changes_report: str) -> str:
334
+ def generate_commit_message(changes_report: str, query: Optional[str] = None) -> str:
298
335
  '''
299
336
  我是一个Git提交信息生成助手。我们的目标是通过一些变更报告,倒推用户的需求,将需求作为commit message。
300
337
  commit message 需要简洁,包含两部分:
@@ -435,7 +472,6 @@ def generate_commit_message(changes_report: str) -> str:
435
472
  + "nbformat": 4,
436
473
  + "nbformat_minor": 4
437
474
  +}
438
-
439
475
  ```
440
476
 
441
477
  输出的commit 信息为:
@@ -635,7 +671,12 @@ def generate_commit_message(changes_report: str) -> str:
635
671
  </examples>
636
672
 
637
673
  下面是变更报告:
638
- {{ changes_report }}
674
+ {{ changes_report }}
675
+
676
+ {% if query %}
677
+ 这里你需要遵守的用户的额外要求:
678
+ {{ query }}
679
+ {% endif %}
639
680
 
640
681
  请输出commit message, 不要输出任何其他内容.
641
682
  '''
@@ -15,12 +15,19 @@ class GlobalCancel:
15
15
  self._lock = threading.Lock()
16
16
  self._context: Dict[str, Any] = {} # 存储与取消相关的上下文信息
17
17
  self._active_tokens: set[str] = set() # 存储当前正在运行的token
18
+ self._current_task_token: Optional[str] = None
18
19
 
19
20
  def register_token(self, token: str) -> None:
20
21
  """注册一个 token,表示一个操作开始,但尚未请求取消"""
21
22
  with self._lock:
22
23
  self._token_flags[token] = False
23
24
  self._active_tokens.add(token)
25
+ self._current_task_token = token
26
+
27
+ def get_current_task_token(self) -> Optional[str]:
28
+ """获取当前任务token"""
29
+ with self._lock:
30
+ return self._current_task_token
24
31
 
25
32
  def get_active_tokens(self) -> set[str]:
26
33
  """获取当前正在运行的token"""
@@ -29,11 +36,10 @@ class GlobalCancel:
29
36
 
30
37
  def is_requested(self, token: Optional[str] = None) -> bool:
31
38
  """检查是否请求了特定token或全局的取消"""
32
- if token is not None and token in self._token_flags:
33
- return self._token_flags[token]
34
-
35
39
  if self._global_flag:
36
40
  return True
41
+ if token is not None and token in self._token_flags:
42
+ return self._token_flags[token]
37
43
  return False
38
44
 
39
45
  def set_active_tokens(self) -> None:
@@ -72,6 +78,8 @@ class GlobalCancel:
72
78
  del self._context["tokens"][token]
73
79
  if token:
74
80
  self._active_tokens.discard(token) # 从活跃集合中移除
81
+ if token == self._current_task_token:
82
+ self._current_task_token = None
75
83
 
76
84
  def reset(self, token: Optional[str] = None) -> None:
77
85
  """重置特定token或全局的取消标志"""
@@ -90,6 +98,8 @@ class GlobalCancel:
90
98
  del self._context["tokens"][token]
91
99
  if token:
92
100
  self._active_tokens.discard(token) # 从活跃集合中移除
101
+ if token == self._current_task_token:
102
+ self._current_task_token = None
93
103
 
94
104
  def reset_active_tokens(self) -> None:
95
105
  """重置所有活跃的token"""
@@ -110,10 +120,9 @@ class GlobalCancel:
110
120
  """检查是否请求了取消,如果是则抛出异常"""
111
121
  if self.is_requested(token):
112
122
  context = self.get_context(token)
123
+ self.reset_global()
113
124
  if token:
114
- self.reset_token(token)
115
- else:
116
- self.reset_global()
125
+ self.reset_token(token)
117
126
  raise CancelRequestedException(token, context.get("message", "Operation was cancelled"))
118
127
 
119
128
  global_cancel = GlobalCancel()
@@ -5,7 +5,7 @@ from pathlib import Path
5
5
 
6
6
  import pytest
7
7
 
8
- from src.autocoder.common.ignorefiles import ignore_file_utils
8
+ from autocoder.common.ignorefiles import ignore_file_utils
9
9
 
10
10
  @pytest.fixture(autouse=True)
11
11
  def cleanup_ignore_manager(monkeypatch):
@@ -0,0 +1,31 @@
1
+ """
2
+ International module for auto-coder project
3
+
4
+ This module provides internationalization (i18n) support for the auto-coder project.
5
+ It includes message management, language detection, and formatted message retrieval.
6
+ """
7
+
8
+ from .message_manager import (
9
+ MessageManager,
10
+ get_message_manager,
11
+ register_messages,
12
+ get_system_language,
13
+ get_message,
14
+ get_message_with_format,
15
+ get_supported_languages,
16
+ is_language_supported
17
+ )
18
+
19
+ # Import messages module to trigger auto-registration
20
+ from . import messages
21
+
22
+ __all__ = [
23
+ 'MessageManager',
24
+ 'get_message_manager',
25
+ 'register_messages',
26
+ 'get_system_language',
27
+ 'get_message',
28
+ 'get_message_with_format',
29
+ 'get_supported_languages',
30
+ 'is_language_supported'
31
+ ]
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 国际化模块功能演示脚本
4
+ International module functionality demo
5
+ """
6
+
7
+ from autocoder.common.international import (
8
+ register_messages,
9
+ get_message,
10
+ get_message_with_format,
11
+ get_system_language,
12
+ get_message_manager
13
+ )
14
+
15
+
16
+ def main():
17
+ """演示国际化模块的主要功能"""
18
+ print("=== 国际化模块功能演示 ===")
19
+ print("=== International Module Demo ===\n")
20
+
21
+ # 1. 显示系统语言
22
+ print("1. 系统语言检测 / System Language Detection:")
23
+ lang = get_system_language()
24
+ print(f" 当前系统语言 / Current system language: {lang}\n")
25
+
26
+ # 2. 注册自定义消息
27
+ print("2. 注册自定义消息 / Register Custom Messages:")
28
+ custom_messages = {
29
+ "demo_greeting": {
30
+ "en": "Hello from International Module!",
31
+ "zh": "来自国际化模块的问候!"
32
+ },
33
+ "demo_user_info": {
34
+ "en": "User {{name}} has {{count}} messages",
35
+ "zh": "用户{{name}}有{{count}}条消息"
36
+ },
37
+ "demo_status": {
38
+ "en": "Status: {{status}}",
39
+ "zh": "状态:{{status}}"
40
+ }
41
+ }
42
+
43
+ register_messages(custom_messages)
44
+ print(" 自定义消息已注册 / Custom messages registered\n")
45
+
46
+ # 3. 获取简单消息
47
+ print("3. 获取简单消息 / Get Simple Messages:")
48
+ greeting = get_message("demo_greeting")
49
+ print(f" 问候消息 / Greeting: {greeting}\n")
50
+
51
+ # 4. 获取格式化消息
52
+ print("4. 获取格式化消息 / Get Formatted Messages:")
53
+ user_info = get_message_with_format("demo_user_info", name="张三", count=5)
54
+ print(f" 用户信息 / User info: {user_info}")
55
+
56
+ status_msg = get_message_with_format("demo_status", status="正常")
57
+ print(f" 状态消息 / Status: {status_msg}\n")
58
+
59
+ # 5. 显示自动注册的消息
60
+ print("5. 自动注册的消息 / Auto-registered Messages:")
61
+ manager = get_message_manager()
62
+ total_messages = len(manager._messages)
63
+ print(f" 总消息数量 / Total messages: {total_messages}")
64
+
65
+ # 尝试获取一些已知的自动注册消息
66
+ known_keys = ["file_scored_message", "config_delete_success", "config_invalid_format"]
67
+ for key in known_keys:
68
+ if key in manager._messages:
69
+ msg = get_message(key)
70
+ if msg:
71
+ print(f" {key}: {msg}")
72
+ break
73
+
74
+ print("\n6. 消息覆盖演示 / Message Override Demo:")
75
+ # 覆盖现有消息
76
+ override_messages = {
77
+ "demo_greeting": {
78
+ "en": "Updated Hello from International Module!",
79
+ "zh": "来自国际化模块的更新问候!"
80
+ }
81
+ }
82
+
83
+ register_messages(override_messages)
84
+ updated_greeting = get_message("demo_greeting")
85
+ print(f" 更新后的问候 / Updated greeting: {updated_greeting}\n")
86
+
87
+ print("=== 演示完成 ===")
88
+ print("=== Demo Complete ===")
89
+
90
+
91
+ if __name__ == "__main__":
92
+ main()