auto-coder 1.0.0__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 (574) 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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.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 +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 +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +970 -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 +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/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 +288 -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 +349 -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 +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  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 +932 -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 +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -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.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,64 @@
1
+ """
2
+ 输入格式化器模块
3
+
4
+ 提供输入内容的格式化功能。
5
+ """
6
+
7
+ import json
8
+ from typing import Dict, Any, AsyncIterator
9
+
10
+
11
+ class InputFormatter:
12
+ """输入格式化器,处理不同格式的输入。"""
13
+
14
+ def format_text(self, content: str) -> str:
15
+ """
16
+ 格式化文本输入。
17
+
18
+ Args:
19
+ content: 输入文本
20
+
21
+ Returns:
22
+ 格式化后的文本
23
+ """
24
+ return content.strip()
25
+
26
+ def format_json(self, content: str) -> Dict[str, Any]:
27
+ """
28
+ 格式化JSON输入。
29
+
30
+ Args:
31
+ content: JSON格式的输入字符串
32
+
33
+ Returns:
34
+ 解析后的字典
35
+
36
+ Raises:
37
+ ValueError: 如果输入不是有效的JSON
38
+ """
39
+ try:
40
+ return json.loads(content)
41
+ except json.JSONDecodeError as e:
42
+ raise ValueError(f"无效的JSON输入: {str(e)}")
43
+
44
+ async def format_stream_json(self, content: str) -> AsyncIterator[Dict[str, Any]]:
45
+ """
46
+ 格式化流式JSON输入。
47
+
48
+ Args:
49
+ content: 包含多行JSON对象的字符串
50
+
51
+ Yields:
52
+ 解析后的字典
53
+
54
+ Raises:
55
+ ValueError: 如果某行不是有效的JSON
56
+ """
57
+ for line in content.strip().split("\n"):
58
+ if not line.strip():
59
+ continue
60
+
61
+ try:
62
+ yield json.loads(line)
63
+ except json.JSONDecodeError as e:
64
+ raise ValueError(f"无效的JSON行: {line}, 错误: {str(e)}")
@@ -0,0 +1,247 @@
1
+ """
2
+ 输出格式化器模块
3
+
4
+ 提供统一的输出格式化功能。
5
+ """
6
+
7
+ import json
8
+ from typing import Any, Dict, Union, List, Optional
9
+
10
+
11
+ class OutputFormatter:
12
+ """输出格式化器,处理不同格式的输出。"""
13
+
14
+ def __init__(self, verbose: bool = False):
15
+ """
16
+ 初始化输出格式化器。
17
+
18
+ Args:
19
+ verbose: 是否输出详细信息
20
+ """
21
+ self.verbose = verbose
22
+
23
+ def format_text(self, content: Union[str, Dict[str, Any]]) -> str:
24
+ """
25
+ 格式化为文本输出。
26
+
27
+ Args:
28
+ content: 要格式化的内容,可以是字符串或字典
29
+
30
+ Returns:
31
+ 格式化后的文本
32
+ """
33
+ if isinstance(content, dict):
34
+ # 如果是字典,提取主要内容
35
+ if "content" in content:
36
+ result = content["content"]
37
+ else:
38
+ result = str(content)
39
+ else:
40
+ result = str(content)
41
+
42
+ if self.verbose:
43
+ # 在详细模式下添加调试信息
44
+ debug_info = self._get_debug_info(content)
45
+ if debug_info:
46
+ result += f"\n\n[DEBUG]\n{debug_info}"
47
+
48
+ return result
49
+
50
+ def format_json(self, content: Any) -> str:
51
+ """
52
+ 格式化为JSON输出。
53
+
54
+ Args:
55
+ content: 要格式化的内容
56
+
57
+ Returns:
58
+ JSON格式的字符串
59
+ """
60
+ # 确保内容可以被序列化为JSON
61
+ if isinstance(content, str):
62
+ try:
63
+ # 尝试解析为JSON
64
+ parsed = json.loads(content)
65
+ content = parsed
66
+ except json.JSONDecodeError:
67
+ # 如果不是有效的JSON,则包装为字典
68
+ content = {"content": content}
69
+
70
+ # 添加调试信息(如果启用详细模式)
71
+ if self.verbose and isinstance(content, dict):
72
+ content["debug"] = self._get_debug_info_dict(content)
73
+
74
+ return json.dumps(content, ensure_ascii=False, indent=2)
75
+
76
+ def _get_debug_info(self, content: Any) -> str:
77
+ """
78
+ 获取调试信息的文本表示。
79
+
80
+ Args:
81
+ content: 内容对象
82
+
83
+ Returns:
84
+ 调试信息文本
85
+ """
86
+ debug_dict = self._get_debug_info_dict(content)
87
+ if debug_dict:
88
+ return json.dumps(debug_dict, ensure_ascii=False, indent=2)
89
+ return ""
90
+
91
+ def _get_debug_info_dict(self, content: Any) -> Dict[str, Any]:
92
+ """
93
+ 获取调试信息的字典表示。
94
+
95
+ Args:
96
+ content: 内容对象
97
+
98
+ Returns:
99
+ 调试信息字典
100
+ """
101
+ debug_info = {}
102
+
103
+ # 从内容中提取元数据
104
+ if isinstance(content, dict):
105
+ if "metadata" in content:
106
+ debug_info["metadata"] = content["metadata"]
107
+
108
+ # 提取令牌计数信息
109
+ if "tokens" in content:
110
+ debug_info["tokens"] = content["tokens"]
111
+ elif "metadata" in content and "tokens" in content["metadata"]:
112
+ debug_info["tokens"] = content["metadata"]["tokens"]
113
+
114
+ # 提取模型信息
115
+ if "model" in content:
116
+ debug_info["model"] = content["model"]
117
+ elif "metadata" in content and "model" in content["metadata"]:
118
+ debug_info["model"] = content["metadata"]["model"]
119
+
120
+ # 提取时间信息
121
+ if "timestamp" in content:
122
+ debug_info["timestamp"] = content["timestamp"]
123
+ elif "metadata" in content and "timestamp" in content["metadata"]:
124
+ debug_info["timestamp"] = content["metadata"]["timestamp"]
125
+
126
+ return debug_info
127
+
128
+
129
+ def format_output(content: Any, output_format: str = "text") -> str:
130
+ """
131
+ 格式化输出内容
132
+
133
+ Args:
134
+ content: 要格式化的内容
135
+ output_format: 输出格式 (text, json)
136
+
137
+ Returns:
138
+ str: 格式化后的内容
139
+ """
140
+ formatter = OutputFormatter()
141
+
142
+ if output_format == "json":
143
+ return formatter.format_json(content)
144
+ else:
145
+ return formatter.format_text(content)
146
+
147
+
148
+ def format_table_output(data: List[Any], headers: Optional[List[str]] = None) -> str:
149
+ """
150
+ 格式化表格输出
151
+
152
+ Args:
153
+ data: 表格数据
154
+ headers: 表头
155
+
156
+ Returns:
157
+ str: 格式化的表格
158
+ """
159
+ if not data:
160
+ return "No data to display"
161
+
162
+ if headers is None:
163
+ if isinstance(data[0], dict):
164
+ headers = list(data[0].keys())
165
+ else:
166
+ headers = [f"Column {i+1}" for i in range(len(data[0]) if data[0] else 0)]
167
+
168
+ # 计算列宽
169
+ col_widths = []
170
+ for i, header in enumerate(headers):
171
+ max_width = len(header)
172
+ for row in data:
173
+ if isinstance(row, dict):
174
+ cell_value = str(row.get(header, ""))
175
+ elif isinstance(row, (list, tuple)) and i < len(row):
176
+ cell_value = str(row[i])
177
+ else:
178
+ cell_value = ""
179
+ max_width = max(max_width, len(cell_value))
180
+ col_widths.append(max_width + 2) # 添加padding
181
+
182
+ # 构建表格
183
+ lines = []
184
+
185
+ # 表头
186
+ header_line = "|".join(header.center(col_widths[i]) for i, header in enumerate(headers))
187
+ lines.append(header_line)
188
+
189
+ # 分隔线
190
+ separator = "|".join("-" * width for width in col_widths)
191
+ lines.append(separator)
192
+
193
+ # 数据行
194
+ for row in data:
195
+ if isinstance(row, dict):
196
+ row_values = [str(row.get(header, "")) for header in headers]
197
+ elif isinstance(row, (list, tuple)):
198
+ row_values = [str(row[i]) if i < len(row) else "" for i in range(len(headers))]
199
+ else:
200
+ row_values = [str(row)]
201
+
202
+ row_line = "|".join(value.ljust(col_widths[i]) for i, value in enumerate(row_values))
203
+ lines.append(row_line)
204
+
205
+ return "\n".join(lines)
206
+
207
+
208
+ def format_error_output(error: Exception, verbose: bool = False) -> str:
209
+ """
210
+ 格式化错误输出
211
+
212
+ Args:
213
+ error: 异常对象
214
+ verbose: 是否显示详细信息
215
+
216
+ Returns:
217
+ str: 格式化的错误信息
218
+ """
219
+ if verbose:
220
+ import traceback
221
+ return f"Error: {str(error)}\n\nTraceback:\n{traceback.format_exc()}"
222
+ else:
223
+ return f"Error: {str(error)}"
224
+
225
+
226
+ def format_progress_output(current: int, total: int, description: str = "") -> str:
227
+ """
228
+ 格式化进度输出
229
+
230
+ Args:
231
+ current: 当前进度
232
+ total: 总数
233
+ description: 描述
234
+
235
+ Returns:
236
+ str: 格式化的进度信息
237
+ """
238
+ if total == 0:
239
+ percentage = 100
240
+ else:
241
+ percentage = min(100, int((current / total) * 100))
242
+
243
+ bar_length = 30
244
+ filled_length = int(bar_length * percentage // 100)
245
+ bar = "█" * filled_length + "-" * (bar_length - filled_length)
246
+
247
+ return f"{description} [{bar}] {percentage}% ({current}/{total})"
@@ -0,0 +1,54 @@
1
+ """
2
+ 流式输出格式化模块
3
+
4
+ 提供流式输出的格式化功能。
5
+ """
6
+
7
+ import json
8
+ from typing import AsyncIterator, Any
9
+
10
+ from ..models.responses import StreamEvent
11
+
12
+
13
+ async def format_stream_output(stream: AsyncIterator[Any], output_format: str = "stream-json") -> AsyncIterator[str]:
14
+ """
15
+ 格式化流式输出
16
+
17
+ Args:
18
+ stream: 输入流
19
+ output_format: 输出格式
20
+
21
+ Yields:
22
+ str: 格式化后的内容
23
+ """
24
+ if output_format == "stream-json":
25
+ # 发送开始事件
26
+ start_event = StreamEvent.start_event()
27
+ yield start_event.to_json()
28
+
29
+ try:
30
+ async for item in stream:
31
+ if isinstance(item, StreamEvent):
32
+ # 直接输出 StreamEvent
33
+ yield item.to_json()
34
+ elif hasattr(item, 'to_dict'):
35
+ # 直接输出有to_dict方法的对象
36
+ yield json.dumps(item.to_dict(), ensure_ascii=False)
37
+ else:
38
+ # 包装普通内容为content事件
39
+ content_event = StreamEvent.content_event(str(item))
40
+ yield content_event.to_json()
41
+
42
+ # 发送结束事件
43
+ end_event = StreamEvent.end_event()
44
+ yield end_event.to_json()
45
+
46
+ except Exception as e:
47
+ # 发送错误事件
48
+ error_event = StreamEvent.error_event(str(e))
49
+ yield error_event.to_json()
50
+ else:
51
+ # 其他格式,直接输出
52
+ from .output import format_output
53
+ async for item in stream:
54
+ yield format_output(item, "text")
@@ -3,17 +3,18 @@
3
3
  """
4
4
  Auto-Coder SDK 数据模型
5
5
 
6
- 包含所有数据结构定义,提供类型安全的接口。
6
+ 定义SDK中使用的各种数据模型。
7
7
  """
8
8
 
9
9
  from .options import AutoCodeOptions
10
- from .messages import Message
11
- from .responses import CLIResult, SessionInfo
10
+ from .responses import StreamEvent, CLIResult, SessionInfo, QueryResult, CodeModificationResult
12
11
 
13
12
  __all__ = [
14
13
  "AutoCodeOptions",
15
- "Message",
14
+ "StreamEvent",
16
15
  "CLIResult",
17
- "SessionInfo"
16
+ "SessionInfo",
17
+ "QueryResult",
18
+ "CodeModificationResult"
18
19
  ]
19
20
 
@@ -21,6 +21,7 @@ from ..constants import (
21
21
  ALLOWED_TOOLS
22
22
  )
23
23
  from ..exceptions import ValidationError
24
+ from autocoder.common.international import get_message_with_format
24
25
 
25
26
 
26
27
  @dataclass
@@ -30,6 +31,7 @@ class AutoCodeOptions:
30
31
  # 基础配置
31
32
  max_turns: int = DEFAULT_MAX_TURNS
32
33
  system_prompt: Optional[str] = None
34
+ system_prompt_path: Optional[str] = None
33
35
  cwd: Optional[Union[str, Path]] = None
34
36
 
35
37
  # 工具和权限配置
@@ -52,7 +54,14 @@ class AutoCodeOptions:
52
54
  timeout: int = 30
53
55
  verbose: bool = False
54
56
  include_project_structure: bool = True
57
+ include_rules: bool = False # 是否包含规则文件
55
58
  pr: bool = False # 是否创建 PR
59
+ cancel_token: Optional[str] = None # 取消令牌
60
+ is_sub_agent: bool = False # 是否为子代理模式,避免conversation冲突
61
+ loop: int = 1 # 循环执行次数,默认为1
62
+ loop_keep_conversation: bool = False # 循环时是否保持对话连续性
63
+ loop_additional_prompt: Optional[str] = None # 循环时的额外提示,可自定义
64
+ include_libs: List[str] = field(default_factory=list) # 要包含的LLM friendly packages列表
56
65
 
57
66
  def __post_init__(self):
58
67
  """初始化后验证"""
@@ -60,27 +69,22 @@ class AutoCodeOptions:
60
69
  self.validate()
61
70
 
62
71
  def validate(self) -> None:
63
- """验证配置选项"""
64
-
65
- # 验证max_turns(-1表示不限制)
66
- if self.max_turns <= 0 and self.max_turns != -1:
67
- raise ValidationError("max_turns", "must be positive integer or -1 (unlimited)")
68
-
69
- if self.max_turns > 100 and self.max_turns != -1:
70
- raise ValidationError("max_turns", "cannot exceed 100 (unless -1 for unlimited)")
71
-
72
+ """验证配置选项"""
72
73
  # 验证output_format
73
74
  if self.output_format not in OUTPUT_FORMATS:
74
75
  raise ValidationError(
75
76
  "output_format",
76
- f"must be one of: {', '.join(OUTPUT_FORMATS.keys())}"
77
+ get_message_with_format("validation_output_format_invalid", valid_formats=', '.join(OUTPUT_FORMATS.keys()))
77
78
  )
78
79
 
80
+ # stream-json 格式建议开启verbose以获得实时输出
81
+ # 但不强制要求,JSON格式可以在非verbose模式下正常工作
82
+
79
83
  # 验证permission_mode
80
84
  if self.permission_mode not in PERMISSION_MODES:
81
85
  raise ValidationError(
82
86
  "permission_mode",
83
- f"must be one of: {', '.join(PERMISSION_MODES.keys())}"
87
+ get_message_with_format("validation_permission_mode_invalid", valid_modes=', '.join(PERMISSION_MODES.keys()))
84
88
  )
85
89
 
86
90
  # 验证allowed_tools
@@ -89,25 +93,42 @@ class AutoCodeOptions:
89
93
  if invalid_tools:
90
94
  raise ValidationError(
91
95
  "allowed_tools",
92
- f"invalid tools: {', '.join(invalid_tools)}. "
93
- f"Valid tools: {', '.join(ALLOWED_TOOLS)}"
96
+ get_message_with_format("validation_allowed_tools_invalid",
97
+ invalid_tools=', '.join(invalid_tools),
98
+ valid_tools=', '.join(ALLOWED_TOOLS))
94
99
  )
95
100
 
96
101
  # 验证temperature
97
102
  if not 0.0 <= self.temperature <= 2.0:
98
- raise ValidationError("temperature", "must be between 0.0 and 2.0")
103
+ raise ValidationError("temperature", get_message_with_format("validation_temperature_range"))
99
104
 
100
105
  # 验证timeout
101
106
  if self.timeout <= 0:
102
- raise ValidationError("timeout", "must be positive integer")
107
+ raise ValidationError("timeout", get_message_with_format("validation_timeout_positive"))
108
+
109
+ # 验证循环次数
110
+ if self.loop <= 0:
111
+ raise ValidationError("loop", f"Loop count must be positive, got {self.loop}")
103
112
 
104
113
  # 验证cwd
105
114
  if self.cwd is not None:
106
115
  cwd_path = Path(self.cwd)
107
116
  if not cwd_path.exists():
108
- raise ValidationError("cwd", f"directory does not exist: {self.cwd}")
117
+ raise ValidationError("cwd", get_message_with_format("validation_cwd_not_exist", path=self.cwd))
109
118
  if not cwd_path.is_dir():
110
- raise ValidationError("cwd", f"path is not a directory: {self.cwd}")
119
+ raise ValidationError("cwd", get_message_with_format("validation_cwd_not_directory", path=self.cwd))
120
+
121
+ # 验证 system_prompt 和 system_prompt_path 的互斥性
122
+ if self.system_prompt and self.system_prompt_path:
123
+ raise ValidationError("system_prompt", "只能配置 system_prompt 或 system_prompt_path 中的一个,不能同时配置两个")
124
+
125
+ # 验证 system_prompt_path 文件存在性
126
+ if self.system_prompt_path is not None:
127
+ prompt_path = Path(self.system_prompt_path)
128
+ if not prompt_path.exists():
129
+ raise ValidationError("system_prompt_path", f"系统提示文件不存在: {self.system_prompt_path}")
130
+ if not prompt_path.is_file():
131
+ raise ValidationError("system_prompt_path", f"系统提示路径不是文件: {self.system_prompt_path}")
111
132
 
112
133
  def _normalize_values(self) -> None:
113
134
  """标准化配置值"""
@@ -131,6 +152,7 @@ class AutoCodeOptions:
131
152
  return {
132
153
  "max_turns": self.max_turns,
133
154
  "system_prompt": self.system_prompt,
155
+ "system_prompt_path": self.system_prompt_path,
134
156
  "cwd": self.cwd,
135
157
  "allowed_tools": self.allowed_tools,
136
158
  "permission_mode": self.permission_mode,
@@ -142,7 +164,14 @@ class AutoCodeOptions:
142
164
  "timeout": self.timeout,
143
165
  "verbose": self.verbose,
144
166
  "include_project_structure": self.include_project_structure,
145
- "pr": self.pr
167
+ "include_rules": self.include_rules,
168
+ "pr": self.pr,
169
+ "cancel_token": self.cancel_token,
170
+ "is_sub_agent": self.is_sub_agent,
171
+ "loop": self.loop,
172
+ "loop_keep_conversation": self.loop_keep_conversation,
173
+ "loop_additional_prompt": self.loop_additional_prompt,
174
+ "include_libs": self.include_libs
146
175
  }
147
176
 
148
177
  @classmethod
@@ -170,6 +199,8 @@ class AutoCodeOptions:
170
199
  data["max_turns"] = other.max_turns
171
200
  if other.system_prompt is not None:
172
201
  data["system_prompt"] = other.system_prompt
202
+ if other.system_prompt_path is not None:
203
+ data["system_prompt_path"] = other.system_prompt_path
173
204
  if other.output_format != DEFAULT_OUTPUT_FORMAT:
174
205
  data["output_format"] = other.output_format
175
206
  if other.permission_mode != DEFAULT_PERMISSION_MODE:
@@ -186,10 +217,16 @@ class AutoCodeOptions:
186
217
  data["stream"] = other.stream
187
218
  if other.include_project_structure is not True:
188
219
  data["include_project_structure"] = other.include_project_structure
220
+ if other.include_rules is not False:
221
+ data["include_rules"] = other.include_rules
189
222
  if other.session_id is not None:
190
223
  data["session_id"] = other.session_id
191
224
  if other.allowed_tools != []:
192
225
  data["allowed_tools"] = other.allowed_tools
226
+ if other.cancel_token is not None:
227
+ data["cancel_token"] = other.cancel_token
228
+ if other.is_sub_agent is not False:
229
+ data["is_sub_agent"] = other.is_sub_agent
193
230
 
194
231
  return self.from_dict(data)
195
232