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
@@ -9,9 +9,10 @@ from dataclasses import dataclass
9
9
  from collections import defaultdict
10
10
 
11
11
  from autocoder.plugins import Plugin, PluginManager
12
- from autocoder.rag.token_counter import count_tokens
12
+ from autocoder.common.tokens import count_string_tokens as count_tokens
13
13
  from autocoder.suffixproject import SuffixProject
14
14
  from autocoder.common import AutoCoderArgs, SourceCode
15
+ from autocoder.common.international import get_message, get_message_with_format
15
16
  from loguru import logger
16
17
  import json
17
18
 
@@ -56,7 +57,7 @@ class TokenHelperPlugin(Plugin):
56
57
  True if initialization was successful
57
58
  """
58
59
  self.load_auto_coder_config()
59
- print(f"[{self.name}] Token Helper plugin initialized")
60
+ print(f"[{self.name}] {get_message('plugin_token_initialized')}")
60
61
  return True
61
62
 
62
63
  def get_commands(self) -> Dict[str, Tuple[Callable, str]]:
@@ -66,10 +67,10 @@ class TokenHelperPlugin(Plugin):
66
67
  A dictionary of command name to handler and description
67
68
  """
68
69
  return {
69
- "token/count": (self.count_tokens_in_project, "Count tokens in all project files"),
70
- "token/top": (self.show_top_token_files, "Show top N files by token count"),
71
- "token/file": (self.count_tokens_in_file, "Count tokens in a specific file"),
72
- "token/summary": (self.show_token_summary, "Show token count summary for the project"),
70
+ "token/count": (self.count_tokens_in_project, get_message("plugin_token_cmd_count_desc")),
71
+ "token/top": (self.show_top_token_files, get_message("plugin_token_cmd_top_desc")),
72
+ "token/file": (self.count_tokens_in_file, get_message("plugin_token_cmd_file_desc")),
73
+ "token/summary": (self.show_token_summary, get_message("plugin_token_cmd_summary_desc")),
73
74
  }
74
75
 
75
76
  def get_completions(self) -> Dict[str, List[str]]:
@@ -98,8 +99,8 @@ class TokenHelperPlugin(Plugin):
98
99
  exclude = args_dict.get("exclude_files", [])
99
100
 
100
101
  self.project_dir = project_dir
101
- print(f"Counting tokens in project: {project_dir}")
102
- print(f"File types: {project_type}")
102
+ print(get_message_with_format("plugin_token_counting_project", project_dir=project_dir))
103
+ print(get_message_with_format("plugin_token_file_types", project_type=project_type))
103
104
 
104
105
  try:
105
106
  # Create AutoCoderArgs with necessary parameters
@@ -116,12 +117,12 @@ class TokenHelperPlugin(Plugin):
116
117
  file_count = 0
117
118
  self.token_counts = {}
118
119
 
119
- print("Scanning files and counting tokens...")
120
+ print(get_message("plugin_token_scanning_files"))
120
121
 
121
122
  for source_code in project.get_source_codes():
122
123
  file_count += 1
123
124
  if file_count % 10 == 0:
124
- print(f"Processed {file_count} files...")
125
+ print(get_message_with_format("plugin_token_processed_files", file_count=file_count))
125
126
 
126
127
  tokens = count_tokens(source_code.source_code)
127
128
  file_path = source_code.module_name
@@ -137,15 +138,15 @@ class TokenHelperPlugin(Plugin):
137
138
 
138
139
  total_tokens += tokens
139
140
 
140
- print(f"\nToken count complete!")
141
- print(f"Total files: {file_count}")
142
- print(f"Total tokens: {total_tokens:,}")
143
- print(f"Use /token/top N to see the top N files by token count")
144
- print(f"Use /token/summary to see a summary by file type")
141
+ print(f"\n{get_message('plugin_token_count_complete')}")
142
+ print(get_message_with_format("plugin_token_total_files", file_count=file_count))
143
+ print(get_message_with_format("plugin_token_total_tokens", total_tokens=f"{total_tokens:,}"))
144
+ print(get_message("plugin_token_use_top_help"))
145
+ print(get_message("plugin_token_use_summary_help"))
145
146
 
146
147
  except Exception as e:
147
148
  logger.error(f"Error counting tokens in project: {str(e)}")
148
- print(f"Error: {str(e)}")
149
+ print(get_message_with_format("plugin_token_counting_error", error=str(e)))
149
150
 
150
151
  def _parse_args(self, args: str) -> Dict[str, str]:
151
152
  """Parse command arguments.
@@ -250,17 +251,22 @@ class TokenHelperPlugin(Plugin):
250
251
  args: Number of files to show
251
252
  """
252
253
  if not self.token_counts:
253
- print("No token count data available. Run /token/count first.")
254
+ print(get_message("plugin_token_no_data"))
254
255
  return
255
256
 
256
257
  try:
257
258
  n = int(args.strip()) if args.strip() else 10
258
259
  except ValueError:
259
- print(f"Invalid value: {args}. Using default of 10.")
260
+ print(get_message_with_format("plugin_token_invalid_value_default", args=args))
260
261
  n = 10
261
262
 
262
- print(f"\nTop {n} files by token count:")
263
- print(f"{'Tokens':<10} {'Size (bytes)':<15} {'File'}")
263
+ print(f"\n{get_message_with_format('plugin_token_top_files_header', n=n)}")
264
+
265
+ tokens_header = get_message("plugin_token_table_header_tokens")
266
+ size_header = get_message("plugin_token_table_header_size_bytes")
267
+ file_header = get_message("plugin_token_table_header_file")
268
+
269
+ print(f"{tokens_header:<10} {size_header:<15} {file_header}")
264
270
  print(f"{'-'*10} {'-'*15} {'-'*50}")
265
271
 
266
272
  sorted_files = sorted(
@@ -274,29 +280,135 @@ class TokenHelperPlugin(Plugin):
274
280
  print(f"{token_count.tokens:<10,} {token_count.file_size:<15,} {relative_path}")
275
281
 
276
282
  def count_tokens_in_file(self, args: str) -> None:
277
- """Count tokens in a specific file.
283
+ """Count tokens in a specific file or directory.
278
284
 
279
285
  Args:
280
- args: Path to the file
286
+ args: Path to the file or directory. If starts with @, remove @ and treat as path.
281
287
  """
282
288
  if not args:
283
- print("Please specify a file path.")
289
+ print(get_message("plugin_token_specify_path"))
284
290
  return
285
291
 
286
- file_path = args.strip()
292
+ # Handle @ prefix - remove it and treat as path
293
+ path = args.strip()
294
+ if path.startswith('@'):
295
+ path = path[1:]
287
296
 
297
+ if not os.path.exists(path):
298
+ print(get_message_with_format("plugin_token_path_not_exist", path=path))
299
+ return
300
+
301
+ try:
302
+ if os.path.isfile(path):
303
+ # Handle single file
304
+ self._count_tokens_single_file(path)
305
+ elif os.path.isdir(path):
306
+ # Handle directory recursively
307
+ self._count_tokens_directory(path)
308
+ else:
309
+ print(get_message_with_format("plugin_token_not_file_or_dir", path=path))
310
+
311
+ except Exception as e:
312
+ print(get_message_with_format("plugin_token_counting_error", error=str(e)))
313
+
314
+ def _count_tokens_single_file(self, file_path: str) -> int:
315
+ """Count tokens in a single file and display results.
316
+
317
+ Args:
318
+ file_path: Path to the file
319
+
320
+ Returns:
321
+ Number of tokens in the file
322
+ """
288
323
  try:
289
324
  with open(file_path, 'r', encoding='utf-8') as f:
290
325
  content = f.read()
291
326
 
292
327
  tokens = count_tokens(content)
293
- print(f"\nFile: {file_path}")
294
- print(f"Tokens: {tokens:,}")
295
- print(f"File size: {len(content):,} bytes")
296
- print(f"Avg bytes per token: {len(content)/tokens:.2f}")
328
+ print(f"\n{get_message_with_format('plugin_token_file_info', file_path=file_path)}")
329
+ print(get_message_with_format("plugin_token_file_tokens", tokens=f"{tokens:,}"))
330
+ print(get_message_with_format("plugin_token_file_size", size=f"{len(content):,}"))
331
+ if tokens > 0:
332
+ avg_bytes = len(content)/tokens
333
+ print(get_message_with_format("plugin_token_avg_bytes_per_token", avg=f"{avg_bytes:.2f}"))
334
+
335
+ return tokens
297
336
 
337
+ except UnicodeDecodeError:
338
+ print(get_message_with_format("plugin_token_skip_binary", file_path=file_path))
339
+ return 0
298
340
  except Exception as e:
299
- print(f"Error counting tokens in file: {str(e)}")
341
+ print(get_message_with_format("plugin_token_read_error", file_path=file_path, error=str(e)))
342
+ return 0
343
+
344
+ def _count_tokens_directory(self, dir_path: str) -> None:
345
+ """Count tokens in all files within a directory recursively.
346
+
347
+ Args:
348
+ dir_path: Path to the directory
349
+ """
350
+ total_tokens = 0
351
+ file_count = 0
352
+ processed_files = []
353
+
354
+ print(f"\n{get_message_with_format('plugin_token_scanning_directory', dir_path=dir_path)}")
355
+
356
+ for root, dirs, files in os.walk(dir_path):
357
+ # Skip common ignore directories
358
+ dirs[:] = [d for d in dirs if not d.startswith('.') and d not in ['__pycache__', 'node_modules', 'dist', 'build']]
359
+
360
+ for file in files:
361
+ # Skip hidden files and common binary/generated files
362
+ if file.startswith('.') or file.endswith(('.pyc', '.pyo', '.so', '.dll', '.exe', '.bin')):
363
+ continue
364
+
365
+ file_path = os.path.join(root, file)
366
+ relative_path = os.path.relpath(file_path, dir_path)
367
+
368
+ try:
369
+ with open(file_path, 'r', encoding='utf-8') as f:
370
+ content = f.read()
371
+
372
+ tokens = count_tokens(content)
373
+ total_tokens += tokens
374
+ file_count += 1
375
+
376
+ processed_files.append({
377
+ 'path': relative_path,
378
+ 'tokens': tokens,
379
+ 'size': len(content)
380
+ })
381
+
382
+ except (UnicodeDecodeError, PermissionError):
383
+ # Skip binary files and files without permission
384
+ continue
385
+ except Exception as e:
386
+ print(get_message_with_format("plugin_token_processing_error", relative_path=relative_path, error=str(e)))
387
+ continue
388
+
389
+ # Display results
390
+ print(f"\n{get_message('plugin_token_scan_complete')}")
391
+ print(get_message_with_format("plugin_token_files_processed", file_count=file_count))
392
+ print(get_message_with_format("plugin_token_total_tokens", total_tokens=f"{total_tokens:,}"))
393
+
394
+ if file_count > 0:
395
+ avg_tokens = total_tokens / file_count
396
+ print(get_message_with_format("plugin_token_avg_tokens_per_file", avg_tokens=f"{avg_tokens:.2f}"))
397
+
398
+ # Show top 10 files by token count
399
+ if len(processed_files) > 1:
400
+ print(f"\n{get_message('plugin_token_top_files_by_count')}")
401
+ sorted_files = sorted(processed_files, key=lambda x: x['tokens'], reverse=True)
402
+
403
+ tokens_header = get_message("plugin_token_table_header_tokens")
404
+ size_header = get_message("plugin_token_table_header_size")
405
+ file_header = get_message("plugin_token_table_header_file")
406
+
407
+ print(f"{tokens_header:>8} {size_header:>8} {file_header}")
408
+ print(f"{'-'*8} {'-'*8} {'-'*50}")
409
+
410
+ for file_info in sorted_files[:10]:
411
+ print(f"{file_info['tokens']:>8,} {file_info['size']:>8} {file_info['path']}")
300
412
 
301
413
  def show_token_summary(self, args: str) -> None:
302
414
  """Show token count summary by file type.
@@ -305,7 +417,7 @@ class TokenHelperPlugin(Plugin):
305
417
  args: Optional arguments
306
418
  """
307
419
  if not self.token_counts:
308
- print("No token count data available. Run /token/count first.")
420
+ print(get_message("plugin_token_no_data"))
309
421
  return
310
422
 
311
423
  by_extension = defaultdict(lambda: {"files": 0, "tokens": 0, "size": 0})
@@ -322,8 +434,15 @@ class TokenHelperPlugin(Plugin):
322
434
  total_files = sum(data["files"] for data in by_extension.values())
323
435
  total_size = sum(data["size"] for data in by_extension.values())
324
436
 
325
- print(f"\nToken count summary by file type:")
326
- print(f"{'Extension':<12} {'Files':<8} {'Tokens':<12} {'% of Total':<12} {'Size (KB)':<12}")
437
+ print(f"\n{get_message('plugin_token_summary_header')}")
438
+
439
+ extension_header = get_message("plugin_token_table_header_extension")
440
+ files_header = get_message("plugin_token_table_header_files")
441
+ tokens_header = get_message("plugin_token_table_header_tokens")
442
+ percent_header = get_message("plugin_token_table_header_percent")
443
+ size_kb_header = get_message("plugin_token_table_header_size_kb")
444
+
445
+ print(f"{extension_header:<12} {files_header:<8} {tokens_header:<12} {percent_header:<12} {size_kb_header:<12}")
327
446
  print(f"{'-'*12} {'-'*8} {'-'*12} {'-'*12} {'-'*12}")
328
447
 
329
448
  for ext, data in sorted(by_extension.items(), key=lambda x: x[1]["tokens"], reverse=True):
@@ -331,13 +450,13 @@ class TokenHelperPlugin(Plugin):
331
450
  size_kb = data["size"] / 1024
332
451
  print(f"{ext:<12} {data['files']:<8} {data['tokens']:<12,} {percent:<12.2f} {size_kb:<12.2f}")
333
452
 
334
- print(f"\nTotal Files: {total_files:,}")
335
- print(f"Total Tokens: {total_tokens:,}")
336
- print(f"Total Size: {total_size/1024/1024:.2f} MB")
453
+ print(f"\n{get_message_with_format('plugin_token_total_files_summary', total_files=f'{total_files:,}')}")
454
+ print(get_message_with_format("plugin_token_total_tokens_summary", total_tokens=f"{total_tokens:,}"))
455
+ print(get_message_with_format("plugin_token_total_size", total_size=f"{total_size/1024/1024:.2f}"))
337
456
 
338
457
  if self.project_dir:
339
- print(f"Project Directory: {self.project_dir}")
458
+ print(get_message_with_format("plugin_token_project_directory", project_dir=self.project_dir))
340
459
 
341
460
  def shutdown(self) -> None:
342
461
  """Shutdown the plugin."""
343
- print(f"[{self.name}] Token Helper plugin shutdown")
462
+ print(f"[{self.name}] {get_message('plugin_token_shutdown')}")
@@ -15,10 +15,9 @@ from loguru import logger
15
15
  import re
16
16
  from pydantic import BaseModel, Field
17
17
  from rich.console import Console
18
- import json
19
- from autocoder.utils.queue_communicate import queue_communicate, CommunicateEvent, CommunicateEventType
20
18
  from autocoder.common import files as FileUtils
21
19
 
20
+
22
21
  class RegPattern(BaseModel):
23
22
  pattern: str = Field(
24
23
  ...,
@@ -169,12 +168,12 @@ class PyProject:
169
168
 
170
169
  def should_exclude(self, file_path):
171
170
  for pattern in self.exclude_patterns:
172
- if pattern.search(file_path):
171
+ if pattern.search(file_path):
173
172
  return True
174
173
  return False
175
174
 
176
175
  def output(self):
177
- with open(self.target_file, "r",encoding="utf-8") as file:
176
+ with open(self.target_file, "r", encoding="utf-8") as file:
178
177
  return file.read()
179
178
 
180
179
  def is_python_file(self, file_path):
@@ -183,7 +182,9 @@ class PyProject:
183
182
  def read_file_content(self, file_path):
184
183
  if self.args.auto_merge == "strict_diff":
185
184
  result = []
186
- for line_number, line in FileUtils.read_file_with_line_numbers(file_path,line_number_start=1):
185
+ for line_number, line in FileUtils.read_file_with_line_numbers(
186
+ file_path, line_number_start=1
187
+ ):
187
188
  result.append(f"{line_number}:{line}")
188
189
  return "\n".join(result)
189
190
 
@@ -233,20 +234,25 @@ class PyProject:
233
234
  def get_rag_source_codes(self):
234
235
  if not self.args.enable_rag_search and not self.args.enable_rag_context:
235
236
  return []
236
-
237
+
237
238
  else:
238
239
  console = Console()
239
- console.print(f"\n[bold blue]Starting RAG search for:[/bold blue] {self.args.query}")
240
-
240
+ console.print(
241
+ f"\n[bold blue]Starting RAG search for:[/bold blue] {self.args.query}"
242
+ )
243
+
241
244
  from autocoder.rag.rag_entry import RAGFactory
245
+
242
246
  rag = RAGFactory.get_rag(self.llm, self.args, "")
243
247
  docs = rag.search(self.args.query)
244
248
  for doc in docs:
245
- doc.tag = "RAG"
249
+ doc.tag = "RAG"
246
250
  else:
247
251
  console = Console()
248
- console.print(f"[bold green]Found {len(docs)} relevant documents[/bold green]")
249
-
252
+ console.print(
253
+ f"[bold green]Found {len(docs)} relevant documents[/bold green]"
254
+ )
255
+
250
256
  return docs
251
257
 
252
258
  def get_search_source_codes(self):
@@ -275,7 +281,7 @@ class PyProject:
275
281
  return temp + []
276
282
 
277
283
  def get_source_codes(self) -> Generator[SourceCode, None, None]:
278
- for root, dirs, files in os.walk(self.directory,followlinks=True):
284
+ for root, dirs, files in os.walk(self.directory, followlinks=True):
279
285
  dirs[:] = [d for d in dirs if d not in self.default_exclude_dirs]
280
286
  for file in files:
281
287
  file_path = os.path.join(root, file)
@@ -339,27 +345,24 @@ class PyProject:
339
345
  if self.git_url is not None:
340
346
  self.clone_repository()
341
347
 
342
- if self.target_file:
343
- with open(self.target_file, "w",encoding="utf-8") as file:
348
+ # 先收集所有sources
349
+ for code in self.get_rest_source_codes():
350
+ self.sources.append(code)
344
351
 
345
- for code in self.get_rest_source_codes():
346
- self.sources.append(code)
347
- file.write(f"##File: {code.module_name}\n")
348
- file.write(f"{code.source_code}\n\n")
352
+ for code in self.get_search_source_codes():
353
+ self.sources.append(code)
349
354
 
350
- for code in self.get_search_source_codes():
351
- self.sources.append(code)
352
- file.write(f"##File: {code.module_name}\n")
353
- file.write(f"{code.source_code}\n\n")
355
+ for package in packages:
356
+ for code in self.get_package_source_codes(package):
357
+ self.sources.append(code)
354
358
 
355
- for package in packages:
356
- for code in self.get_package_source_codes(package):
357
- self.sources.append(code)
358
- file.write(f"##File: {code.module_name}\n")
359
- file.write(f"{code.source_code}\n\n")
359
+ for code in self.get_source_codes():
360
+ self.sources.append(code)
360
361
 
361
- for code in self.get_source_codes():
362
- self.sources.append(code)
362
+ # 如果target_file存在,才写入文件
363
+ if self.target_file:
364
+ with open(self.target_file, "w", encoding="utf-8") as file:
365
+ for code in self.sources:
363
366
  file.write(f"##File: {code.module_name}\n")
364
367
  file.write(f"{code.source_code}\n\n")
365
368