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,225 @@
1
+ import os
2
+ import tempfile
3
+ import requests
4
+ from typing import Optional
5
+ from pathlib import Path
6
+ from urllib.parse import urlparse
7
+ from autocoder.common.v2.agent.agentic_edit_tools.base_tool_resolver import BaseToolResolver
8
+ from autocoder.common.v2.agent.agentic_edit_types import ExtractToTextTool, ToolResult
9
+ from autocoder.common import AutoCoderArgs
10
+ from loguru import logger
11
+ import typing
12
+
13
+ # 导入文档解析相关模块
14
+ from autocoder.rag.loaders import (
15
+ extract_text_from_pdf,
16
+ extract_text_from_docx,
17
+ extract_text_from_ppt
18
+ )
19
+
20
+ if typing.TYPE_CHECKING:
21
+ from autocoder.common.v2.agent.agentic_edit import AgenticEdit
22
+
23
+
24
+ class ExtractToTextToolResolver(BaseToolResolver):
25
+ """文本提取工具解析器,将各种格式文件转换为文本文件"""
26
+
27
+ def __init__(self, agent: Optional['AgenticEdit'], tool: ExtractToTextTool, args: AutoCoderArgs):
28
+ super().__init__(agent, tool, args)
29
+ self.tool: ExtractToTextTool = tool # 类型提示
30
+
31
+ def _is_url(self, path: str) -> bool:
32
+ """检查路径是否为URL"""
33
+ try:
34
+ result = urlparse(path)
35
+ return all([result.scheme, result.netloc])
36
+ except Exception:
37
+ return False
38
+
39
+ def _download_from_url(self, url: str) -> str:
40
+ """从URL下载文件到临时路径"""
41
+ try:
42
+ logger.info(f"Downloading file from URL: {url}")
43
+ response = requests.get(url, timeout=30)
44
+ response.raise_for_status()
45
+
46
+ # 从URL或Content-Disposition头获取文件名
47
+ filename = None
48
+ if 'content-disposition' in response.headers:
49
+ content_disposition = response.headers['content-disposition']
50
+ if 'filename=' in content_disposition:
51
+ filename = content_disposition.split('filename=')[1].strip('"')
52
+
53
+ if not filename:
54
+ # 从URL路径提取文件名
55
+ parsed_url = urlparse(url)
56
+ filename = os.path.basename(parsed_url.path)
57
+ if not filename or '.' not in filename:
58
+ # 根据Content-Type猜测扩展名
59
+ content_type = response.headers.get('content-type', '')
60
+ if 'pdf' in content_type:
61
+ filename = 'downloaded_file.pdf'
62
+ elif 'word' in content_type or 'officedocument' in content_type:
63
+ filename = 'downloaded_file.docx'
64
+ elif 'powerpoint' in content_type or 'presentation' in content_type:
65
+ filename = 'downloaded_file.pptx'
66
+ else:
67
+ filename = 'downloaded_file.txt'
68
+
69
+ # 创建临时文件
70
+ temp_dir = tempfile.mkdtemp()
71
+ temp_file_path = os.path.join(temp_dir, filename)
72
+
73
+ with open(temp_file_path, 'wb') as temp_file:
74
+ temp_file.write(response.content)
75
+
76
+ logger.info(f"Downloaded file to: {temp_file_path}")
77
+ return temp_file_path
78
+
79
+ except Exception as e:
80
+ raise Exception(f"Failed to download file from URL '{url}': {str(e)}")
81
+
82
+ def _extract_text_content(self, file_path: str) -> str:
83
+ """提取文件的文本内容,支持多种格式"""
84
+ try:
85
+ ext = os.path.splitext(file_path)[1].lower()
86
+
87
+ if ext == '.pdf':
88
+ logger.info(f"Extracting text from PDF: {file_path}")
89
+ return extract_text_from_pdf(file_path)
90
+ elif ext == '.docx':
91
+ logger.info(f"Extracting text from DOCX: {file_path}")
92
+ return extract_text_from_docx(file_path)
93
+ elif ext in ('.pptx', '.ppt'):
94
+ logger.info(f"Extracting text from PPT/PPTX: {file_path}")
95
+ slide_texts = []
96
+ for slide_identifier, slide_text_content in extract_text_from_ppt(file_path):
97
+ slide_texts.append(f"--- Slide {slide_identifier} ---\n{slide_text_content}")
98
+ return "\n\n".join(slide_texts) if slide_texts else ""
99
+ else:
100
+ # 处理普通文本文件
101
+ logger.info(f"Reading plain text file: {file_path}")
102
+ with open(file_path, 'r', encoding='utf-8', errors='replace') as f:
103
+ return f.read()
104
+
105
+ except Exception as e:
106
+ raise Exception(f"Failed to extract text from file '{file_path}': {str(e)}")
107
+
108
+ def _write_text_to_file(self, content: str, target_path: str) -> None:
109
+ """将文本内容写入目标文件"""
110
+ try:
111
+ # 确保目标目录存在
112
+ target_dir = os.path.dirname(target_path)
113
+ if target_dir:
114
+ os.makedirs(target_dir, exist_ok=True)
115
+
116
+ # 写入文件
117
+ with open(target_path, 'w', encoding='utf-8') as f:
118
+ f.write(content)
119
+
120
+ logger.info(f"Successfully wrote text content to: {target_path}")
121
+
122
+ except Exception as e:
123
+ raise Exception(f"Failed to write text to file '{target_path}': {str(e)}")
124
+
125
+ def _cleanup_temp_file(self, temp_path: str) -> None:
126
+ """清理临时文件"""
127
+ try:
128
+ if os.path.exists(temp_path):
129
+ # 如果是临时目录中的文件,删除整个临时目录
130
+ temp_dir = os.path.dirname(temp_path)
131
+ if temp_dir.startswith(tempfile.gettempdir()):
132
+ import shutil
133
+ shutil.rmtree(temp_dir, ignore_errors=True)
134
+ logger.info(f"Cleaned up temporary directory: {temp_dir}")
135
+ else:
136
+ os.remove(temp_path)
137
+ logger.info(f"Cleaned up temporary file: {temp_path}")
138
+ except Exception as e:
139
+ logger.warning(f"Failed to cleanup temporary file '{temp_path}': {str(e)}")
140
+
141
+ def resolve(self) -> ToolResult:
142
+ """
143
+ 执行文本提取工具
144
+
145
+ Returns:
146
+ ToolResult: 工具执行结果
147
+ """
148
+ source_path = self.tool.source_path
149
+ target_path = self.tool.target_path
150
+ temp_file_path = None
151
+
152
+ try:
153
+ # 第一步:获取源文件路径
154
+ if self._is_url(source_path):
155
+ # 从URL下载文件
156
+ temp_file_path = self._download_from_url(source_path)
157
+ actual_source_path = temp_file_path
158
+ logger.info(f"Processing URL: {source_path} -> {temp_file_path}")
159
+ else:
160
+ # 本地文件路径
161
+ if not os.path.exists(source_path):
162
+ return ToolResult(
163
+ success=False,
164
+ message=f"Error: Source file not found at path: {source_path}"
165
+ )
166
+ if not os.path.isfile(source_path):
167
+ return ToolResult(
168
+ success=False,
169
+ message=f"Error: Source path is not a file: {source_path}"
170
+ )
171
+ actual_source_path = source_path
172
+ logger.info(f"Processing local file: {source_path}")
173
+
174
+ # 第二步:提取文本内容
175
+ text_content = self._extract_text_content(actual_source_path)
176
+
177
+ if not text_content.strip():
178
+ return ToolResult(
179
+ success=False,
180
+ message=f"Warning: No text content extracted from file: {source_path}"
181
+ )
182
+
183
+ # 第三步:写入目标文件
184
+ self._write_text_to_file(text_content, target_path)
185
+
186
+ # 记录文件变更(如果需要)
187
+ if self.agent:
188
+ self.agent.record_file_change(
189
+ file_path=target_path,
190
+ change_type="added",
191
+ content=text_content
192
+ )
193
+
194
+ # 统计信息
195
+ line_count = len(text_content.split('\n'))
196
+ char_count = len(text_content)
197
+
198
+ success_message = f"Successfully extracted text from '{source_path}' to '{target_path}'"
199
+ if self._is_url(source_path):
200
+ success_message += f" (downloaded from URL)"
201
+ success_message += f" - {line_count} lines, {char_count} characters"
202
+
203
+ return ToolResult(
204
+ success=True,
205
+ message=success_message,
206
+ content={
207
+ "source_path": source_path,
208
+ "target_path": target_path,
209
+ "line_count": line_count,
210
+ "char_count": char_count,
211
+ "is_url": self._is_url(source_path)
212
+ }
213
+ )
214
+
215
+ except Exception as e:
216
+ logger.error(f"ExtractToTextTool execution failed: {str(e)}")
217
+ return ToolResult(
218
+ success=False,
219
+ message=f"文本提取失败: {str(e)}"
220
+ )
221
+
222
+ finally:
223
+ # 清理临时文件
224
+ if temp_file_path:
225
+ self._cleanup_temp_file(temp_file_path)
@@ -0,0 +1,79 @@
1
+ """
2
+ Lint report data structure for AgenticEdit tools integration.
3
+ """
4
+
5
+ from dataclasses import dataclass
6
+ from typing import Dict, List, Any, Optional
7
+ from autocoder.common.linter_core.models.lint_result import LintResult
8
+ from autocoder.common.linter_core.linter_manager import LinterManager
9
+
10
+
11
+ @dataclass
12
+ class LintReport:
13
+ """Lint 检查报告 - 基于 linter_core 的简化实现"""
14
+ results: Dict[str, LintResult] # 原始检查结果
15
+ summary: Dict[str, Any] # LinterManager.get_summary_report() 的结果
16
+
17
+ @classmethod
18
+ def from_linter_results(cls, results: Dict[str, LintResult],
19
+ manager: LinterManager) -> 'LintReport':
20
+ """从 LinterManager 的结果创建报告"""
21
+ summary = manager.get_summary_report(results)
22
+ return cls(results=results, summary=summary)
23
+
24
+ def to_markdown(self) -> str:
25
+ """生成 Markdown 格式报告"""
26
+ lines = ["## Lint Report\n"]
27
+
28
+ # 汇总信息
29
+ lines.append("### Summary")
30
+ lines.append(f"- Total files: {self.summary['total_files']}")
31
+ lines.append(f"- Files with issues: {self.summary['files_with_issues']}")
32
+ lines.append(f"- Failed files: {self.summary['failed_files']}")
33
+ lines.append(f"- Execution time: {self.summary['total_execution_time']:.2f}s\n")
34
+
35
+ # 详细结果
36
+ if self.has_issues():
37
+ lines.append("### Issues Found")
38
+ for file_path, result in self.results.items():
39
+ if result.has_issues:
40
+ lines.append(f"#### {file_path}")
41
+ lines.append("```")
42
+ lines.append(result.lint_output)
43
+ lines.append("```\n")
44
+
45
+ return "\n".join(lines)
46
+
47
+ def to_simple_text(self) -> str:
48
+ """生成简单文本格式报告"""
49
+ if not self.has_issues():
50
+ return f"✅ Lint check passed - No issues found in {self.summary['total_files']} file(s)"
51
+
52
+ lines = [f"❌ Lint issues detected in {self.summary['files_with_issues']} of {self.summary['total_files']} file(s):"]
53
+ for file_path, result in self.results.items():
54
+ if result.has_issues:
55
+ lines.append(f"\n{file_path}:")
56
+ lines.append(result.lint_output)
57
+
58
+ return "\n".join(lines)
59
+
60
+ def to_json(self) -> dict:
61
+ """生成 JSON 格式报告"""
62
+ return {
63
+ 'summary': self.summary,
64
+ 'results': {
65
+ path: result.to_dict()
66
+ for path, result in self.results.items()
67
+ }
68
+ }
69
+
70
+ def has_issues(self) -> bool:
71
+ """检查是否有任何问题"""
72
+ return self.summary.get('files_with_issues', 0) > 0
73
+
74
+ def get_files_with_issues(self) -> List[str]:
75
+ """获取有问题的文件列表"""
76
+ return [
77
+ path for path, result in self.results.items()
78
+ if result.has_issues
79
+ ]
@@ -0,0 +1,343 @@
1
+ """
2
+ Pydantic models for linter configuration with type validation and defaults.
3
+ """
4
+
5
+ from typing import List, Optional, Dict, Any, Literal
6
+ from pydantic import BaseModel, Field, validator
7
+ from pathlib import Path
8
+
9
+
10
+ class FilePatterns(BaseModel):
11
+ """File pattern configuration for include/exclude rules."""
12
+
13
+ include: List[str] = Field(
14
+ default=["*.py", "*.ts", "*.tsx", "*.js", "*.jsx", "*.java"],
15
+ description="List of glob patterns for files to include in linting"
16
+ )
17
+ exclude: List[str] = Field(
18
+ default=["*.test.*", "*.spec.*", "__pycache__", "node_modules", ".git"],
19
+ description="List of glob patterns for files to exclude from linting"
20
+ )
21
+
22
+ @validator('include', 'exclude', pre=True)
23
+ def ensure_list(cls, v):
24
+ """Ensure the value is a list."""
25
+ if isinstance(v, str):
26
+ return [v]
27
+ return v
28
+
29
+
30
+ class PythonConfig(BaseModel):
31
+ """Python-specific linter configuration."""
32
+
33
+ use_mypy: bool = Field(
34
+ default=True,
35
+ description="Enable mypy type checking"
36
+ )
37
+ flake8_args: List[str] = Field(
38
+ default_factory=list,
39
+ description="Additional arguments for flake8"
40
+ )
41
+ mypy_args: List[str] = Field(
42
+ default_factory=list,
43
+ description="Additional arguments for mypy"
44
+ )
45
+ flake8_timeout: int = Field(
46
+ default=30,
47
+ ge=1,
48
+ le=300,
49
+ description="Timeout for flake8 execution in seconds"
50
+ )
51
+ mypy_timeout: int = Field(
52
+ default=30,
53
+ ge=1,
54
+ le=300,
55
+ description="Timeout for mypy execution in seconds"
56
+ )
57
+
58
+
59
+ class TypeScriptConfig(BaseModel):
60
+ """TypeScript-specific linter configuration."""
61
+
62
+ use_eslint: bool = Field(
63
+ default=True,
64
+ description="Enable ESLint checking"
65
+ )
66
+ tsc_args: List[str] = Field(
67
+ default=["--noEmit", "--strict"],
68
+ description="Arguments for TypeScript compiler"
69
+ )
70
+ eslint_args: List[str] = Field(
71
+ default_factory=list,
72
+ description="Additional arguments for ESLint"
73
+ )
74
+ tsconfig_path: Optional[str] = Field(
75
+ default=None,
76
+ description="Path to tsconfig.json file"
77
+ )
78
+ tsc_timeout: int = Field(
79
+ default=60,
80
+ ge=1,
81
+ le=300,
82
+ description="Timeout for tsc execution in seconds"
83
+ )
84
+ eslint_timeout: int = Field(
85
+ default=30,
86
+ ge=1,
87
+ le=300,
88
+ description="Timeout for ESLint execution in seconds"
89
+ )
90
+
91
+ @validator('tsconfig_path')
92
+ def validate_tsconfig_path(cls, v):
93
+ """Validate tsconfig path if provided."""
94
+ if v and not Path(v).exists():
95
+ # Don't fail, just log warning (file might be created later)
96
+ pass
97
+ return v
98
+
99
+
100
+ class JavaConfig(BaseModel):
101
+ """Java-specific linter configuration."""
102
+
103
+ javac_args: List[str] = Field(
104
+ default_factory=list,
105
+ description="Additional arguments for javac"
106
+ )
107
+ javac_timeout: int = Field(
108
+ default=30,
109
+ ge=1,
110
+ le=300,
111
+ description="Timeout for javac execution in seconds"
112
+ )
113
+ project_type: Literal["auto", "maven", "gradle", "local"] = Field(
114
+ default="auto",
115
+ description="Project type for dependency resolution"
116
+ )
117
+ source_paths: List[str] = Field(
118
+ default=["src", "src/main/java"],
119
+ description="Source directories to search"
120
+ )
121
+ lib_dirs: List[str] = Field(
122
+ default=["lib", "libs"],
123
+ description="Directories containing JAR files"
124
+ )
125
+ enable_dependency_resolution: bool = Field(
126
+ default=True,
127
+ description="Enable automatic dependency resolution"
128
+ )
129
+ cache_dependencies: bool = Field(
130
+ default=True,
131
+ description="Cache resolved classpaths for performance"
132
+ )
133
+ release: str = Field(
134
+ default="8",
135
+ description="Java release version"
136
+ )
137
+ use_release_flag: bool = Field(
138
+ default=True,
139
+ description="Use --release flag (can be disabled for older javac)"
140
+ )
141
+
142
+
143
+ class LanguageConfig(BaseModel):
144
+ """Container for all language-specific configurations."""
145
+
146
+ python: PythonConfig = Field(
147
+ default_factory=PythonConfig,
148
+ description="Python linter configuration"
149
+ )
150
+ typescript: TypeScriptConfig = Field(
151
+ default_factory=TypeScriptConfig,
152
+ description="TypeScript linter configuration"
153
+ )
154
+ java: JavaConfig = Field(
155
+ default_factory=JavaConfig,
156
+ description="Java linter configuration"
157
+ )
158
+
159
+ class Config:
160
+ extra = "allow" # Allow additional language configurations
161
+
162
+
163
+ class ReportConfig(BaseModel):
164
+ """Linter report configuration."""
165
+
166
+ format: Literal["simple", "detailed", "json"] = Field(
167
+ default="simple",
168
+ description="Report format"
169
+ )
170
+ include_in_result: bool = Field(
171
+ default=True,
172
+ description="Include lint report in ToolResult content"
173
+ )
174
+ save_to_file: bool = Field(
175
+ default=False,
176
+ description="Save lint reports to files"
177
+ )
178
+ file_path: str = Field(
179
+ default=".auto-coder/lint-reports/",
180
+ description="Directory path for saving lint reports"
181
+ )
182
+ max_issues_shown: int = Field(
183
+ default=50,
184
+ ge=1,
185
+ le=1000,
186
+ description="Maximum number of issues to show in report"
187
+ )
188
+
189
+
190
+ class LinterConfig(BaseModel):
191
+ """Main linter configuration model with type validation."""
192
+
193
+ enabled: bool = Field(
194
+ default=False,
195
+ description="Global linter enable/disable switch"
196
+ )
197
+ mode: Literal["warning", "blocking", "silent"] = Field(
198
+ default="warning",
199
+ description="Linter operation mode"
200
+ )
201
+ check_before_modification: bool = Field(
202
+ default=False,
203
+ description="Run linter before applying modifications"
204
+ )
205
+ check_after_modification: bool = Field(
206
+ default=True,
207
+ description="Run linter after applying modifications"
208
+ )
209
+ max_workers: int = Field(
210
+ default=4,
211
+ ge=1,
212
+ le=32,
213
+ description="Maximum parallel workers for linting"
214
+ )
215
+ timeout: int = Field(
216
+ default=300,
217
+ ge=10,
218
+ le=3600,
219
+ description="Global timeout for linting operations in seconds"
220
+ )
221
+ file_patterns: FilePatterns = Field(
222
+ default_factory=FilePatterns,
223
+ description="File include/exclude patterns"
224
+ )
225
+ language_config: LanguageConfig = Field(
226
+ default_factory=LanguageConfig,
227
+ description="Language-specific configurations"
228
+ )
229
+ report: ReportConfig = Field(
230
+ default_factory=ReportConfig,
231
+ description="Report generation configuration"
232
+ )
233
+
234
+ class Config:
235
+ """Pydantic configuration."""
236
+ validate_assignment = True
237
+ use_enum_values = True
238
+ extra = "forbid" # Don't allow extra fields at root level
239
+ json_schema_extra = {
240
+ "example": {
241
+ "enabled": True,
242
+ "mode": "warning",
243
+ "check_after_modification": True,
244
+ "file_patterns": {
245
+ "include": ["*.py", "*.ts"],
246
+ "exclude": ["*.test.*"]
247
+ },
248
+ "language_config": {
249
+ "python": {
250
+ "use_mypy": True,
251
+ "flake8_args": ["--max-line-length=120"]
252
+ }
253
+ },
254
+ "report": {
255
+ "format": "detailed",
256
+ "include_in_result": True
257
+ }
258
+ }
259
+ }
260
+
261
+ @validator('mode')
262
+ def validate_mode(cls, v):
263
+ """Validate linter mode."""
264
+ valid_modes = ["warning", "blocking", "silent"]
265
+ if v not in valid_modes:
266
+ raise ValueError(f"Invalid mode: {v}. Must be one of {valid_modes}")
267
+ return v
268
+
269
+ @classmethod
270
+ def from_dict(cls, config_dict: Dict[str, Any]) -> 'LinterConfig':
271
+ """
272
+ Create LinterConfig from a dictionary, handling nested 'linter' key.
273
+
274
+ Args:
275
+ config_dict: Configuration dictionary
276
+
277
+ Returns:
278
+ LinterConfig instance
279
+ """
280
+ # Handle both direct config and nested under 'linter' key
281
+ if 'linter' in config_dict:
282
+ config_data = config_dict['linter']
283
+ else:
284
+ config_data = config_dict
285
+
286
+ # Handle legacy 'language_config' key mapping
287
+ if 'language_config' in config_data:
288
+ lang_config = config_data['language_config']
289
+
290
+ # Map old config structure to new structure
291
+ if 'python_config' in lang_config:
292
+ lang_config['python'] = lang_config.pop('python_config')
293
+ if 'typescript_config' in lang_config:
294
+ lang_config['typescript'] = lang_config.pop('typescript_config')
295
+ if 'java_config' in lang_config:
296
+ lang_config['java'] = lang_config.pop('java_config')
297
+
298
+ return cls(**config_data)
299
+
300
+ def to_manager_config(self) -> Dict[str, Any]:
301
+ """
302
+ Convert to LinterManager compatible configuration.
303
+
304
+ Returns:
305
+ Dictionary suitable for LinterManager initialization
306
+ """
307
+ manager_config = {
308
+ 'max_workers': self.max_workers,
309
+ 'timeout': self.timeout,
310
+ 'python_config': self.language_config.python.dict(),
311
+ 'typescript_config': self.language_config.typescript.dict(),
312
+ 'java_config': self.language_config.java.dict()
313
+ }
314
+
315
+ return manager_config
316
+
317
+ def should_lint_file(self, file_path: str) -> bool:
318
+ """
319
+ Check if a file should be linted based on patterns.
320
+
321
+ Args:
322
+ file_path: Path to the file
323
+
324
+ Returns:
325
+ True if file should be linted
326
+ """
327
+ if not self.enabled:
328
+ return False
329
+
330
+ from pathlib import Path
331
+ path = Path(file_path)
332
+
333
+ # Check exclude patterns first
334
+ for pattern in self.file_patterns.exclude:
335
+ if path.match(pattern):
336
+ return False
337
+
338
+ # Check include patterns
339
+ for pattern in self.file_patterns.include:
340
+ if pattern == '*' or path.match(pattern):
341
+ return True
342
+
343
+ return False