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
@@ -1,6 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
- from typing import Any, Dict, Optional
3
- from autocoder.common.v2.agent.agentic_edit_types import BaseTool, ToolResult # Import ToolResult from types
2
+ from typing import Optional
3
+ from autocoder.common.v2.agent.agentic_edit_types import BaseTool, ToolResult
4
4
  from autocoder.common import AutoCoderArgs
5
5
  import typing
6
6
 
@@ -0,0 +1,214 @@
1
+ """
2
+ Conversation Message IDs Read Tool Resolver
3
+
4
+ This resolver handles reading existing conversation message IDs configurations.
5
+ It retrieves the current message IDs settings for the active conversation.
6
+ """
7
+
8
+ import os
9
+ from typing import Optional
10
+ from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
11
+ from autocoder.common.v2.agent.agentic_edit_types import ConversationMessageIdsReadTool, ToolResult
12
+ from autocoder.common import AutoCoderArgs
13
+ from autocoder.common.pruner import get_conversation_message_ids_api
14
+ from loguru import logger
15
+ import typing
16
+
17
+ if typing.TYPE_CHECKING:
18
+ from autocoder.common.v2.agent.agentic_edit import AgenticEdit
19
+
20
+
21
+ class ConversationMessageIdsReadToolResolver(BaseToolResolver):
22
+ """
23
+ Resolver for the ConversationMessageIdsReadTool.
24
+
25
+ This resolver handles reading existing conversation message IDs configurations
26
+ to show which messages are currently configured for deletion.
27
+ """
28
+
29
+ def __init__(self, agent: 'AgenticEdit', tool: ConversationMessageIdsReadTool, args: AutoCoderArgs):
30
+ super().__init__(agent, tool, args)
31
+ self.tool = tool
32
+
33
+ def resolve(self) -> ToolResult:
34
+ """
35
+ Read conversation message IDs configuration.
36
+
37
+ Returns:
38
+ ToolResult with configuration details or information about no configuration
39
+ """
40
+ try:
41
+ # Get current conversation ID
42
+ conversation_id = self.agent.conversation_config.conversation_id
43
+
44
+ if not conversation_id:
45
+ return ToolResult(
46
+ success=False,
47
+ message="无法获取当前会话ID",
48
+ content={
49
+ "error_type": "no_conversation_id",
50
+ "has_message_ids_config": False,
51
+ "message": "当前没有活跃的会话,无法读取消息ID配置"
52
+ }
53
+ )
54
+
55
+ # Get message IDs API
56
+ message_ids_api = get_conversation_message_ids_api(
57
+ storage_dir=self.args.range_storage_dir if hasattr(self.args, 'range_storage_dir') else None
58
+ )
59
+
60
+ # Get message IDs configuration for current conversation
61
+ message_ids_obj = message_ids_api.get_conversation_message_ids(conversation_id)
62
+
63
+ if message_ids_obj:
64
+ # Get detailed statistics
65
+ stats = message_ids_api.get_message_ids_statistics(conversation_id)
66
+
67
+ # Get message details with content preview
68
+ message_details = self._get_message_details_with_content(conversation_id, message_ids_obj.message_ids)
69
+
70
+ return ToolResult(
71
+ success=True,
72
+ message=f"找到会话 {conversation_id} 的消息ID配置",
73
+ content={
74
+ "conversation_id": conversation_id,
75
+ "has_message_ids_config": True,
76
+ "message_ids": message_details,
77
+ "description": message_ids_obj.description,
78
+ "preserve_pairs": message_ids_obj.preserve_pairs,
79
+ "created_at": message_ids_obj.created_at,
80
+ "updated_at": message_ids_obj.updated_at,
81
+ "statistics": stats,
82
+ "summary": f"当前配置了 {len(message_ids_obj.message_ids)} 个消息ID用于删除。配对保护: {'启用' if message_ids_obj.preserve_pairs else '禁用'}。"
83
+ }
84
+ )
85
+ else:
86
+ # No configuration found
87
+ # List all available configurations for reference
88
+ all_configs = message_ids_api.list_all_message_ids()
89
+ available_conversation_ids = [config.conversation_id for config in all_configs]
90
+
91
+ return ToolResult(
92
+ success=True,
93
+ message=f"会话 {conversation_id} 没有消息ID配置",
94
+ content={
95
+ "conversation_id": conversation_id,
96
+ "has_message_ids_config": False,
97
+ "message_ids": [],
98
+ "description": "",
99
+ "preserve_pairs": True,
100
+ "available_configurations": len(all_configs),
101
+ "available_conversation_ids": available_conversation_ids[:10], # 限制显示前10个
102
+ "summary": "当前会话没有配置删除消息ID。如需配置,请使用 conversation_message_ids_write 工具。"
103
+ }
104
+ )
105
+
106
+ except Exception as e:
107
+ error_msg = f"读取会话消息ID配置时发生异常: {str(e)}"
108
+ logger.error(error_msg)
109
+ return ToolResult(
110
+ success=False,
111
+ message=error_msg,
112
+ content={
113
+ "error_type": "exception",
114
+ "has_message_ids_config": False,
115
+ "error_message": str(e),
116
+ "conversation_id": getattr(self, '_conversation_id', 'unknown')
117
+ }
118
+ )
119
+
120
+ def _get_message_details_with_content(self, conversation_id: str, message_ids: list) -> list:
121
+ """
122
+ 获取消息ID对应的详细信息,包含消息内容前100个字符,按原始顺序排列
123
+
124
+ Args:
125
+ conversation_id: 会话ID
126
+ message_ids: 消息ID列表
127
+
128
+ Returns:
129
+ 包含消息详情的列表,每个元素包含id和content_preview字段
130
+ """
131
+ try:
132
+ # 获取会话管理器
133
+ from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
134
+ conversation_manager = get_conversation_manager()
135
+
136
+ # 获取会话中的所有消息
137
+ all_messages = conversation_manager.get_messages(conversation_id)
138
+
139
+ # 创建消息ID到消息的映射,保持原始顺序
140
+ message_map = {}
141
+ for msg in all_messages:
142
+ msg_id = msg.get('message_id', '')
143
+ if msg_id:
144
+ # 截取前8个字符用于匹配
145
+ short_id = msg_id[:8]
146
+ message_map[short_id] = {
147
+ 'full_id': msg_id,
148
+ 'content': msg.get('content', ''),
149
+ 'role': msg.get('role', ''),
150
+ 'timestamp': msg.get('timestamp', 0),
151
+ 'index': len(message_map) # 保存原始顺序索引
152
+ }
153
+
154
+ # 构建结果列表,保持配置中的顺序,但按conversation中的原始顺序排序
155
+ message_details = []
156
+ matched_messages = []
157
+
158
+ for config_id in message_ids:
159
+ if config_id in message_map:
160
+ msg_info = message_map[config_id]
161
+ matched_messages.append({
162
+ 'config_id': config_id,
163
+ 'msg_info': msg_info,
164
+ 'original_index': msg_info['index']
165
+ })
166
+ else:
167
+ # 如果消息ID不存在,仍然显示但标记为未找到
168
+ message_details.append({
169
+ 'id': config_id,
170
+ 'content_preview': '[消息未找到]',
171
+ 'role': 'unknown',
172
+ 'status': 'not_found'
173
+ })
174
+
175
+ # 按原始顺序排序匹配到的消息
176
+ matched_messages.sort(key=lambda x: x['original_index'])
177
+
178
+ # 构建最终结果
179
+ for match in matched_messages:
180
+ config_id = match['config_id']
181
+ msg_info = match['msg_info']
182
+ content = msg_info['content']
183
+
184
+ # 处理不同类型的content
185
+ if isinstance(content, str):
186
+ content_preview = content[:100]
187
+ elif isinstance(content, (dict, list)):
188
+ # 将复杂对象转换为字符串再截取
189
+ import json
190
+ try:
191
+ content_str = json.dumps(content, ensure_ascii=False)
192
+ content_preview = content_str[:100]
193
+ except:
194
+ content_preview = str(content)[:100]
195
+ else:
196
+ content_preview = str(content)[:100]
197
+
198
+ # 如果内容被截断,添加省略号
199
+ if len(str(content)) > 100:
200
+ content_preview += "..."
201
+
202
+ message_details.append({
203
+ 'id': config_id,
204
+ 'content_preview': content_preview,
205
+ 'role': msg_info['role'],
206
+ 'status': 'found'
207
+ })
208
+
209
+ return message_details
210
+
211
+ except Exception as e:
212
+ logger.error(f"获取消息详情时发生错误: {str(e)}")
213
+ # 如果出错,返回基本的ID列表
214
+ return [{'id': msg_id, 'content_preview': '[获取内容失败]', 'role': 'unknown', 'status': 'error'} for msg_id in message_ids]
@@ -0,0 +1,299 @@
1
+ """
2
+ Conversation Message IDs Write Tool Resolver
3
+
4
+ This resolver handles writing conversation message IDs configurations for pruning.
5
+ It integrates with the pruner module to store message ID specifications along with
6
+ the current conversation ID, supporting create, append, and delete actions.
7
+ """
8
+
9
+ import os
10
+ from typing import Optional
11
+ from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
12
+ from autocoder.common.v2.agent.agentic_edit_types import ConversationMessageIdsWriteTool, ToolResult
13
+ from autocoder.common import AutoCoderArgs
14
+ from autocoder.common.pruner import get_conversation_message_ids_api,ConversationMessageIdsAPI
15
+ from autocoder.common.international import get_message
16
+ from loguru import logger
17
+ import typing
18
+
19
+ from autocoder.rag.lang import get_message_with_format
20
+
21
+ if typing.TYPE_CHECKING:
22
+ from autocoder.common.v2.agent.agentic_edit import AgenticEdit
23
+
24
+
25
+ class ConversationMessageIdsWriteToolResolver(BaseToolResolver):
26
+ """
27
+ Resolver for the ConversationMessageIdsWriteTool.
28
+
29
+ This resolver handles writing conversation message IDs configurations that specify
30
+ which messages should be deleted during conversation pruning.
31
+ Supports create, append, and delete actions.
32
+ """
33
+
34
+ def __init__(self, agent: 'AgenticEdit', tool: ConversationMessageIdsWriteTool, args: AutoCoderArgs):
35
+ super().__init__(agent, tool, args)
36
+ self.tool = tool
37
+
38
+ def resolve(self) -> ToolResult:
39
+ """
40
+ Write conversation message IDs configuration.
41
+
42
+ Returns:
43
+ ToolResult with success status and configuration details
44
+ """
45
+ try:
46
+ # Validate action parameter
47
+ valid_actions = ["create", "append", "delete"]
48
+ if self.tool.action not in valid_actions:
49
+ return ToolResult(
50
+ success=False,
51
+ message=get_message_with_format("conversation_message_ids_invalid_action", action=self.tool.action),
52
+ content={
53
+ "error_type": "invalid_action",
54
+ "valid_actions": valid_actions,
55
+ "provided_action": self.tool.action
56
+ }
57
+ )
58
+
59
+ # Get current conversation ID
60
+ conversation_id = self.agent.conversation_config.conversation_id
61
+
62
+ if not conversation_id:
63
+ return ToolResult(
64
+ success=False,
65
+ message=get_message("conversation_message_ids_no_conversation"),
66
+ content={
67
+ "error_type": "no_conversation_id",
68
+ "message": get_message("conversation_message_ids_no_conversation")
69
+ }
70
+ )
71
+
72
+ # Get message IDs API
73
+ message_ids_api = get_conversation_message_ids_api(
74
+ storage_dir=self.args.range_storage_dir if hasattr(self.args, 'range_storage_dir') else None
75
+ )
76
+
77
+ # Handle different actions
78
+ if self.tool.action == "create":
79
+ return self._handle_create_action(message_ids_api, conversation_id)
80
+ elif self.tool.action == "append":
81
+ return self._handle_append_action(message_ids_api, conversation_id)
82
+ elif self.tool.action == "delete":
83
+ return self._handle_delete_action(message_ids_api, conversation_id)
84
+ else:
85
+ return ToolResult(
86
+ success=False,
87
+ message=get_message_with_format("conversation_message_ids_invalid_action", action=self.tool.action),
88
+ content={
89
+ "error_type": "unimplemented_action",
90
+ "action": self.tool.action
91
+ }
92
+ )
93
+
94
+ except Exception as e:
95
+ error_msg = get_message_with_format("conversation_message_ids_operation_exception", error=str(e))
96
+ logger.error(error_msg)
97
+ return ToolResult(
98
+ success=False,
99
+ message=error_msg,
100
+ content={
101
+ "error_type": "exception",
102
+ "error_message": str(e),
103
+ "tool_parameters": {
104
+ "message_ids": self.tool.message_ids,
105
+ "action": self.tool.action
106
+ }
107
+ }
108
+ )
109
+
110
+ def _handle_create_action(self, message_ids_api, conversation_id: str) -> ToolResult:
111
+ """Handle create action - create new configuration, replacing any existing one"""
112
+ # Save message IDs configuration with default preserve_pairs=True
113
+ success, error_msg, message_ids_obj = message_ids_api.save_conversation_message_ids(
114
+ conversation_id=conversation_id,
115
+ message_ids=self.tool.message_ids,
116
+ description="Created via conversation_message_ids_write tool",
117
+ preserve_pairs=True
118
+ )
119
+
120
+ if success and message_ids_obj:
121
+ stats = message_ids_api.get_message_ids_statistics(conversation_id)
122
+
123
+ return ToolResult(
124
+ success=True,
125
+ message=get_message("conversation_message_ids_create_success"),
126
+ content={
127
+ "action": "create",
128
+ "conversation_id": conversation_id,
129
+ "message_ids": message_ids_obj.message_ids if message_ids_obj else [],
130
+ "description": message_ids_obj.description if message_ids_obj else "",
131
+ "preserve_pairs": message_ids_obj.preserve_pairs if message_ids_obj else True,
132
+ "statistics": stats,
133
+ "created_at": message_ids_obj.created_at if message_ids_obj else "",
134
+ "updated_at": message_ids_obj.updated_at if message_ids_obj else "",
135
+ "message": get_message("conversation_message_ids_create_success") + f",共{len(message_ids_obj.message_ids) if message_ids_obj else 0}个消息ID。"
136
+ }
137
+ )
138
+ else:
139
+ logger.error(f"Failed to create conversation message IDs: {error_msg}")
140
+ return ToolResult(
141
+ success=False,
142
+ message=get_message_with_format("conversation_message_ids_create_failed", error=error_msg),
143
+ content={
144
+ "error_type": "create_failed",
145
+ "error_message": error_msg,
146
+ "conversation_id": conversation_id,
147
+ "message_ids": self.tool.message_ids
148
+ }
149
+ )
150
+
151
+ def _handle_append_action(self, message_ids_api:ConversationMessageIdsAPI, conversation_id: str) -> ToolResult:
152
+ """Handle append action - add to existing configuration"""
153
+ # First, try to get existing configuration
154
+ existing_config = message_ids_api.get_conversation_message_ids(conversation_id)
155
+
156
+ if existing_config:
157
+ # Parse existing message IDs
158
+ existing_ids = set(existing_config.message_ids)
159
+ # Parse new message IDs
160
+ new_ids = set([id.strip() for id in self.tool.message_ids.split(",") if id.strip()])
161
+ # Combine them
162
+ combined_ids = existing_ids.union(new_ids)
163
+ combined_ids_str = ",".join(sorted(combined_ids))
164
+
165
+ # Save updated configuration
166
+ success, error_msg, message_ids_obj = message_ids_api.save_conversation_message_ids(
167
+ conversation_id=conversation_id,
168
+ message_ids=combined_ids_str,
169
+ description=existing_config.description + " | Appended via tool",
170
+ preserve_pairs=existing_config.preserve_pairs
171
+ )
172
+ else:
173
+ # No existing configuration, create new one
174
+ success, error_msg, message_ids_obj = message_ids_api.save_conversation_message_ids(
175
+ conversation_id=conversation_id,
176
+ message_ids=self.tool.message_ids,
177
+ description="Created via conversation_message_ids_write tool (append)",
178
+ preserve_pairs=True
179
+ )
180
+
181
+ if success and message_ids_obj:
182
+ stats = message_ids_api.get_message_ids_statistics(conversation_id)
183
+
184
+ return ToolResult(
185
+ success=True,
186
+ message=get_message("conversation_message_ids_append_success"),
187
+ content={
188
+ "action": "append",
189
+ "conversation_id": conversation_id,
190
+ "message_ids": message_ids_obj.message_ids if message_ids_obj else [],
191
+ "description": message_ids_obj.description if message_ids_obj else "",
192
+ "preserve_pairs": message_ids_obj.preserve_pairs if message_ids_obj else True,
193
+ "statistics": stats,
194
+ "created_at": message_ids_obj.created_at if message_ids_obj else "",
195
+ "updated_at": message_ids_obj.updated_at if message_ids_obj else "",
196
+ "message": get_message("conversation_message_ids_append_success") + f",共{len(message_ids_obj.message_ids) if message_ids_obj else 0}个消息ID。"
197
+ }
198
+ )
199
+ else:
200
+ logger.error(f"Failed to append conversation message IDs: {error_msg}")
201
+ return ToolResult(
202
+ success=False,
203
+ message=get_message_with_format("conversation_message_ids_append_failed", error=error_msg),
204
+ content={
205
+ "error_type": "append_failed",
206
+ "error_message": error_msg,
207
+ "conversation_id": conversation_id,
208
+ "message_ids": self.tool.message_ids
209
+ }
210
+ )
211
+
212
+ def _handle_delete_action(self, message_ids_api, conversation_id: str) -> ToolResult:
213
+ """Handle delete action - remove from existing configuration"""
214
+ # First, try to get existing configuration
215
+ existing_config = message_ids_api.get_conversation_message_ids(conversation_id)
216
+
217
+ if not existing_config:
218
+ return ToolResult(
219
+ success=False,
220
+ message=get_message("conversation_message_ids_no_existing_config"),
221
+ content={
222
+ "error_type": "no_existing_config",
223
+ "conversation_id": conversation_id,
224
+ "message": get_message("conversation_message_ids_no_existing_config")
225
+ }
226
+ )
227
+
228
+ # Parse existing message IDs
229
+ existing_ids = set(existing_config.message_ids)
230
+ # Parse IDs to delete
231
+ ids_to_delete = set([id.strip() for id in self.tool.message_ids.split(",") if id.strip()])
232
+ # Remove them
233
+ remaining_ids = existing_ids - ids_to_delete
234
+
235
+ if not remaining_ids:
236
+ # Delete the entire configuration if no IDs remain
237
+ success, error_msg = message_ids_api.delete_conversation_message_ids(conversation_id)
238
+ if success:
239
+ return ToolResult(
240
+ success=True,
241
+ message=get_message("conversation_message_ids_delete_success"),
242
+ content={
243
+ "action": "delete",
244
+ "conversation_id": conversation_id,
245
+ "deleted_ids": list(ids_to_delete),
246
+ "remaining_ids": [],
247
+ "message": get_message("conversation_message_ids_delete_success")
248
+ }
249
+ )
250
+ else:
251
+ return ToolResult(
252
+ success=False,
253
+ message=get_message_with_format("conversation_message_ids_delete_failed", error=error_msg),
254
+ content={
255
+ "error_type": "delete_failed",
256
+ "error_message": error_msg
257
+ }
258
+ )
259
+ else:
260
+ # Update configuration with remaining IDs
261
+ remaining_ids_str = ",".join(sorted(remaining_ids))
262
+ success, error_msg, message_ids_obj = message_ids_api.save_conversation_message_ids(
263
+ conversation_id=conversation_id,
264
+ message_ids=remaining_ids_str,
265
+ description=existing_config.description + " | Deleted IDs via tool",
266
+ preserve_pairs=existing_config.preserve_pairs
267
+ )
268
+
269
+ if success and message_ids_obj:
270
+ stats = message_ids_api.get_message_ids_statistics(conversation_id)
271
+
272
+ return ToolResult(
273
+ success=True,
274
+ message=get_message("conversation_message_ids_update_success"),
275
+ content={
276
+ "action": "delete",
277
+ "conversation_id": conversation_id,
278
+ "deleted_ids": list(ids_to_delete),
279
+ "remaining_ids": message_ids_obj.message_ids if message_ids_obj else [],
280
+ "description": message_ids_obj.description if message_ids_obj else "",
281
+ "preserve_pairs": message_ids_obj.preserve_pairs if message_ids_obj else True,
282
+ "statistics": stats,
283
+ "created_at": message_ids_obj.created_at if message_ids_obj else "",
284
+ "updated_at": message_ids_obj.updated_at if message_ids_obj else "",
285
+ "message": get_message("conversation_message_ids_update_success") + f",剩余{len(message_ids_obj.message_ids) if message_ids_obj else 0}个消息ID。"
286
+ }
287
+ )
288
+ else:
289
+ logger.error(f"Failed to update conversation message IDs after delete: {error_msg}")
290
+ return ToolResult(
291
+ success=False,
292
+ message=get_message_with_format("conversation_message_ids_update_failed", error=error_msg),
293
+ content={
294
+ "error_type": "update_after_delete_failed",
295
+ "error_message": error_msg,
296
+ "conversation_id": conversation_id,
297
+ "message_ids": self.tool.message_ids
298
+ }
299
+ )