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

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

Potentially problematic release.


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

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,290 @@
1
+ import re
2
+ import ast
3
+ import operator
4
+ from typing import Union, Optional, Dict, Any
5
+ from ..llms import LLMManager, LLMModel
6
+
7
+
8
+ class TokenParser:
9
+ """Token 数量解析器,支持多种格式的 token 数量表示"""
10
+
11
+ # 单位转换映射
12
+ UNIT_MULTIPLIERS = {
13
+ 'k': 1024,
14
+ 'm': 1024 * 1024,
15
+ 'g': 1024 * 1024 * 1024,
16
+ 'kb': 1024,
17
+ 'mb': 1024 * 1024,
18
+ 'gb': 1024 * 1024 * 1024,
19
+ }
20
+
21
+ # 支持的数学运算符
22
+ OPERATORS = {
23
+ ast.Add: operator.add,
24
+ ast.Sub: operator.sub,
25
+ ast.Mult: operator.mul,
26
+ ast.Div: operator.truediv,
27
+ ast.FloorDiv: operator.floordiv,
28
+ ast.Mod: operator.mod,
29
+ ast.Pow: operator.pow,
30
+ }
31
+
32
+ def __init__(self, llm_manager: Optional[LLMManager] = None):
33
+ """
34
+ 初始化 TokenParser
35
+
36
+ Args:
37
+ llm_manager: LLM 管理器,用于获取模型信息
38
+ """
39
+ self.llm_manager = llm_manager or LLMManager()
40
+
41
+ def parse_token_value(self, value: Union[str, int, float],
42
+ code_model: Optional[str] = None) -> int:
43
+ """
44
+ 解析 token 数量值
45
+
46
+ Args:
47
+ value: 要解析的值,可以是字符串、整数或浮点数
48
+ code_model: 代码模型名称,用于 float 类型的解析
49
+
50
+ Returns:
51
+ 解析后的 token 数量(整数)
52
+
53
+ Raises:
54
+ ValueError: 当解析失败时
55
+ """
56
+ if isinstance(value, int):
57
+ return max(0, value)
58
+
59
+ if isinstance(value, float):
60
+ return self._parse_float_value(value, code_model)
61
+
62
+ if isinstance(value, str):
63
+ return self._parse_string_value(value)
64
+
65
+ raise ValueError(f"Unsupported value type: {type(value)}")
66
+
67
+ def _parse_float_value(self, value: float, code_model: Optional[str] = None) -> int:
68
+ """
69
+ 解析浮点数值,基于模型的 context_window
70
+
71
+ Args:
72
+ value: 浮点数值(0-1 之间表示比例)
73
+ code_model: 模型名称
74
+
75
+ Returns:
76
+ 计算后的 token 数量
77
+ """
78
+ if not (0 <= value <= 1):
79
+ raise ValueError(f"Float value must be between 0 and 1, got: {value}")
80
+
81
+ context_window = self._get_context_window(code_model)
82
+ return int(context_window * value)
83
+
84
+ def _parse_string_value(self, value: str) -> int:
85
+ """
86
+ 解析字符串值,支持纯数字、单位和数学表达式
87
+
88
+ Args:
89
+ value: 字符串值
90
+
91
+ Returns:
92
+ 解析后的 token 数量
93
+ """
94
+ # 移除空格
95
+ value = value.strip()
96
+
97
+ if not value:
98
+ raise ValueError("Empty string value")
99
+
100
+ # 先尝试解析纯数字字符串(整数或浮点数)
101
+ numeric_result = self._try_parse_numeric_string(value)
102
+ if numeric_result is not None:
103
+ return numeric_result
104
+
105
+ # 再尝试解析带单位的简单数字
106
+ unit_result = self._try_parse_with_unit(value)
107
+ if unit_result is not None:
108
+ return unit_result
109
+
110
+ # 最后尝试解析数学表达式
111
+ return self._parse_math_expression(value)
112
+
113
+ def _try_parse_numeric_string(self, value: str) -> Optional[int]:
114
+ """
115
+ 尝试解析纯数字字符串(整数或浮点数)
116
+
117
+ Args:
118
+ value: 字符串值
119
+
120
+ Returns:
121
+ 解析结果,如果不是纯数字则返回 None
122
+ """
123
+ try:
124
+ # 使用正则表达式检查是否为纯数字字符串
125
+
126
+ # 匹配整数(包括负数)
127
+ if re.match(r'^-?\d+$', value):
128
+ return max(0, int(value))
129
+
130
+ # 匹配浮点数(包括负数)
131
+ if re.match(r'^-?\d+\.\d+$', value) or re.match(r'^-?\d+\.$', value) or re.match(r'^-?\.\d+$', value):
132
+ float_value = float(value)
133
+ return max(0, int(float_value))
134
+
135
+ return None
136
+
137
+ except (ValueError, TypeError):
138
+ return None
139
+
140
+ def _try_parse_with_unit(self, value: str) -> Optional[int]:
141
+ """
142
+ 尝试解析带单位的数字(如 100k, 1.5m)
143
+
144
+ Args:
145
+ value: 字符串值
146
+
147
+ Returns:
148
+ 解析结果,如果不匹配则返回 None
149
+ """
150
+ # 匹配数字+单位的模式
151
+ pattern = r'^(\d+(?:\.\d+)?)\s*([kmgKMG](?:[bB]?)?)$'
152
+ match = re.match(pattern, value)
153
+
154
+ if not match:
155
+ return None
156
+
157
+ number_str, unit = match.groups()
158
+ number = float(number_str)
159
+ unit_lower = unit.lower()
160
+
161
+ if unit_lower in self.UNIT_MULTIPLIERS:
162
+ return int(number * self.UNIT_MULTIPLIERS[unit_lower])
163
+
164
+ return None
165
+
166
+ def _parse_math_expression(self, expression: str) -> int:
167
+ """
168
+ 安全地解析数学表达式
169
+
170
+ Args:
171
+ expression: 数学表达式字符串
172
+
173
+ Returns:
174
+ 计算结果
175
+
176
+ Raises:
177
+ ValueError: 当表达式无效时
178
+ """
179
+ try:
180
+ # 解析 AST
181
+ tree = ast.parse(expression, mode='eval')
182
+ result = self._evaluate_ast_node(tree.body)
183
+
184
+ # 确保结果是正整数
185
+ if isinstance(result, (int, float)):
186
+ return max(0, int(result))
187
+ else:
188
+ raise ValueError(f"Expression result is not a number: {result}")
189
+
190
+ except (SyntaxError, ValueError, TypeError) as e:
191
+ raise ValueError(f"Invalid expression '{expression}': {e}")
192
+
193
+ def _evaluate_ast_node(self, node: ast.AST) -> Union[int, float]:
194
+ """
195
+ 递归计算 AST 节点
196
+
197
+ Args:
198
+ node: AST 节点
199
+
200
+ Returns:
201
+ 计算结果
202
+ """
203
+ if isinstance(node, ast.Constant): # Python 3.8+
204
+ return node.value
205
+ elif isinstance(node, ast.Num): # Python < 3.8
206
+ return node.n
207
+ elif isinstance(node, ast.BinOp):
208
+ left = self._evaluate_ast_node(node.left)
209
+ right = self._evaluate_ast_node(node.right)
210
+ op = self.OPERATORS.get(type(node.op))
211
+ if op is None:
212
+ raise ValueError(f"Unsupported operator: {type(node.op)}")
213
+
214
+ # 检查除零情况
215
+ if isinstance(node.op, (ast.Div, ast.FloorDiv, ast.Mod)) and right == 0:
216
+ raise ValueError("Division by zero")
217
+
218
+ return op(left, right)
219
+ elif isinstance(node, ast.UnaryOp):
220
+ operand = self._evaluate_ast_node(node.operand)
221
+ if isinstance(node.op, ast.UAdd):
222
+ return +operand
223
+ elif isinstance(node.op, ast.USub):
224
+ return -operand
225
+ else:
226
+ raise ValueError(f"Unsupported unary operator: {type(node.op)}")
227
+ else:
228
+ raise ValueError(f"Unsupported AST node type: {type(node)}")
229
+
230
+ def _get_context_window(self, model_name: Optional[str] = None) -> int:
231
+ """
232
+ 获取模型的 context_window
233
+
234
+ Args:
235
+ model_name: 模型名称
236
+
237
+ Returns:
238
+ context_window 大小,如果未找到或为 0 则返回默认值 120*1000
239
+ """
240
+ if not model_name:
241
+ return 120 * 1000
242
+
243
+ try:
244
+ model = self.llm_manager.get_model(model_name)
245
+ if model and model.context_window > 0:
246
+ return model.context_window
247
+ except Exception:
248
+ # 忽略获取模型信息时的错误
249
+ pass
250
+
251
+ return 120 * 1000
252
+
253
+ def validate_token_value(self, value: Union[str, int, float],
254
+ min_tokens: int = 0,
255
+ max_tokens: Optional[int] = None) -> bool:
256
+ """
257
+ 验证 token 值是否在有效范围内
258
+
259
+ Args:
260
+ value: 要验证的值
261
+ min_tokens: 最小 token 数
262
+ max_tokens: 最大 token 数,None 表示无限制
263
+
264
+ Returns:
265
+ 是否有效
266
+ """
267
+ try:
268
+ parsed_value = self.parse_token_value(value)
269
+ if parsed_value < min_tokens:
270
+ return False
271
+ if max_tokens is not None and parsed_value > max_tokens:
272
+ return False
273
+ return True
274
+ except (ValueError, TypeError):
275
+ return False
276
+
277
+ def get_supported_units(self) -> Dict[str, int]:
278
+ """获取支持的单位及其倍数"""
279
+ return self.UNIT_MULTIPLIERS.copy()
280
+
281
+ def get_examples(self) -> Dict[str, str]:
282
+ """获取使用示例"""
283
+ return {
284
+ "整数": "51200",
285
+ "纯数字字符串": "1024, 8, 1024.5",
286
+ "带单位": "50k, 1m, 2.5k",
287
+ "数学表达式": "50*1024, 100*1000, 2**16",
288
+ "浮点数(比例)": "0.1 (表示 context_window 的 10%)",
289
+ "复合表达式": "50*1024 + 10k"
290
+ }
@@ -1,4 +1,4 @@
1
- import pkg_resources
1
+ import importlib.resources as resources
2
2
  from tokenizers import Tokenizer
3
3
  from typing import Optional
4
4
 
@@ -14,9 +14,7 @@ class BuildinTokenizer:
14
14
 
15
15
  def _initialize(self) -> None:
16
16
  try:
17
- tokenizer_path = pkg_resources.resource_filename(
18
- "autocoder", "data/tokenizer.json"
19
- )
17
+ tokenizer_path = str(resources.files("autocoder") / "data" / "tokenizer.json")
20
18
  except FileNotFoundError:
21
19
  tokenizer_path = None
22
20
 
@@ -2,22 +2,31 @@ from typing import List, Dict, Tuple
2
2
  from autocoder.common.types import Mode
3
3
  from autocoder.common import AutoCoderArgs
4
4
  import byzerllm
5
- from autocoder.utils.queue_communicate import queue_communicate, CommunicateEvent, CommunicateEventType
6
5
  from autocoder.common import sys_prompt
7
6
  from concurrent.futures import ThreadPoolExecutor
8
7
  from autocoder.common.types import CodeGenerateResult
9
- from autocoder.common.utils_code_auto_generate import chat_with_continue,stream_chat_with_continue,ChatWithContinueResult
8
+ from autocoder.common.utils_code_auto_generate import (
9
+ chat_with_continue,
10
+ stream_chat_with_continue,
11
+ ChatWithContinueResult,
12
+ )
10
13
  from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
11
14
  from autocoder.common.stream_out_type import CodeGenerateStreamOutType
12
15
  from autocoder.common.auto_coder_lang import get_message_with_format
13
16
  import json
14
17
  from autocoder.common.printer import Printer
15
- from autocoder.rag.token_counter import count_tokens
18
+ from autocoder.common.tokens import count_string_tokens as count_tokens
16
19
  from autocoder.utils import llms as llm_utils
17
20
  from autocoder.common import SourceCodeList
18
21
  from autocoder.privacy.model_filter import ModelPathFilter
19
22
  from autocoder.memory.active_context_manager import ActiveContextManager
20
- from autocoder.run_context import get_run_context,RunMode
23
+ from autocoder.run_context import get_run_context, RunMode
24
+ import os
25
+ import uuid
26
+ from datetime import datetime
27
+ from autocoder.common.save_formatted_log import save_formatted_log
28
+ import platform
29
+
21
30
 
22
31
  class CodeAutoGenerate:
23
32
  def __init__(
@@ -25,7 +34,7 @@ class CodeAutoGenerate:
25
34
  ) -> None:
26
35
  self.llm = llm
27
36
  self.args = args
28
- self.action = action
37
+ self.action = action
29
38
  self.generate_times_same_model = args.generate_times_same_model
30
39
  if not self.llm:
31
40
  raise ValueError(
@@ -51,13 +60,22 @@ class CodeAutoGenerate:
51
60
  {{ instruction }}
52
61
 
53
62
  """
54
-
55
63
 
56
64
  @byzerllm.prompt(llm=lambda self: self.llm)
57
65
  def single_round_instruction(
58
- self, instruction: str, content: str, context: str = "", package_context: str = ""
66
+ self,
67
+ instruction: str,
68
+ content: str,
69
+ context: str = "",
70
+ package_context: str = "",
59
71
  ) -> str:
60
72
  """
73
+ <env>
74
+ 当前工作目录: {{ current_dir }}
75
+ 操作系统: {{ os_info }}
76
+ 当前时间: {{ current_time }}
77
+ </env>
78
+
61
79
  {%- if structure %}
62
80
  ====
63
81
  {{ structure }}
@@ -95,7 +113,7 @@ class CodeAutoGenerate:
95
113
  ##File: {{ key }}
96
114
  {{ value }}
97
115
  </user_rule>
98
- {% endfor %}
116
+ {% endfor %}
99
117
  {% endif %}
100
118
 
101
119
  ====
@@ -120,18 +138,28 @@ class CodeAutoGenerate:
120
138
 
121
139
  请确保每份代码的完整性,而不要只生成修改部分。
122
140
  """
123
-
141
+ # 收集环境信息
142
+ current_dir = os.getcwd()
143
+ os_info = f"{platform.system()} {platform.release()}"
144
+ current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
145
+
124
146
  if not self.args.include_project_structure:
125
147
  return {
126
- "structure": "",
148
+ "structure": "",
149
+ "current_dir": current_dir,
150
+ "os_info": os_info,
151
+ "current_time": current_time,
127
152
  }
128
-
153
+
129
154
  return {
130
155
  "structure": (
131
156
  self.action.pp.get_tree_like_directory_structure()
132
157
  if self.action
133
158
  else ""
134
- )
159
+ ),
160
+ "current_dir": current_dir,
161
+ "os_info": os_info,
162
+ "current_time": current_time,
135
163
  }
136
164
 
137
165
  def single_round_run(
@@ -139,8 +167,8 @@ class CodeAutoGenerate:
139
167
  ) -> Tuple[List[str], Dict[str, str]]:
140
168
  llm_config = {"human_as_model": self.args.human_as_model}
141
169
 
142
- # Apply model filter for code_llm
143
- printer = Printer()
170
+ # Apply model filter for code_llm
171
+ printer = Printer()
144
172
  for llm in self.llms:
145
173
  model_filter = ModelPathFilter.from_model_object(llm, self.args)
146
174
  filtered_sources = []
@@ -148,20 +176,25 @@ class CodeAutoGenerate:
148
176
  if model_filter.is_accessible(source.module_name):
149
177
  filtered_sources.append(source)
150
178
  else:
151
- printer.print_in_terminal("index_file_filtered",
152
- style="yellow",
153
- file_path=source.module_name,
154
- model_name=",".join(llm_utils.get_llm_names(llm)))
155
-
156
- source_code_list = SourceCodeList(filtered_sources)
179
+ printer.print_in_terminal(
180
+ "index_file_filtered",
181
+ style="yellow",
182
+ file_path=source.module_name,
183
+ model_name=",".join(llm_utils.get_llm_names(llm)),
184
+ )
185
+
186
+ source_code_list = SourceCodeList(filtered_sources)
187
+
157
188
  source_content = source_code_list.to_str()
158
189
 
159
190
  # 获取包上下文信息
160
191
  package_context = ""
161
-
192
+
162
193
  if self.args.enable_active_context:
163
194
  # 初始化活动上下文管理器
164
- active_context_manager = ActiveContextManager(self.llm, self.args.source_dir)
195
+ active_context_manager = ActiveContextManager(
196
+ self.llm, self.args.source_dir
197
+ )
165
198
  # 获取活动上下文信息
166
199
  result = active_context_manager.load_active_contexts_for_files(
167
200
  [source.module_name for source in source_code_list.sources]
@@ -170,32 +203,52 @@ class CodeAutoGenerate:
170
203
  if result.contexts:
171
204
  package_context_parts = []
172
205
  for dir_path, context in result.contexts.items():
173
- package_context_parts.append(f"<package_info>{context.content}</package_info>")
174
-
206
+ package_context_parts.append(
207
+ f"<package_info>{context.content}</package_info>"
208
+ )
209
+
175
210
  package_context = "\n".join(package_context_parts)
176
211
 
177
212
  if self.args.template == "common":
178
213
  init_prompt = self.single_round_instruction.prompt(
179
- instruction=query, content=source_content, context=self.args.context,
180
- package_context=package_context
214
+ instruction=query,
215
+ content=source_content,
216
+ context=self.args.context,
217
+ package_context=package_context,
181
218
  )
182
219
  elif self.args.template == "auto_implement":
183
220
  init_prompt = self.auto_implement_function.prompt(
184
221
  instruction=query, content=source_content
185
222
  )
186
223
 
187
- with open(self.args.target_file, "w",encoding="utf-8") as file:
224
+ with open(self.args.target_file, "w", encoding="utf-8") as file:
188
225
  file.write(init_prompt)
189
226
 
190
227
  conversations = []
191
228
 
192
229
  if self.args.system_prompt and self.args.system_prompt.strip() == "claude":
193
- conversations.append({"role": "system", "content": sys_prompt.claude_sys_prompt.prompt()})
230
+ conversations.append(
231
+ {"role": "system", "content": sys_prompt.claude_sys_prompt.prompt()}
232
+ )
194
233
  elif self.args.system_prompt:
195
234
  conversations.append({"role": "system", "content": self.args.system_prompt})
196
-
235
+
197
236
  conversations.append({"role": "user", "content": init_prompt})
198
237
 
238
+ # 保存 conversations 到 manuals 目录
239
+ try:
240
+ conversations_json = json.dumps(conversations, ensure_ascii=False, indent=2)
241
+ save_formatted_log(
242
+ project_root=self.args.source_dir,
243
+ json_text=conversations_json,
244
+ suffix="conversations",
245
+ log_subdir="manuals",
246
+ )
247
+ except Exception as e:
248
+ printer.print_in_terminal(
249
+ "conversations_save_failed", style="red", error=str(e)
250
+ )
251
+
199
252
  conversations_list = []
200
253
  results = []
201
254
  input_tokens_count = 0
@@ -205,90 +258,112 @@ class CodeAutoGenerate:
205
258
  model_names = []
206
259
 
207
260
  printer = Printer()
208
- estimated_input_tokens = count_tokens(json.dumps(conversations, ensure_ascii=False))
209
- printer.print_in_terminal("estimated_input_tokens_in_generate", style="yellow",
210
- estimated_input_tokens_in_generate=estimated_input_tokens,
211
- generate_mode="wholefile"
212
- )
261
+ estimated_input_tokens = count_tokens(
262
+ json.dumps(conversations, ensure_ascii=False)
263
+ )
264
+ printer.print_in_terminal(
265
+ "estimated_input_tokens_in_generate",
266
+ style="yellow",
267
+ estimated_input_tokens_in_generate=estimated_input_tokens,
268
+ generate_mode="wholefile",
269
+ )
213
270
 
214
271
  if not self.args.human_as_model or get_run_context().mode == RunMode.WEB:
215
- with ThreadPoolExecutor(max_workers=len(self.llms) * self.generate_times_same_model) as executor:
272
+ with ThreadPoolExecutor(
273
+ max_workers=len(self.llms) * self.generate_times_same_model
274
+ ) as executor:
216
275
  futures = []
217
276
  count = 0
218
277
  for llm in self.llms:
219
- model_names_list = llm_utils.get_llm_names(llm)
278
+ model_names_list = llm_utils.get_llm_names(llm)
220
279
  model_name = None
221
280
  if model_names_list:
222
- model_name = model_names_list[0]
281
+ model_name = model_names_list[0]
223
282
 
224
283
  for _ in range(self.generate_times_same_model):
225
284
  model_names.append(model_name)
226
285
  if count == 0:
286
+
227
287
  def job():
228
288
  stream_generator = stream_chat_with_continue(
229
- llm=llm,
230
- conversations=conversations,
289
+ llm=llm,
290
+ conversations=conversations,
231
291
  llm_config=llm_config,
232
- args=self.args
292
+ args=self.args,
233
293
  )
234
294
  full_response, last_meta = stream_out(
235
- stream_generator,
236
- model_name=model_name,
237
- title=get_message_with_format(
238
- "code_generate_title", model_name=model_name),
239
- args=self.args,
240
- extra_meta={
241
- "stream_out_type": CodeGenerateStreamOutType.CODE_GENERATE.value
242
- })
295
+ stream_generator,
296
+ model_name=model_name,
297
+ title=get_message_with_format(
298
+ "code_generate_title", model_name=model_name
299
+ ),
300
+ args=self.args,
301
+ extra_meta={
302
+ "stream_out_type": CodeGenerateStreamOutType.CODE_GENERATE.value
303
+ },
304
+ )
243
305
  return ChatWithContinueResult(
244
306
  content=full_response,
245
307
  input_tokens_count=last_meta.input_tokens_count,
246
- generated_tokens_count=last_meta.generated_tokens_count
308
+ generated_tokens_count=last_meta.generated_tokens_count,
247
309
  )
310
+
248
311
  futures.append(executor.submit(job))
249
- else:
250
- futures.append(executor.submit(
251
- chat_with_continue,
252
- llm=llm,
253
- conversations=conversations,
254
- llm_config=llm_config,
255
- args=self.args
256
- ))
312
+ else:
313
+ futures.append(
314
+ executor.submit(
315
+ chat_with_continue,
316
+ llm=llm,
317
+ conversations=conversations,
318
+ llm_config=llm_config,
319
+ args=self.args,
320
+ )
321
+ )
257
322
  count += 1
258
323
  temp_results = [future.result() for future in futures]
259
324
  for result in temp_results:
260
325
  results.append(result.content)
261
326
  input_tokens_count += result.input_tokens_count
262
327
  generated_tokens_count += result.generated_tokens_count
263
- model_info = llm_utils.get_model_info(model_name, self.args.product_mode)
328
+ model_info = llm_utils.get_model_info(
329
+ model_name, self.args.product_mode
330
+ )
264
331
  input_cost = model_info.get("input_price", 0) if model_info else 0
265
332
  output_cost = model_info.get("output_price", 0) if model_info else 0
266
- input_tokens_cost += input_cost * result.input_tokens_count / 1000000
267
- generated_tokens_cost += output_cost * result.generated_tokens_count / 1000000
268
-
333
+ input_tokens_cost += (
334
+ input_cost * result.input_tokens_count / 1000000
335
+ )
336
+ generated_tokens_cost += (
337
+ output_cost * result.generated_tokens_count / 1000000
338
+ )
339
+
269
340
  for result in results:
270
341
  conversations_list.append(
271
- conversations + [{"role": "assistant", "content": result}])
272
- else:
342
+ conversations + [{"role": "assistant", "content": result}]
343
+ )
344
+ else:
273
345
  for _ in range(self.args.human_model_num):
274
346
  single_result = chat_with_continue(
275
- llm=self.llms[0],
276
- conversations=conversations,
347
+ llm=self.llms[0],
348
+ conversations=conversations,
277
349
  llm_config=llm_config,
278
- args=self.args
279
- )
350
+ args=self.args,
351
+ )
280
352
  results.append(single_result.content)
281
353
  input_tokens_count += single_result.input_tokens_count
282
354
  generated_tokens_count += single_result.generated_tokens_count
283
- conversations_list.append(conversations + [{"role": "assistant", "content": single_result.content}])
284
-
355
+ conversations_list.append(
356
+ conversations
357
+ + [{"role": "assistant", "content": single_result.content}]
358
+ )
359
+
285
360
  statistics = {
286
361
  "input_tokens_count": input_tokens_count,
287
362
  "generated_tokens_count": generated_tokens_count,
288
363
  "input_tokens_cost": input_tokens_cost,
289
- "generated_tokens_cost": generated_tokens_cost
290
- }
291
-
292
- return CodeGenerateResult(contents=results, conversations=conversations_list, metadata=statistics)
364
+ "generated_tokens_cost": generated_tokens_cost,
365
+ }
293
366
 
294
-
367
+ return CodeGenerateResult(
368
+ contents=results, conversations=conversations_list, metadata=statistics
369
+ )