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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +409 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -1,39 +1,29 @@
1
-
2
- import os
3
1
  import time
4
2
  import json
5
- from typing import Dict, Any, List
6
3
  from rich.console import Console
7
4
  from rich.panel import Panel
8
- from rich.markdown import Markdown
9
- from rich.live import Live
10
5
  from prompt_toolkit import prompt
11
6
  from prompt_toolkit.formatted_text import FormattedText
12
7
  from loguru import logger
13
8
  import byzerllm
14
-
9
+ from typing import Optional
15
10
  from autocoder.common.auto_coder_lang import get_message
16
11
  from autocoder.common.memory_manager import save_to_memory_file
17
12
  from autocoder.common.utils_code_auto_generate import stream_chat_with_continue
18
13
  from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
19
14
  from autocoder.common.printer import Printer
20
- from autocoder.rag.token_counter import count_tokens
15
+ from autocoder.common.tokens import count_string_tokens as count_tokens
21
16
  from autocoder.privacy.model_filter import ModelPathFilter
22
17
  from autocoder.common.result_manager import ResultManager
23
18
  from autocoder.events.event_manager_singleton import get_event_manager
24
19
  from autocoder.events import event_content as EventContentCreator
25
20
  from autocoder.events.event_types import EventMetadata
26
- from autocoder.common.mcp_server import get_mcp_server
27
- from autocoder.common.mcp_server_types import McpRequest
21
+ from autocoder.common.mcp_tools.server import get_mcp_server
22
+ from autocoder.common.mcp_tools.types import McpRequest
28
23
  from autocoder.utils.llms import get_llm_names
29
- from autocoder.utils.request_queue import (
30
- request_queue,
31
- RequestValue,
32
- DefaultValue,
33
- RequestOption,
34
- )
35
24
  from autocoder.run_context import get_run_context, RunMode
36
25
  from autocoder.common.action_yml_file_manager import ActionYmlFileManager
26
+ from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
37
27
 
38
28
 
39
29
  class ChatAgent:
@@ -43,6 +33,18 @@ class ChatAgent:
43
33
  self.raw_args = raw_args
44
34
  self.console = Console()
45
35
  self.result_manager = ResultManager()
36
+ self.conversation_manager = get_conversation_manager()
37
+ # 生成命名空间用于会话隔离
38
+ self.namespace = self._generate_namespace()
39
+
40
+ def _generate_namespace(self) -> Optional[str]:
41
+ """
42
+ 生成命名空间,用于会话隔离
43
+
44
+ Returns:
45
+ str: 基于项目路径的命名空间
46
+ """
47
+ return None
46
48
 
47
49
  def run(self):
48
50
  """执行 chat 命令的主要逻辑"""
@@ -55,20 +57,26 @@ class ChatAgent:
55
57
  for command in self.args.action:
56
58
  commands_info[command] = {}
57
59
 
58
- memory_dir = os.path.join(self.args.source_dir, ".auto-coder", "memory")
59
- os.makedirs(memory_dir, exist_ok=True)
60
- memory_file = os.path.join(memory_dir, "chat_history.json")
61
-
62
60
  # 处理新会话
63
61
  if self.args.new_session:
64
- self._handle_new_session(memory_file)
62
+ self._handle_new_session()
65
63
  if not self.args.query or (self.args.query_prefix and self.args.query == self.args.query_prefix) or (self.args.query_suffix and self.args.query == self.args.query_suffix):
66
64
  return
67
65
 
68
- # 加载聊天历史
69
- chat_history = self._load_chat_history(memory_file)
70
- chat_history["ask_conversation"].append(
71
- {"role": "user", "content": self.args.query}
66
+ # 确保有当前会话,如果没有则创建
67
+ current_conversation_id = self.conversation_manager.get_current_conversation_id(self.namespace)
68
+ if not current_conversation_id:
69
+ current_conversation_id = self.conversation_manager.create_conversation(
70
+ name="Chat Session",
71
+ description="Auto-coder chat session"
72
+ )
73
+ self.conversation_manager.set_current_conversation(current_conversation_id, self.namespace)
74
+
75
+ # 添加用户消息到当前会话
76
+ self.conversation_manager.append_message_to_current(
77
+ role="user",
78
+ content=self.args.query,
79
+ namespace=self.namespace
72
80
  )
73
81
 
74
82
  # 获取聊天模型
@@ -78,11 +86,11 @@ class ChatAgent:
78
86
  chat_llm = self.llm
79
87
 
80
88
  # 构建对话上下文
81
- loaded_conversations = self._build_conversations(commands_info, chat_history)
89
+ loaded_conversations = self._build_conversations(commands_info)
82
90
 
83
91
  # 处理人工模型模式
84
92
  if get_run_context().mode != RunMode.WEB and self.args.human_as_model:
85
- return self._handle_human_as_model(loaded_conversations, chat_history, memory_file, commands_info)
93
+ return self._handle_human_as_model(loaded_conversations, commands_info)
86
94
 
87
95
  # 计算耗时
88
96
  start_time = time.time()
@@ -118,33 +126,26 @@ class ChatAgent:
118
126
  if last_meta:
119
127
  self._print_stats(last_meta, start_time, model_name)
120
128
 
121
- # 更新聊天历史
122
- chat_history["ask_conversation"].append(
123
- {"role": "assistant", "content": assistant_response}
129
+ # 更新聊天历史 - 添加助手回复到当前会话
130
+ self.conversation_manager.append_message_to_current(
131
+ role="assistant",
132
+ content=assistant_response,
133
+ namespace=self.namespace
124
134
  )
125
135
 
126
- with open(memory_file, "w", encoding="utf-8") as f:
127
- json.dump(chat_history, f, ensure_ascii=False)
128
-
129
136
  # 处理后续命令
130
- self._handle_post_commands(commands_info, assistant_response, chat_history)
137
+ self._handle_post_commands(commands_info, assistant_response)
131
138
 
132
- def _handle_new_session(self, memory_file):
139
+ def _handle_new_session(self):
133
140
  """处理新会话逻辑"""
134
- if os.path.exists(memory_file):
135
- with open(memory_file, "r", encoding="utf-8") as f:
136
- old_chat_history = json.load(f)
137
- if "conversation_history" not in old_chat_history:
138
- old_chat_history["conversation_history"] = []
139
- old_chat_history["conversation_history"].append(
140
- old_chat_history.get("ask_conversation", []))
141
- chat_history = {"ask_conversation": [],
142
- "conversation_history": old_chat_history["conversation_history"]}
143
- else:
144
- chat_history = {"ask_conversation": [],
145
- "conversation_history": []}
146
- with open(memory_file, "w", encoding="utf-8") as f:
147
- json.dump(chat_history, f, ensure_ascii=False)
141
+ # 创建新的对话会话
142
+ conversation_id = self.conversation_manager.create_conversation(
143
+ name="New Chat Session",
144
+ description=f"Chat session started at {time.strftime('%Y-%m-%d %H:%M:%S')}"
145
+ )
146
+
147
+ # 设置为当前会话
148
+ self.conversation_manager.set_current_conversation(conversation_id, self.namespace)
148
149
 
149
150
  self.result_manager.add_result(content=get_message("new_session_started"), meta={
150
151
  "action": "chat",
@@ -161,19 +162,15 @@ class ChatAgent:
161
162
  )
162
163
  )
163
164
 
164
- def _load_chat_history(self, memory_file):
165
- """加载聊天历史"""
166
- if os.path.exists(memory_file):
167
- with open(memory_file, "r", encoding="utf-8") as f:
168
- chat_history = json.load(f)
169
- if "conversation_history" not in chat_history:
170
- chat_history["conversation_history"] = []
171
- else:
172
- chat_history = {"ask_conversation": [],
173
- "conversation_history": []}
174
- return chat_history
165
+ def _get_current_conversation_messages(self):
166
+ """获取当前会话的消息列表"""
167
+ current_conversation_id = self.conversation_manager.get_current_conversation_id(self.namespace)
168
+ if current_conversation_id:
169
+ messages = self.conversation_manager.get_messages(current_conversation_id)
170
+ return [{"role": msg["role"], "content": msg["content"]} for msg in messages]
171
+ return []
175
172
 
176
- def _build_conversations(self, commands_info, chat_history):
173
+ def _build_conversations(self, commands_info):
177
174
  """构建对话上下文"""
178
175
  source_count = 0
179
176
  pre_conversations = []
@@ -198,17 +195,19 @@ class ChatAgent:
198
195
  source_count += 1
199
196
 
200
197
  # 构建索引和过滤文件
201
- if "no_context" not in commands_info:
202
- from autocoder.index.index import IndexManager
198
+ if "no_context" not in commands_info:
203
199
  from autocoder.index.entry import build_index_and_filter_files
204
200
  from autocoder.pyproject import PyProject
205
201
  from autocoder.tsproject import TSProject
206
202
  from autocoder.suffixproject import SuffixProject
203
+ from autocoder.default_project import DefaultProject
207
204
 
208
205
  if self.args.project_type == "ts":
209
206
  pp = TSProject(args=self.args, llm=self.llm)
210
207
  elif self.args.project_type == "py":
211
208
  pp = PyProject(args=self.args, llm=self.llm)
209
+ elif not self.args.project_type or self.args.project_type == "*":
210
+ pp = DefaultProject(args=self.args, llm=self.llm)
212
211
  else:
213
212
  pp = SuffixProject(args=self.args, llm=self.llm, file_filter=None)
214
213
  pp.run()
@@ -242,10 +241,12 @@ class ChatAgent:
242
241
  {"role": "assistant", "content": "read"})
243
242
  source_count += 1
244
243
 
245
- loaded_conversations = pre_conversations + chat_history["ask_conversation"]
244
+ # 获取当前会话的历史消息
245
+ current_messages = self._get_current_conversation_messages()
246
+ loaded_conversations = pre_conversations + current_messages
246
247
  return loaded_conversations
247
248
 
248
- def _handle_human_as_model(self, loaded_conversations, chat_history, memory_file, commands_info):
249
+ def _handle_human_as_model(self, loaded_conversations, commands_info):
249
250
  """处理人工模型模式"""
250
251
  @byzerllm.prompt()
251
252
  def chat_with_human_as_model(
@@ -334,16 +335,17 @@ class ChatAgent:
334
335
  "query": self.args.query
335
336
  }})
336
337
 
337
- # Update chat history with user's response
338
- chat_history["ask_conversation"].append(
339
- {"role": "assistant", "content": result}
338
+ # 更新当前会话的历史记录
339
+ self.conversation_manager.append_message_to_current(
340
+ role="assistant",
341
+ content=result,
342
+ namespace=self.namespace
340
343
  )
341
344
 
342
- with open(memory_file, "w", encoding="utf-8") as f:
343
- json.dump(chat_history, f, ensure_ascii=False)
344
-
345
345
  if "save" in commands_info:
346
- save_to_memory_file(ask_conversation=chat_history["ask_conversation"],
346
+ # 获取当前会话消息用于保存
347
+ current_messages = self._get_current_conversation_messages()
348
+ save_to_memory_file(ask_conversation=current_messages,
347
349
  query=self.args.query,
348
350
  response=result)
349
351
  printer = Printer()
@@ -452,7 +454,7 @@ class ChatAgent:
452
454
  action_file=self.args.file
453
455
  ).to_dict())
454
456
 
455
- def _handle_post_commands(self, commands_info, assistant_response, chat_history):
457
+ def _handle_post_commands(self, commands_info, assistant_response):
456
458
  """处理后续命令"""
457
459
  if "copy" in commands_info:
458
460
  # copy assistant_response to clipboard
@@ -463,7 +465,9 @@ class ChatAgent:
463
465
  print("pyperclip not installed or clipboard is not supported, instruction will not be copied to clipboard.")
464
466
 
465
467
  if "save" in commands_info:
466
- tmp_dir = save_to_memory_file(ask_conversation=chat_history["ask_conversation"],
468
+ # 获取当前会话消息用于保存
469
+ current_messages = self._get_current_conversation_messages()
470
+ tmp_dir = save_to_memory_file(ask_conversation=current_messages,
467
471
  query=self.args.query,
468
472
  response=assistant_response)
469
473
  printer = Printer()
autocoder/auto_coder.py CHANGED
@@ -1,4 +1,3 @@
1
- from autocoder.events.event_types import EventMetadata
2
1
  import byzerllm
3
2
  import yaml
4
3
  import os
@@ -10,8 +9,7 @@ from autocoder.common import git_utils, code_auto_execute
10
9
  from autocoder.utils.llm_client_interceptors import token_counter_interceptor
11
10
  from autocoder.db.store import Store
12
11
  from autocoder.common.action_yml_file_manager import ActionYmlFileManager
13
-
14
- from autocoder.utils.llms import get_llm_names
12
+ from autocoder.common.llms import LLMManager
15
13
 
16
14
  from byzerllm.utils.client import EventCallbackResult, EventName
17
15
  from prompt_toolkit import prompt
@@ -31,31 +29,24 @@ from autocoder.utils.request_queue import (
31
29
  RequestOption,
32
30
  )
33
31
  from loguru import logger
34
- import json
35
32
  from rich.console import Console
36
33
  from rich.panel import Panel
37
- from rich.markdown import Markdown
38
- from rich.live import Live
39
34
  from autocoder.common.auto_coder_lang import get_message
40
- from autocoder.common.memory_manager import save_to_memory_file
41
- from autocoder import models as models_module
42
- from autocoder.common.utils_code_auto_generate import stream_chat_with_continue
43
- from autocoder.utils.auto_coder_utils.chat_stream_out import stream_out
44
- from autocoder.common.printer import Printer
45
- from autocoder.rag.token_counter import count_tokens
46
- from autocoder.privacy.model_filter import ModelPathFilter
47
- from autocoder.common.result_manager import ResultManager
48
- from autocoder.events.event_manager_singleton import get_event_manager
49
- from autocoder.events import event_content as EventContentCreator
50
- from autocoder.common.mcp_server import get_mcp_server
51
- from autocoder.common.mcp_server_types import (
52
- McpRequest, McpInstallRequest, McpRemoveRequest, McpListRequest,
53
- McpListRunningRequest, McpRefreshRequest
54
- )
55
35
  from autocoder.run_context import get_run_context,RunMode
56
36
  console = Console()
57
37
 
58
38
 
39
+ def get_model_info_with_check(model_name: str, product_mode: str):
40
+ """获取模型信息并检查是否为None,如果为None则抛出友好的异常"""
41
+ model_info = LLMManager().get_model_info(model_name, product_mode)
42
+ if model_info is None:
43
+ from autocoder.common.international import get_message_with_format
44
+ error_message = get_message_with_format("model_info_not_found",
45
+ model_name=model_name,
46
+ product_mode=product_mode)
47
+ raise ValueError(error_message)
48
+ return model_info
49
+
59
50
  def resolve_include_path(base_path, include_path):
60
51
  if include_path.startswith(".") or include_path.startswith(".."):
61
52
  full_base_path = os.path.abspath(base_path)
@@ -257,7 +248,7 @@ def main(input_args: Optional[List[str]] = None):
257
248
 
258
249
  if args.product_mode == "lite":
259
250
  default_model = args.model
260
- model_info = models_module.get_model_by_name(default_model)
251
+ model_info = get_model_info_with_check(default_model, args.product_mode)
261
252
  llm = byzerllm.SimpleByzerLLM(default_model_name=default_model)
262
253
  llm.deploy(
263
254
  model_path="",
@@ -281,7 +272,7 @@ def main(input_args: Optional[List[str]] = None):
281
272
  models = []
282
273
  for _, model_name in enumerate(model_names):
283
274
  model_name = model_name.strip()
284
- model_info = models_module.get_model_by_name(model_name)
275
+ model_info = get_model_info_with_check(model_name, args.product_mode)
285
276
  code_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
286
277
  code_model.deploy(
287
278
  model_path="",
@@ -299,7 +290,7 @@ def main(input_args: Optional[List[str]] = None):
299
290
  llm.setup_sub_client("code_model", models)
300
291
  else:
301
292
  # Single code model
302
- model_info = models_module.get_model_by_name(args.code_model)
293
+ model_info = get_model_info_with_check(args.code_model, args.product_mode)
303
294
  model_name = args.code_model
304
295
  code_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
305
296
  code_model.deploy(
@@ -322,7 +313,7 @@ def main(input_args: Optional[List[str]] = None):
322
313
  model_names = args.generate_rerank_model.split(",")
323
314
  models = []
324
315
  for _, model_name in enumerate(model_names):
325
- model_info = models_module.get_model_by_name(model_name)
316
+ model_info = get_model_info_with_check(model_name, args.product_mode)
326
317
  rerank_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
327
318
  rerank_model.deploy(
328
319
  model_path="",
@@ -340,7 +331,7 @@ def main(input_args: Optional[List[str]] = None):
340
331
  llm.setup_sub_client("generate_rerank_model", models)
341
332
  else:
342
333
  # Single rerank model
343
- model_info = models_module.get_model_by_name(args.generate_rerank_model)
334
+ model_info = get_model_info_with_check(args.generate_rerank_model, args.product_mode)
344
335
  model_name = args.generate_rerank_model
345
336
  rerank_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
346
337
  rerank_model.deploy(
@@ -358,7 +349,7 @@ def main(input_args: Optional[List[str]] = None):
358
349
  llm.setup_sub_client("generate_rerank_model", rerank_model)
359
350
 
360
351
  if args.inference_model:
361
- model_info = models_module.get_model_by_name(args.inference_model)
352
+ model_info = get_model_info_with_check(args.inference_model, args.product_mode)
362
353
  model_name = args.inference_model
363
354
  inference_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
364
355
  inference_model.deploy(
@@ -377,7 +368,7 @@ def main(input_args: Optional[List[str]] = None):
377
368
 
378
369
  if args.index_filter_model:
379
370
  model_name = args.index_filter_model.strip()
380
- model_info = models_module.get_model_by_name(model_name)
371
+ model_info = get_model_info_with_check(model_name, args.product_mode)
381
372
  index_filter_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
382
373
  index_filter_model.deploy(
383
374
  model_path="",
@@ -395,7 +386,7 @@ def main(input_args: Optional[List[str]] = None):
395
386
 
396
387
  if args.context_prune_model:
397
388
  model_name = args.context_prune_model.strip()
398
- model_info = models_module.get_model_by_name(model_name)
389
+ model_info = get_model_info_with_check(model_name, args.product_mode)
399
390
  context_prune_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
400
391
  context_prune_model.deploy(
401
392
  model_path="",
@@ -413,7 +404,7 @@ def main(input_args: Optional[List[str]] = None):
413
404
 
414
405
  if args.conversation_prune_model:
415
406
  model_name = args.conversation_prune_model.strip()
416
- model_info = models_module.get_model_by_name(model_name)
407
+ model_info = get_model_info_with_check(model_name, args.product_mode)
417
408
  conversation_prune_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
418
409
  conversation_prune_model.deploy(
419
410
  model_path="",
@@ -588,7 +579,7 @@ def main(input_args: Optional[List[str]] = None):
588
579
  if args.product_mode == "lite":
589
580
  if args.chat_model:
590
581
  model_name = args.chat_model.strip()
591
- model_info = models_module.get_model_by_name(model_name)
582
+ model_info = get_model_info_with_check(model_name, args.product_mode)
592
583
  chat_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
593
584
  chat_model.deploy(
594
585
  model_path="",
@@ -606,7 +597,7 @@ def main(input_args: Optional[List[str]] = None):
606
597
 
607
598
  if args.vl_model:
608
599
  model_name = args.vl_model.strip()
609
- model_info = models_module.get_model_by_name(model_name)
600
+ model_info = get_model_info_with_check(model_name, args.product_mode)
610
601
  vl_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
611
602
  vl_model.deploy(
612
603
  model_path="",
@@ -624,7 +615,7 @@ def main(input_args: Optional[List[str]] = None):
624
615
 
625
616
  if args.index_model:
626
617
  model_name = args.index_model.strip()
627
- model_info = models_module.get_model_by_name(model_name)
618
+ model_info = get_model_info_with_check(model_name, args.product_mode)
628
619
  index_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
629
620
  index_model.deploy(
630
621
  model_path="",
@@ -642,7 +633,7 @@ def main(input_args: Optional[List[str]] = None):
642
633
 
643
634
  if args.sd_model:
644
635
  model_name = args.sd_model.strip()
645
- model_info = models_module.get_model_by_name(model_name)
636
+ model_info = get_model_info_with_check(model_name, args.product_mode)
646
637
  sd_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
647
638
  sd_model.deploy(
648
639
  model_path="",
@@ -660,7 +651,7 @@ def main(input_args: Optional[List[str]] = None):
660
651
 
661
652
  if args.text2voice_model:
662
653
  model_name = args.text2voice_model.strip()
663
- model_info = models_module.get_model_by_name(model_name)
654
+ model_info = get_model_info_with_check(model_name, args.product_mode)
664
655
  text2voice_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
665
656
  text2voice_model.deploy(
666
657
  model_path="",
@@ -678,7 +669,7 @@ def main(input_args: Optional[List[str]] = None):
678
669
 
679
670
  if args.voice2text_model:
680
671
  model_name = args.voice2text_model.strip()
681
- model_info = models_module.get_model_by_name(model_name)
672
+ model_info = get_model_info_with_check(model_name, args.product_mode)
682
673
  voice2text_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
683
674
  voice2text_model.deploy(
684
675
  model_path="",
@@ -696,7 +687,7 @@ def main(input_args: Optional[List[str]] = None):
696
687
 
697
688
  if args.planner_model:
698
689
  model_name = args.planner_model.strip()
699
- model_info = models_module.get_model_by_name(model_name)
690
+ model_info = get_model_info_with_check(model_name, args.product_mode)
700
691
  planner_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
701
692
  planner_model.deploy(
702
693
  model_path="",
@@ -714,7 +705,7 @@ def main(input_args: Optional[List[str]] = None):
714
705
 
715
706
  if args.commit_model:
716
707
  model_name = args.commit_model.strip()
717
- model_info = models_module.get_model_by_name(model_name)
708
+ model_info = get_model_info_with_check(model_name, args.product_mode)
718
709
  commit_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
719
710
  commit_model.deploy(
720
711
  model_path="",
@@ -732,7 +723,7 @@ def main(input_args: Optional[List[str]] = None):
732
723
 
733
724
  if args.designer_model:
734
725
  model_name = args.designer_model.strip()
735
- model_info = models_module.get_model_by_name(model_name)
726
+ model_info = get_model_info_with_check(model_name, args.product_mode)
736
727
  designer_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
737
728
  designer_model.deploy(
738
729
  model_path="",
@@ -750,7 +741,7 @@ def main(input_args: Optional[List[str]] = None):
750
741
 
751
742
  if args.emb_model:
752
743
  model_name = args.emb_model.strip()
753
- model_info = models_module.get_model_by_name(model_name)
744
+ model_info = get_model_info_with_check(model_name, args.product_mode)
754
745
  emb_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
755
746
  emb_model.deploy(
756
747
  model_path="",