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

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

Potentially problematic release.


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

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ 专门测试消息ID裁剪逻辑的验证脚本
4
+
5
+ 只测试 _apply_message_ids_pruning 方法,不受 token 阈值限制影响
6
+
7
+ 支持的消息ID格式:
8
+ 1. 直接字段格式: {"message_id": "9226b3a4-1234-5678-9abc-def012345678"}
9
+ 2. Hint嵌入格式: {"content": "消息内容 [[message_id: 9226b3a4]]"}
10
+ 3. 兼容格式: {"content": "消息内容 message_id: 9226b3a4"}
11
+ """
12
+
13
+ import sys
14
+ import os
15
+ from datetime import datetime
16
+
17
+ # 添加src路径到Python路径
18
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../..'))
19
+
20
+ from autocoder.common.pruner.agentic_conversation_pruner import AgenticConversationPruner
21
+ from autocoder.common.pruner.conversation_message_ids_api import get_conversation_message_ids_api
22
+ from autocoder.common import AutoCoderArgs
23
+ from autocoder.sdk import get_llm
24
+
25
+
26
+ def test_message_ids_pruning_logic():
27
+ """直接测试消息ID裁剪逻辑"""
28
+
29
+ print("🧪 消息ID裁剪逻辑专项测试")
30
+ print(f"📅 测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
31
+ print("=" * 80)
32
+
33
+ # 使用已知的会话ID
34
+ conversation_id = "796e1c2e-1ab8-46d1-9448-f9bd29d5c095"
35
+
36
+ # 创建测试数据,包含要删除的消息ID
37
+ # 展示两种消息ID格式的支持
38
+ test_conversations = [
39
+ {
40
+ "role": "system",
41
+ "content": "You are a helpful assistant.",
42
+ "message_id": "12345678abcdef01" # 格式1: 直接字段格式(完整UUID)
43
+ },
44
+ {
45
+ "role": "user",
46
+ "content": "Hello, can you help me with some code? [[message_id: 87654321]]", # 格式2: 标准hint格式
47
+ "message_id": "87654321fedcba02" # 同时测试优先级(字段优先)
48
+ },
49
+ {
50
+ "role": "assistant",
51
+ "content": "Of course! I'd be happy to help you with your code. What do you need assistance with?",
52
+ "message_id": "642f04ee11223344" # 格式1: 这个消息ID应该被删除
53
+ },
54
+ {
55
+ "role": "user",
56
+ "content": "I want to read a file and analyze it. message_id: 13579bdf", # 格式2: 兼容hint格式
57
+ # 没有message_id字段,只从content中提取
58
+ },
59
+ {
60
+ "role": "assistant",
61
+ "content": "I'll help you read and analyze the file. [[message_id: 97531eca]]", # 格式2: 标准hint格式
62
+ # 没有message_id字段,只从content中提取
63
+ }
64
+ ]
65
+
66
+ print("📋 测试数据:")
67
+ for i, conv in enumerate(test_conversations, 1):
68
+ role = conv.get("role", "unknown")
69
+ message_id = conv.get("message_id", "no_id")[:8]
70
+ content = conv.get("content", "")[:50] + "..." if len(conv.get("content", "")) > 50 else conv.get("content", "")
71
+ print(f" {i}. [{role:9}] {message_id} | {content}")
72
+
73
+ # 查询消息ID配置
74
+ api = get_conversation_message_ids_api()
75
+ message_ids_config = api.get_conversation_message_ids(conversation_id)
76
+
77
+ if not message_ids_config:
78
+ print(f"❌ 未找到会话ID {conversation_id} 的消息删除配置")
79
+ return False
80
+
81
+ print(f"\n✅ 消息ID配置:")
82
+ print(f" 要删除的消息ID: {message_ids_config.message_ids}")
83
+ print(f" 保持成对删除: {message_ids_config.preserve_pairs}")
84
+
85
+ # 创建裁剪器
86
+ args = AutoCoderArgs(
87
+ source_dir=".",
88
+ conversation_prune_safe_zone_tokens=1000,
89
+ context_prune=True,
90
+ context_prune_strategy="extract",
91
+ query="测试消息ID裁剪逻辑"
92
+ )
93
+ llm = get_llm("v3_chat", product_mode="lite")
94
+
95
+ # 创建裁剪器
96
+ from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
97
+
98
+ # 设置当前对话ID
99
+ conversation_manager = get_conversation_manager()
100
+ conversation_manager.set_current_conversation(conversation_id)
101
+
102
+ # 创建AgenticConversationPruner实例并执行测试
103
+ pruner = AgenticConversationPruner(args=args, llm=llm, conversation_id=conversation_id)
104
+
105
+ # 直接测试消息ID裁剪逻辑
106
+ print(f"\n🚀 执行消息ID裁剪:")
107
+
108
+ try:
109
+ # 由于 _apply_message_ids_pruning 是私有方法,我们通过完整流程测试但强制低token阈值
110
+ # 设置一个极小的token阈值来强制触发裁剪逻辑
111
+ args.conversation_prune_safe_zone_tokens = 1 # 极小值,确保触发
112
+
113
+ # 使用完整的 prune_conversations 方法
114
+ pruned_conversations = pruner.prune_conversations(test_conversations)
115
+
116
+ print(f"\n📊 裁剪结果:")
117
+ print(f" 原始消息数量: {len(test_conversations)}")
118
+ print(f" 裁剪后数量: {len(pruned_conversations)}")
119
+ print(f" 删除的消息数: {len(test_conversations) - len(pruned_conversations)}")
120
+
121
+ # 检查具体被删除的消息
122
+ original_ids = [conv.get("message_id", "")[:8] for conv in test_conversations]
123
+ pruned_ids = [conv.get("message_id", "")[:8] for conv in pruned_conversations]
124
+ deleted_ids = [msg_id for msg_id in original_ids if msg_id not in pruned_ids]
125
+ remaining_ids = pruned_ids
126
+
127
+ print(f"\n🔍 详细分析:")
128
+ print(f" 原始消息ID: {original_ids}")
129
+ print(f" 删除的消息ID: {deleted_ids}")
130
+ print(f" 保留的消息ID: {remaining_ids}")
131
+
132
+ # 验证目标消息ID是否被删除
133
+ target_id = "642f04ee"
134
+ if target_id in deleted_ids:
135
+ print(f" ✅ 目标消息ID {target_id} 已成功删除")
136
+ else:
137
+ print(f" ❌ 目标消息ID {target_id} 未被删除")
138
+ return False
139
+
140
+ # 验证成对删除逻辑
141
+ if message_ids_config.preserve_pairs:
142
+ print(f"\n🔗 成对删除验证:")
143
+ if "87654321" in deleted_ids and "642f04ee" in deleted_ids:
144
+ print(f" ✅ 成对删除正确:user消息 87654321 和 assistant消息 642f04ee 都被删除")
145
+ else:
146
+ print(f" ⚠️ 成对删除检查:删除的消息ID = {deleted_ids}")
147
+
148
+ # 显示裁剪后的消息列表
149
+ print(f"\n📋 裁剪后的消息:")
150
+ for i, conv in enumerate(pruned_conversations, 1):
151
+ role = conv.get("role", "unknown")
152
+ message_id = conv.get("message_id", "no_id")[:8]
153
+ content = conv.get("content", "")[:50] + "..." if len(conv.get("content", "")) > 50 else conv.get("content", "")
154
+ print(f" {i}. [{role:9}] {message_id} | {content}")
155
+
156
+ # 获取裁剪统计信息
157
+ stats = pruner.get_pruning_statistics()
158
+ if stats["range_pruning"]["applied"]:
159
+ print(f"\n📈 裁剪统计:")
160
+ print(f" 消息ID裁剪已应用: {stats['range_pruning']['applied']}")
161
+ print(f" 消息ID裁剪成功: {stats['range_pruning']['success']}")
162
+ print(f" 总压缩比: {stats['compression']['total_compression_ratio']:.2%}")
163
+
164
+ return True
165
+
166
+ except Exception as e:
167
+ print(f"❌ 消息ID裁剪测试失败: {str(e)}")
168
+ import traceback
169
+ traceback.print_exc()
170
+ return False
171
+
172
+
173
+ def main():
174
+ """主函数"""
175
+ success = test_message_ids_pruning_logic()
176
+
177
+ print(f"\n🎯 测试结果: {'✅ 通过' if success else '❌ 失败'}")
178
+
179
+ if success:
180
+ print("\n🎉 消息ID裁剪逻辑工作正常!")
181
+ print(" - 消息ID匹配正确")
182
+ print(" - 成对删除逻辑有效")
183
+ print(" - 裁剪算法运行正常")
184
+ else:
185
+ print("\n⚠️ 消息ID裁剪逻辑存在问题,请检查相关代码")
186
+
187
+ return success
188
+
189
+
190
+ if __name__ == "__main__":
191
+ success = main()
192
+ sys.exit(0 if success else 1)
@@ -21,7 +21,8 @@ from .utils import (
21
21
  parse_git_url, detect_platform_from_repo, get_repo_info_from_path,
22
22
  get_current_branch, branch_exists, is_git_repo, get_default_remote_branch,
23
23
  ensure_branch_exists_remotely, is_main_branch, create_and_checkout_branch,
24
- generate_auto_branch_name
24
+ generate_auto_branch_name, has_uncommitted_changes, auto_commit_changes,
25
+ ensure_branch_has_commits
25
26
  )
26
27
 
27
28
 
@@ -92,6 +93,13 @@ def create_pull_request(
92
93
  if source_branch == target_branch:
93
94
  raise ValidationError(f"源分支和目标分支不能相同: {source_branch}")
94
95
 
96
+ # 确保分支有提交,如果没有则自动提交更改
97
+ if not ensure_branch_has_commits(repo_path, source_branch, auto_commit=True):
98
+ raise ValidationError(
99
+ f"分支 '{source_branch}' 没有提交且无法自动提交更改。"
100
+ f"请确保有需要提交的更改或手动提交后再创建PR。"
101
+ )
102
+
95
103
  # 确保源分支存在于远程仓库,如果不存在则自动推送
96
104
  if not ensure_branch_exists_remotely(repo_path, source_branch):
97
105
  raise BranchNotFoundError(
@@ -325,6 +325,127 @@ def validate_repo_path(repo_path: str) -> str:
325
325
  return str(path)
326
326
 
327
327
 
328
+ def has_uncommitted_changes(repo_path: str) -> bool:
329
+ """检查是否有未提交的更改"""
330
+ try:
331
+ # 检查工作区是否有未暂存的更改
332
+ result = subprocess.run(
333
+ ['git', 'diff', '--quiet'],
334
+ cwd=repo_path,
335
+ capture_output=True
336
+ )
337
+ has_unstaged = result.returncode != 0
338
+
339
+ # 检查暂存区是否有未提交的更改
340
+ result = subprocess.run(
341
+ ['git', 'diff', '--cached', '--quiet'],
342
+ cwd=repo_path,
343
+ capture_output=True
344
+ )
345
+ has_staged = result.returncode != 0
346
+
347
+ return has_unstaged or has_staged
348
+ except subprocess.CalledProcessError:
349
+ return False
350
+
351
+
352
+ def get_uncommitted_files(repo_path: str) -> list:
353
+ """获取未提交的文件列表"""
354
+ try:
355
+ result = subprocess.run(
356
+ ['git', 'status', '--porcelain'],
357
+ cwd=repo_path,
358
+ capture_output=True,
359
+ text=True,
360
+ check=True
361
+ )
362
+ lines = result.stdout.strip().split('\n')
363
+ return [line.strip() for line in lines if line.strip()]
364
+ except subprocess.CalledProcessError:
365
+ return []
366
+
367
+
368
+ def auto_commit_changes(repo_path: str, commit_message: str = None) -> bool:
369
+ """自动提交所有更改"""
370
+ try:
371
+ # 检查是否有更改
372
+ if not has_uncommitted_changes(repo_path):
373
+ logger.info("没有需要提交的更改")
374
+ return True
375
+
376
+ # 获取未提交的文件列表用于日志
377
+ uncommitted_files = get_uncommitted_files(repo_path)
378
+ logger.info(f"发现 {len(uncommitted_files)} 个未提交的更改")
379
+
380
+ # 添加所有更改到暂存区
381
+ logger.info("正在添加所有更改到暂存区...")
382
+ subprocess.run(
383
+ ['git', 'add', '.'],
384
+ cwd=repo_path,
385
+ check=True
386
+ )
387
+
388
+ # 生成提交消息
389
+ if not commit_message:
390
+ current_branch = get_current_branch(repo_path)
391
+ if current_branch and current_branch.startswith('ac-'):
392
+ commit_message = f"Auto-commit changes for PR from {current_branch}"
393
+ else:
394
+ commit_message = "Auto-commit changes for PR creation"
395
+
396
+ # 提交更改
397
+ logger.info(f"正在提交更改: {commit_message}")
398
+ subprocess.run(
399
+ ['git', 'commit', '-m', commit_message],
400
+ cwd=repo_path,
401
+ check=True
402
+ )
403
+
404
+ logger.info("✓ 成功提交所有更改")
405
+ return True
406
+
407
+ except subprocess.CalledProcessError as e:
408
+ logger.error(f"自动提交失败: {e}")
409
+ return False
410
+
411
+
412
+ def ensure_branch_has_commits(repo_path: str, branch_name: str, auto_commit: bool = True) -> bool:
413
+ """确保分支有提交,如果没有则自动提交更改"""
414
+ try:
415
+ # 检查分支是否有提交(相对于目标分支的差异)
416
+ result = subprocess.run(
417
+ ['git', 'rev-list', '--count', f'origin/main..{branch_name}'],
418
+ cwd=repo_path,
419
+ capture_output=True,
420
+ text=True,
421
+ check=True
422
+ )
423
+ commit_count = int(result.stdout.strip())
424
+
425
+ if commit_count > 0:
426
+ logger.info(f"分支 '{branch_name}' 已有 {commit_count} 个提交")
427
+ return True
428
+
429
+ # 如果没有提交,检查是否有未提交的更改
430
+ if has_uncommitted_changes(repo_path):
431
+ if auto_commit:
432
+ logger.info(f"分支 '{branch_name}' 没有提交但有未提交的更改,正在自动提交...")
433
+ return auto_commit_changes(repo_path)
434
+ else:
435
+ logger.warning(f"分支 '{branch_name}' 没有提交且有未提交的更改,但未启用自动提交")
436
+ return False
437
+ else:
438
+ logger.warning(f"分支 '{branch_name}' 没有提交也没有更改")
439
+ return False
440
+
441
+ except subprocess.CalledProcessError as e:
442
+ logger.error(f"检查分支提交状态失败: {e}")
443
+ # 如果检查失败,尝试自动提交(如果有更改的话)
444
+ if auto_commit and has_uncommitted_changes(repo_path):
445
+ return auto_commit_changes(repo_path)
446
+ return False
447
+
448
+
328
449
  def build_pr_url(platform: PlatformType, repo_info: RepoInfo, pr_number: int) -> str:
329
450
  """构建PR的Web URL"""
330
451
  base_urls = {
@@ -341,4 +462,4 @@ def build_pr_url(platform: PlatformType, repo_info: RepoInfo, pr_number: int) ->
341
462
  if platform == PlatformType.GITLAB or platform == PlatformType.GITCODE:
342
463
  return f"{base_url}/{repo_info.full_name}/-/merge_requests/{pr_number}"
343
464
  else:
344
- return f"{base_url}/{repo_info.full_name}/pull/{pr_number}"
465
+ return f"{base_url}/{repo_info.full_name}/pull/{pr_number}"
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import json
3
- from typing import List, Dict, Any, Optional
3
+ from typing import List, Optional
4
+ from pathlib import Path
4
5
  from pydantic import BaseModel
5
6
  from autocoder.common import AutoCoderArgs
6
7
  from loguru import logger
@@ -16,42 +17,37 @@ class RAGConfig(BaseModel):
16
17
 
17
18
  class RAGManager:
18
19
  """RAG 管理器,用于读取和管理 RAG 服务器配置"""
19
-
20
+
20
21
  def __init__(self, args: AutoCoderArgs):
21
22
  self.args = args
22
23
  self.configs: List[RAGConfig] = []
23
24
  self._load_configs()
24
-
25
+
25
26
  def _load_configs(self):
26
27
  """加载 RAG 配置,优先从项目配置,然后从全局配置"""
27
28
  # 优先读取项目级别配置
28
- project_config_path = os.path.join(
29
- self.args.source_dir,
30
- ".auto-coder",
31
- "auto-coder.web",
32
- "rags",
33
- "rags.json"
34
- )
35
-
36
- if os.path.exists(project_config_path):
29
+ base_path = Path(self.args.source_dir) if self.args.source_dir else Path.cwd()
30
+ project_config_path = base_path / ".auto-coder" / "auto-coder.web" / "rags" / "rags.json"
31
+
32
+ if project_config_path.exists():
37
33
  logger.info(f"正在加载项目级别 RAG 配置: {project_config_path}")
38
- self._load_project_config(project_config_path)
34
+ self._load_project_config(str(project_config_path))
39
35
  else:
40
36
  logger.info("未找到项目级别 RAG 配置,尝试加载全局配置")
41
- # 读取全局配置
42
- global_config_path = os.path.expanduser("~/.auto-coder/keys/rags.json")
43
- if os.path.exists(global_config_path):
37
+ # 读取全局配置(使用 pathlib 确保跨平台兼容性)
38
+ global_config_path = Path.home() / ".auto-coder" / "keys" / "rags.json"
39
+ if global_config_path.exists():
44
40
  logger.info(f"正在加载全局 RAG 配置: {global_config_path}")
45
- self._load_global_config(global_config_path)
41
+ self._load_global_config(str(global_config_path))
46
42
  else:
47
43
  logger.warning("未找到任何 RAG 配置文件")
48
-
44
+
49
45
  def _load_project_config(self, config_path: str):
50
46
  """加载项目级别的 RAG 配置"""
51
47
  try:
52
48
  with open(config_path, 'r', encoding='utf-8') as f:
53
49
  config_data = json.load(f)
54
-
50
+
55
51
  if "data" in config_data and isinstance(config_data["data"], list):
56
52
  for item in config_data["data"]:
57
53
  try:
@@ -67,18 +63,18 @@ class RAGManager:
67
63
  logger.error(f"解析项目级别 RAG 配置项时出错: {e}, 配置项: {item}")
68
64
  else:
69
65
  logger.error(f"项目级别 RAG 配置格式错误,缺少 'data' 字段或 'data' 不是列表")
70
-
66
+
71
67
  except json.JSONDecodeError as e:
72
68
  logger.error(f"项目级别 RAG 配置文件 JSON 格式错误: {e}")
73
69
  except Exception as e:
74
70
  logger.error(f"读取项目级别 RAG 配置文件时出错: {e}")
75
-
71
+
76
72
  def _load_global_config(self, config_path: str):
77
73
  """加载全局级别的 RAG 配置"""
78
74
  try:
79
75
  with open(config_path, 'r', encoding='utf-8') as f:
80
76
  config_data = json.load(f)
81
-
77
+
82
78
  if "data" in config_data and isinstance(config_data["data"], list):
83
79
  for item in config_data["data"]:
84
80
  try:
@@ -94,49 +90,49 @@ class RAGManager:
94
90
  logger.error(f"解析全局 RAG 配置项时出错: {e}, 配置项: {item}")
95
91
  else:
96
92
  logger.error(f"全局 RAG 配置格式错误,缺少 'data' 字段或 'data' 不是列表")
97
-
93
+
98
94
  except json.JSONDecodeError as e:
99
95
  logger.error(f"全局 RAG 配置文件 JSON 格式错误: {e}")
100
96
  except Exception as e:
101
97
  logger.error(f"读取全局 RAG 配置文件时出错: {e}")
102
-
98
+
103
99
  def get_all_configs(self) -> List[RAGConfig]:
104
100
  """获取所有 RAG 配置"""
105
101
  return self.configs
106
-
102
+
107
103
  def get_config_by_name(self, name: str) -> Optional[RAGConfig]:
108
104
  """根据名称获取特定的 RAG 配置"""
109
105
  for config in self.configs:
110
106
  if config.name == name:
111
107
  return config
112
108
  return None
113
-
109
+
114
110
  def get_server_names(self) -> List[str]:
115
111
  """获取所有服务器名称列表"""
116
112
  return [config.server_name for config in self.configs]
117
-
113
+
118
114
  def get_config_info(self) -> str:
119
115
  """获取格式化的配置信息,用于显示"""
120
116
  if not self.configs:
121
- return "未找到可用的 RAG 服务器配置"
122
-
117
+ return "### RAG_SERVER_LIST\n No available RAG server configurations found"
118
+
123
119
  info_lines = []
124
- info_lines.append("可用的 RAG 服务器配置")
125
-
120
+ info_lines.append("### RAG_SERVER_LIST\nAvailable RAG server configurations")
121
+
126
122
  for i, config in enumerate(self.configs, 1):
127
- info_lines.append(f"\n{i}. 配置名称: {config.name}")
128
- info_lines.append(f" 服务器地址: {config.server_name}")
129
-
123
+ info_lines.append(f"\n{i}. Configuration name: {config.name}")
124
+ info_lines.append(f" Server address: {config.server_name}")
125
+
130
126
  if config.description:
131
- info_lines.append(f" 描述信息: {config.description}")
127
+ info_lines.append(f" Description: {config.description}")
132
128
  else:
133
- info_lines.append(f" 描述信息: ")
134
-
129
+ info_lines.append(f" Description: None")
130
+
135
131
  if i < len(self.configs):
136
132
  info_lines.append("-" * 30)
137
-
133
+
138
134
  return "\n".join(info_lines)
139
-
135
+
140
136
  def has_configs(self) -> bool:
141
137
  """检查是否有可用的配置"""
142
- return len(self.configs) > 0
138
+ return len(self.configs) > 0
@@ -4,12 +4,64 @@
4
4
  AutoCoder 规则文件管理模块
5
5
 
6
6
  提供读取、解析和监控 AutoCoder 规则文件的功能。
7
+
8
+ 重构后的模块结构:
9
+ - models/: 数据模型 (RuleFile, RuleRelevance, AlwaysApplyRuleSummary, ConditionalRulesIndex)
10
+ - core/: 核心功能 (AutocoderRulesManager, RuleSelector)
11
+ - utils/: 工具函数 (parser, monitor)
12
+ - api.py: 统一的 API 接口
7
13
  """
8
14
 
9
- from .autocoderrules_utils import (
15
+ # 导入数据模型
16
+ from .models import (
17
+ RuleFile,
18
+ RuleRelevance,
19
+ AlwaysApplyRuleSummary,
20
+ ConditionalRulesIndex,
21
+ InitRule,
22
+ )
23
+
24
+ # 导入核心组件
25
+ from .core import (
26
+ AutocoderRulesManager,
27
+ RuleSelector,
28
+ )
29
+
30
+ # 导入公共 API 函数
31
+ from .api import (
10
32
  get_rules,
33
+ get_parsed_rules,
34
+ parse_rule_file,
35
+ reset_rules_manager,
36
+ auto_select_rules,
37
+ get_required_and_index_rules,
38
+ generate_always_apply_summary,
39
+ generate_conditional_rules_index,
40
+ init_rule,
41
+ get_rules_for_conversation,
11
42
  )
12
43
 
13
44
  __all__ = [
45
+ # 数据模型
46
+ 'RuleFile',
47
+ 'RuleRelevance',
48
+ 'AlwaysApplyRuleSummary',
49
+ 'ConditionalRulesIndex',
50
+ 'InitRule',
51
+
52
+ # 核心组件
53
+ 'AutocoderRulesManager',
54
+ 'RuleSelector',
55
+
56
+ # 公共 API 函数
14
57
  'get_rules',
58
+ 'get_parsed_rules',
59
+ 'parse_rule_file',
60
+ 'reset_rules_manager',
61
+ 'auto_select_rules',
62
+ 'get_required_and_index_rules',
63
+ 'generate_always_apply_summary',
64
+ 'generate_conditional_rules_index',
65
+ 'init_rule',
66
+ 'get_rules_for_conversation',
15
67
  ]