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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +409 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -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:
@@ -435,7 +472,6 @@ def generate_commit_message(changes_report: str, query: Optional[str] = None) ->
435
472
  + "nbformat": 4,
436
473
  + "nbformat_minor": 4
437
474
  +}
438
-
439
475
  ```
440
476
 
441
477
  输出的commit 信息为:
@@ -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()
@@ -0,0 +1,157 @@
1
+ import locale
2
+ from typing import Dict, Any
3
+ from byzerllm.utils import format_str_jinja2
4
+
5
+
6
+ class MessageManager:
7
+ """
8
+ Central message manager for handling internationalization across the auto-coder project
9
+ """
10
+
11
+ def __init__(self):
12
+ self._messages: Dict[str, Dict[str, str]] = {}
13
+
14
+ def register_messages(self, messages: Dict[str, Dict[str, str]]):
15
+ """
16
+ Register a set of messages with the manager
17
+
18
+ Args:
19
+ messages: Dictionary of message keys to language-specific messages
20
+ """
21
+ self._messages.update(messages)
22
+
23
+ def get_system_language(self) -> str:
24
+ """
25
+ Get the system's default language code
26
+
27
+ Returns:
28
+ Two-letter language code (e.g., 'en', 'zh'), falls back to 'en' for unsupported languages
29
+ """
30
+ try:
31
+ lang_code, _ = locale.getdefaultlocale()
32
+ if lang_code:
33
+ detected_lang = lang_code[:2]
34
+ # 检查是否是支持的语言,如果不是则回退到英文
35
+ supported_languages = ['en', 'zh', 'ja', 'ar', 'ru']
36
+ if detected_lang in supported_languages:
37
+ return detected_lang
38
+ else:
39
+ return "en"
40
+ return "en"
41
+ except:
42
+ return "en"
43
+
44
+ def get_message(self, key: str) -> str:
45
+ """
46
+ Get a localized message by key
47
+
48
+ Args:
49
+ key: Message key to look up
50
+
51
+ Returns:
52
+ Localized message string, or empty string if not found
53
+ """
54
+ lang = self.get_system_language()
55
+ if key in self._messages:
56
+ return self._messages[key].get(lang, self._messages[key].get("en", ""))
57
+ return ""
58
+
59
+ def get_message_with_format(self, msg_key: str, **kwargs) -> str:
60
+ """
61
+ Get a localized message with template formatting
62
+
63
+ Args:
64
+ msg_key: Message key to look up
65
+ **kwargs: Variables to substitute in the message template
66
+
67
+ Returns:
68
+ Formatted localized message string
69
+ """
70
+ message = self.get_message(msg_key)
71
+ if message:
72
+ return format_str_jinja2(message, **kwargs)
73
+ return ""
74
+
75
+
76
+ # Global message manager instance
77
+ _global_message_manager = MessageManager()
78
+
79
+
80
+ def get_message_manager() -> MessageManager:
81
+ """
82
+ Get the global message manager instance
83
+
84
+ Returns:
85
+ Global MessageManager instance
86
+ """
87
+ return _global_message_manager
88
+
89
+
90
+ def register_messages(messages: Dict[str, Dict[str, str]]):
91
+ """
92
+ Register messages with the global message manager
93
+
94
+ Args:
95
+ messages: Dictionary of message keys to language-specific messages
96
+ """
97
+ _global_message_manager.register_messages(messages)
98
+
99
+
100
+ def get_system_language() -> str:
101
+ """
102
+ Get the system's default language code
103
+
104
+ Returns:
105
+ Two-letter language code (e.g., 'en', 'zh')
106
+ """
107
+ return _global_message_manager.get_system_language()
108
+
109
+
110
+ def get_message(key: str) -> str:
111
+ """
112
+ Get a localized message by key
113
+
114
+ Args:
115
+ key: Message key to look up
116
+
117
+ Returns:
118
+ Localized message string, or empty string if not found
119
+ """
120
+ return _global_message_manager.get_message(key)
121
+
122
+
123
+ def get_message_with_format(msg_key: str, **kwargs) -> str:
124
+ """
125
+ Get a localized message with template formatting
126
+
127
+ Args:
128
+ msg_key: Message key to look up
129
+ **kwargs: Variables to substitute in the message template
130
+
131
+ Returns:
132
+ Formatted localized message string
133
+ """
134
+ return _global_message_manager.get_message_with_format(msg_key, **kwargs)
135
+
136
+
137
+ def get_supported_languages() -> list:
138
+ """
139
+ Get list of supported languages
140
+
141
+ Returns:
142
+ List of supported language codes
143
+ """
144
+ return ['en', 'zh', 'ja', 'ar', 'ru']
145
+
146
+
147
+ def is_language_supported(language: str) -> bool:
148
+ """
149
+ Check if a language is supported
150
+
151
+ Args:
152
+ language: Language code to check
153
+
154
+ Returns:
155
+ True if language is supported, False otherwise
156
+ """
157
+ return language in get_supported_languages()
@@ -0,0 +1,56 @@
1
+ """
2
+ Messages module for auto-coder international support
3
+
4
+ This module automatically registers all message files and provides a unified interface.
5
+ """
6
+
7
+ from .auto_coder_messages import AUTO_CODER_MESSAGES
8
+ from .chat_auto_coder_messages import CHAT_AUTO_CODER_MESSAGES
9
+ from .sdk_messages import SDK_MESSAGES
10
+ from .tool_display_messages import TOOL_DISPLAY_MESSAGES
11
+ from .git_helper_plugin_messages import GIT_HELPER_PLUGIN_MESSAGES
12
+ from .token_helper_plugin_messages import TOKEN_HELPER_PLUGIN_MESSAGES
13
+ from .rules_command_messages import RULES_COMMAND_MESSAGES
14
+ from .queue_command_messages import QUEUE_COMMAND_MESSAGES
15
+ from .async_command_messages import ASYNC_COMMAND_MESSAGES
16
+ from .conversation_command_messages import CONVERSATION_COMMAND_MESSAGES
17
+ from .command_help_messages import COMMAND_HELP_MESSAGES
18
+ from .workflow_exception_messages import WORKFLOW_EXCEPTION_MESSAGES
19
+ from ..message_manager import register_messages
20
+
21
+
22
+ # Automatically register all messages when the module is imported
23
+ def register_all_messages():
24
+ """Register all messages with the global message manager"""
25
+ register_messages(AUTO_CODER_MESSAGES)
26
+ register_messages(CHAT_AUTO_CODER_MESSAGES)
27
+ register_messages(SDK_MESSAGES)
28
+ register_messages(TOOL_DISPLAY_MESSAGES)
29
+ register_messages(GIT_HELPER_PLUGIN_MESSAGES)
30
+ register_messages(TOKEN_HELPER_PLUGIN_MESSAGES)
31
+ register_messages(RULES_COMMAND_MESSAGES)
32
+ register_messages(QUEUE_COMMAND_MESSAGES)
33
+ register_messages(ASYNC_COMMAND_MESSAGES)
34
+ register_messages(CONVERSATION_COMMAND_MESSAGES)
35
+ register_messages(COMMAND_HELP_MESSAGES)
36
+ register_messages(WORKFLOW_EXCEPTION_MESSAGES)
37
+
38
+
39
+ # Auto-register on import
40
+ register_all_messages()
41
+
42
+ __all__ = [
43
+ "AUTO_CODER_MESSAGES",
44
+ "CHAT_AUTO_CODER_MESSAGES",
45
+ "SDK_MESSAGES",
46
+ "TOOL_DISPLAY_MESSAGES",
47
+ "GIT_HELPER_PLUGIN_MESSAGES",
48
+ "TOKEN_HELPER_PLUGIN_MESSAGES",
49
+ "RULES_COMMAND_MESSAGES",
50
+ "QUEUE_COMMAND_MESSAGES",
51
+ "ASYNC_COMMAND_MESSAGES",
52
+ "CONVERSATION_COMMAND_MESSAGES",
53
+ "COMMAND_HELP_MESSAGES",
54
+ "WORKFLOW_EXCEPTION_MESSAGES",
55
+ "register_all_messages",
56
+ ]