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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +409 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,306 @@
1
+
2
+
3
+ """
4
+ Text Similarity Module Tests
5
+
6
+ 测试文本相似度计算模块的各项功能。
7
+ """
8
+
9
+ import pytest
10
+ import sys
11
+ import os
12
+
13
+ from autocoder.common.text_similarity.text_similarity import TextSimilarity
14
+ from autocoder.common.text_similarity.utils import compare_texts_simple, find_best_matches, analyze_text_similarity
15
+
16
+
17
+ class TestTextSimilarity:
18
+ """测试 TextSimilarity 类的功能"""
19
+
20
+ def setup_method(self):
21
+ """设置测试数据"""
22
+ # 测试目标:验证基本的文本相似度计算功能
23
+ self.text_a = """def hello_world():
24
+ print("Hello, World!")
25
+ return True"""
26
+
27
+ self.text_b = """import os
28
+ import sys
29
+
30
+ def hello_world():
31
+ print("Hello, World!")
32
+ return True
33
+
34
+ def goodbye_world():
35
+ print("Goodbye, World!")
36
+ return False
37
+
38
+ if __name__ == "__main__":
39
+ hello_world()
40
+ goodbye_world()"""
41
+
42
+ def test_initialization(self):
43
+ """测试目标:验证 TextSimilarity 类的正确初始化"""
44
+ similarity = TextSimilarity(self.text_a, self.text_b)
45
+
46
+ assert similarity.text_a == self.text_a
47
+ assert similarity.text_b == self.text_b
48
+ assert similarity.m == 3 # text_a 有 3 行
49
+ assert similarity.n == 14 # text_b 有 14 行(包括空行)
50
+ assert len(similarity.lines_a) == 3
51
+ assert len(similarity.lines_b) == 14
52
+
53
+ def test_split_into_lines(self):
54
+ """测试目标:验证文本正确分割为行"""
55
+ similarity = TextSimilarity(self.text_a, self.text_b)
56
+
57
+ lines_a = similarity._split_into_lines(self.text_a)
58
+ expected_lines_a = [
59
+ 'def hello_world():',
60
+ ' print("Hello, World!")',
61
+ ' return True'
62
+ ]
63
+
64
+ assert lines_a == expected_lines_a
65
+
66
+ def test_levenshtein_ratio(self):
67
+ """测试目标:验证莱文斯坦相似度计算的正确性"""
68
+ similarity = TextSimilarity(self.text_a, self.text_b)
69
+
70
+ # 完全相同的字符串
71
+ ratio1 = similarity._levenshtein_ratio("hello", "hello")
72
+ assert ratio1 == 1.0
73
+
74
+ # 完全不同的字符串
75
+ ratio2 = similarity._levenshtein_ratio("hello", "world")
76
+ assert 0.0 <= ratio2 <= 1.0
77
+
78
+ # 部分相似的字符串
79
+ ratio3 = similarity._levenshtein_ratio("hello", "hallo")
80
+ assert 0.0 < ratio3 < 1.0
81
+
82
+ def test_get_best_matching_window(self):
83
+ """测试目标:验证基本滑动窗口匹配功能的正确性"""
84
+ similarity = TextSimilarity(self.text_a, self.text_b)
85
+
86
+ score, window = similarity.get_best_matching_window()
87
+
88
+ # 验证返回值类型
89
+ assert isinstance(score, float)
90
+ assert isinstance(window, str)
91
+
92
+ # 验证相似度在合理范围内
93
+ assert 0.0 <= score <= 1.0
94
+
95
+ # 验证窗口长度(应该包含3行,因为text_a有3行)
96
+ window_lines = window.split('\n')
97
+ assert len(window_lines) == 3
98
+
99
+ # 验证找到的是最相似的部分(应该包含hello_world函数)
100
+ assert "hello_world" in window.lower()
101
+
102
+ def test_get_best_matching_window_all_sizes(self):
103
+ """测试目标:验证全窗口大小遍历匹配功能的正确性"""
104
+ similarity = TextSimilarity(self.text_a, self.text_b)
105
+
106
+ score, window, info = similarity.get_best_matching_window_all_sizes()
107
+
108
+ # 验证返回值类型
109
+ assert isinstance(score, float)
110
+ assert isinstance(window, str)
111
+ assert isinstance(info, dict)
112
+
113
+ # 验证相似度在合理范围内
114
+ assert 0.0 <= score <= 1.0
115
+
116
+ # 验证详细信息包含必要字段
117
+ required_keys = ["window_size", "start_position", "end_position", "total_windows_checked"]
118
+ for key in required_keys:
119
+ assert key in info
120
+
121
+ # 验证检查的窗口数量是合理的
122
+ assert info["total_windows_checked"] > 0
123
+
124
+ # 验证位置信息的合理性
125
+ assert 0 <= info["start_position"] < info["end_position"] <= similarity.n
126
+
127
+ def test_get_similarity_matrix(self):
128
+ """测试目标:验证相似度矩阵计算的正确性"""
129
+ similarity = TextSimilarity(self.text_a, self.text_b)
130
+
131
+ matrix = similarity.get_similarity_matrix()
132
+
133
+ # 验证矩阵维度
134
+ assert len(matrix) == similarity.m # 行数等于text_a的行数
135
+ for row in matrix:
136
+ assert len(row) == similarity.n # 列数等于text_b的行数
137
+
138
+ # 验证矩阵中的值都在[0,1]范围内
139
+ for i in range(len(matrix)):
140
+ for j in range(len(matrix[i])):
141
+ assert 0.0 <= matrix[i][j] <= 1.0
142
+
143
+ def test_get_window_similarities(self):
144
+ """测试目标:验证窗口相似度列表功能的正确性"""
145
+ similarity = TextSimilarity(self.text_a, self.text_b)
146
+
147
+ similarities = similarity.get_window_similarities()
148
+
149
+ # 验证返回的是列表
150
+ assert isinstance(similarities, list)
151
+
152
+ # 验证每个元素的结构
153
+ for item in similarities:
154
+ assert isinstance(item, tuple)
155
+ assert len(item) == 3
156
+ start_pos, score, window_text = item
157
+
158
+ assert isinstance(start_pos, int)
159
+ assert isinstance(score, float)
160
+ assert isinstance(window_text, str)
161
+
162
+ assert 0.0 <= score <= 1.0
163
+ assert start_pos >= 0
164
+
165
+ # 验证结果按相似度降序排列
166
+ scores = [item[1] for item in similarities]
167
+ assert scores == sorted(scores, reverse=True)
168
+
169
+ def test_get_statistics(self):
170
+ """测试目标:验证统计信息功能的正确性"""
171
+ similarity = TextSimilarity(self.text_a, self.text_b)
172
+
173
+ stats = similarity.get_statistics()
174
+
175
+ # 验证统计信息包含所有必要字段
176
+ required_keys = [
177
+ "text_a_lines", "text_b_lines", "text_a_chars", "text_b_chars",
178
+ "possible_windows", "full_text_similarity"
179
+ ]
180
+ for key in required_keys:
181
+ assert key in stats
182
+
183
+ # 验证统计信息的正确性
184
+ assert stats["text_a_lines"] == 3
185
+ assert stats["text_b_lines"] == 14
186
+ assert stats["text_a_chars"] == len(self.text_a)
187
+ assert stats["text_b_chars"] == len(self.text_b)
188
+ assert stats["possible_windows"] == 12 # 14 - 3 + 1
189
+ assert 0.0 <= stats["full_text_similarity"] <= 1.0
190
+
191
+ def test_edge_cases(self):
192
+ """测试目标:验证边界情况的处理"""
193
+ # 空文本测试
194
+ empty_similarity = TextSimilarity("", "some text")
195
+ score, window = empty_similarity.get_best_matching_window()
196
+ assert isinstance(score, float)
197
+
198
+ # 源文本比目标文本长的情况
199
+ long_short_similarity = TextSimilarity("very long text here", "short")
200
+ score, window = long_short_similarity.get_best_matching_window()
201
+ assert window == "short"
202
+
203
+ # 相同文本测试
204
+ same_similarity = TextSimilarity("same text", "same text")
205
+ score, window = same_similarity.get_best_matching_window()
206
+ assert score == 1.0
207
+ assert window == "same text"
208
+
209
+
210
+ class TestUtils:
211
+ """测试工具函数"""
212
+
213
+ def setup_method(self):
214
+ """设置测试数据"""
215
+ self.text_a = "Hello World"
216
+ self.text_b = "Hello Beautiful World\nGoodbye Cruel World\nHello Again"
217
+
218
+ def test_compare_texts_simple(self):
219
+ """测试目标:验证简单文本比较功能的完整性"""
220
+ result = compare_texts_simple(self.text_a, self.text_b)
221
+
222
+ # 验证返回结构
223
+ assert "basic_matching" in result
224
+ assert "comprehensive_matching" in result
225
+ assert "statistics" in result
226
+
227
+ # 验证基本匹配结果
228
+ basic = result["basic_matching"]
229
+ assert "score" in basic
230
+ assert "window" in basic
231
+ assert isinstance(basic["score"], float)
232
+ assert isinstance(basic["window"], str)
233
+
234
+ # 验证全面匹配结果
235
+ comprehensive = result["comprehensive_matching"]
236
+ assert "score" in comprehensive
237
+ assert "window" in comprehensive
238
+ assert "details" in comprehensive
239
+
240
+ def test_find_best_matches(self):
241
+ """测试目标:验证最佳匹配查找功能的准确性"""
242
+ matches = find_best_matches(self.text_a, self.text_b, top_k=2)
243
+
244
+ # 验证返回的匹配数量
245
+ assert len(matches) <= 2
246
+
247
+ # 验证每个匹配的结构
248
+ for match in matches:
249
+ required_keys = ["rank", "start_position", "end_position", "similarity_score", "window_text"]
250
+ for key in required_keys:
251
+ assert key in match
252
+
253
+ assert isinstance(match["similarity_score"], float)
254
+ assert 0.0 <= match["similarity_score"] <= 1.0
255
+
256
+ def test_analyze_text_similarity(self):
257
+ """测试目标:验证全面文本相似度分析功能的完整性"""
258
+ analysis = analyze_text_similarity(self.text_a, self.text_b)
259
+
260
+ # 验证分析结果包含所有必要部分
261
+ required_sections = [
262
+ "summary", "basic_matching", "comprehensive_matching",
263
+ "top_matches", "statistics", "similarity_matrix_shape"
264
+ ]
265
+ for section in required_sections:
266
+ assert section in analysis
267
+
268
+ # 验证摘要信息
269
+ summary = analysis["summary"]
270
+ assert "basic_best_score" in summary
271
+ assert "comprehensive_best_score" in summary
272
+ assert "improvement" in summary
273
+ assert "total_windows_checked" in summary
274
+
275
+ # 验证改进值的合理性(全面搜索应该不差于基本搜索)
276
+ assert summary["improvement"] >= 0
277
+
278
+
279
+ if __name__ == "__main__":
280
+ # 运行简单的功能验证测试
281
+ print("运行文本相似度模块测试...")
282
+
283
+ # 基本功能测试
284
+ text_a = "def test():\n return True"
285
+ text_b = "import sys\n\ndef test():\n return True\n\ndef main():\n test()"
286
+
287
+ similarity = TextSimilarity(text_a, text_b)
288
+
289
+ print("=== 基本匹配测试 ===")
290
+ score1, window1 = similarity.get_best_matching_window()
291
+ print(f"基本匹配得分: {score1:.4f}")
292
+ print(f"匹配窗口:\n{window1}")
293
+
294
+ print("\n=== 全面匹配测试 ===")
295
+ score2, window2, info2 = similarity.get_best_matching_window_all_sizes()
296
+ print(f"全面匹配得分: {score2:.4f}")
297
+ print(f"检查窗口数: {info2['total_windows_checked']}")
298
+ print(f"最佳窗口大小: {info2['window_size']}")
299
+ print(f"匹配窗口:\n{window2}")
300
+
301
+ print(f"\n=== 性能对比 ===")
302
+ print(f"得分提升: {score2 - score1:.4f}")
303
+
304
+ print("\n测试完成!")
305
+
306
+
@@ -0,0 +1,194 @@
1
+
2
+ """
3
+ Text Similarity Calculation Module
4
+
5
+ 提供文本相似度计算功能,包括滑动窗口匹配和全窗口遍历匹配两种实现方式。
6
+ """
7
+
8
+ from difflib import SequenceMatcher
9
+ from typing import Tuple, List, Dict, Any
10
+
11
+
12
+ class TextSimilarity:
13
+ """
14
+ 文本相似度计算类
15
+
16
+ 用于计算两个文本之间的相似度,支持基于行的比较和滑动窗口匹配。
17
+ """
18
+
19
+ def __init__(self, text_a: str, text_b: str):
20
+ """
21
+ 初始化文本相似度计算器
22
+
23
+ Args:
24
+ text_a: 源文本(较短的文本,用作匹配模板)
25
+ text_b: 目标文本(较长的文本,在其中寻找匹配窗口)
26
+ """
27
+ self.text_a = text_a
28
+ self.text_b = text_b
29
+ self.lines_a = self._split_into_lines(text_a)
30
+ self.lines_b = self._split_into_lines(text_b)
31
+ self.m = len(self.lines_a) # 源文本行数
32
+ self.n = len(self.lines_b) # 目标文本行数
33
+
34
+ def _split_into_lines(self, text: str) -> List[str]:
35
+ """
36
+ 将文本分割为行
37
+
38
+ Args:
39
+ text: 输入文本
40
+
41
+ Returns:
42
+ 文本行列表
43
+ """
44
+ return text.splitlines()
45
+
46
+ def _levenshtein_ratio(self, s1: str, s2: str) -> float:
47
+ """
48
+ 计算两个字符串的莱文斯坦相似度比率
49
+
50
+ Args:
51
+ s1: 第一个字符串
52
+ s2: 第二个字符串
53
+
54
+ Returns:
55
+ 相似度比率 (0.0 - 1.0)
56
+ """
57
+ return SequenceMatcher(None, s1, s2).ratio()
58
+
59
+ def get_best_matching_window(self) -> Tuple[float, str]:
60
+ """
61
+ 获取最佳匹配窗口(原始实现)
62
+
63
+ 使用滑动窗口在目标文本中寻找与源文本最相似的片段。
64
+ 窗口大小固定为源文本的行数。
65
+
66
+ Returns:
67
+ Tuple[float, str]: (最佳相似度, 最佳匹配窗口的文本内容)
68
+ """
69
+ if self.m > self.n:
70
+ # 如果源文本比目标文本长,返回整个目标文本
71
+ similarity = self._levenshtein_ratio(self.text_a, self.text_b)
72
+ return similarity, self.text_b
73
+
74
+ best_similarity = 0
75
+ best_window = []
76
+
77
+ # 滑动窗口遍历
78
+ for i in range(self.n - self.m + 1):
79
+ window_b = self.lines_b[i:i + self.m]
80
+ similarity = self._levenshtein_ratio("\n".join(self.lines_a), "\n".join(window_b))
81
+
82
+ if similarity > best_similarity:
83
+ best_similarity = similarity
84
+ best_window = window_b
85
+
86
+ return best_similarity, "\n".join(best_window)
87
+
88
+ def get_best_matching_window_all_sizes(self) -> Tuple[float, str, Dict[str, Any]]:
89
+ """
90
+ 获取最佳匹配窗口(遍历所有窗口大小)
91
+
92
+ 遍历所有可能的窗口大小,找到得分最高的匹配窗口。
93
+ 这种方法更全面,但计算复杂度更高。
94
+
95
+ Returns:
96
+ Tuple[float, str, Dict[str, Any]]: (最佳相似度, 最佳匹配窗口的文本内容, 详细信息)
97
+ """
98
+ best_similarity = 0
99
+ best_window = ""
100
+ best_info = {
101
+ "window_size": 0,
102
+ "start_position": 0,
103
+ "end_position": 0,
104
+ "total_windows_checked": 0
105
+ }
106
+
107
+ total_windows = 0
108
+
109
+ # 遍历所有可能的窗口大小
110
+ for window_size in range(1, self.n + 1):
111
+ # 对于每个窗口大小,遍历所有可能的起始位置
112
+ for start_pos in range(self.n - window_size + 1):
113
+ end_pos = start_pos + window_size
114
+ window_b = self.lines_b[start_pos:end_pos]
115
+ window_text = "\n".join(window_b)
116
+
117
+ # 计算相似度
118
+ similarity = self._levenshtein_ratio(self.text_a, window_text)
119
+ total_windows += 1
120
+
121
+ if similarity > best_similarity:
122
+ best_similarity = similarity
123
+ best_window = window_text
124
+ best_info.update({
125
+ "window_size": window_size,
126
+ "start_position": start_pos,
127
+ "end_position": end_pos,
128
+ "total_windows_checked": total_windows
129
+ })
130
+
131
+ best_info["total_windows_checked"] = total_windows
132
+ return best_similarity, best_window, best_info
133
+
134
+ def get_similarity_matrix(self) -> List[List[float]]:
135
+ """
136
+ 获取行级别的相似度矩阵
137
+
138
+ 计算源文本的每一行与目标文本的每一行之间的相似度。
139
+
140
+ Returns:
141
+ 相似度矩阵,其中 matrix[i][j] 表示源文本第i行与目标文本第j行的相似度
142
+ """
143
+ matrix = []
144
+ for i, line_a in enumerate(self.lines_a):
145
+ row = []
146
+ for j, line_b in enumerate(self.lines_b):
147
+ similarity = self._levenshtein_ratio(line_a, line_b)
148
+ row.append(similarity)
149
+ matrix.append(row)
150
+ return matrix
151
+
152
+ def get_window_similarities(self, window_size: int = None) -> List[Tuple[int, float, str]]:
153
+ """
154
+ 获取所有窗口的相似度信息
155
+
156
+ Args:
157
+ window_size: 窗口大小,如果为None则使用源文本行数
158
+
159
+ Returns:
160
+ List[Tuple[int, float, str]]: (起始位置, 相似度, 窗口文本) 的列表
161
+ """
162
+ if window_size is None:
163
+ window_size = self.m
164
+
165
+ if window_size > self.n:
166
+ window_size = self.n
167
+
168
+ similarities = []
169
+ for i in range(self.n - window_size + 1):
170
+ window_b = self.lines_b[i:i + window_size]
171
+ window_text = "\n".join(window_b)
172
+ similarity = self._levenshtein_ratio(self.text_a, window_text)
173
+ similarities.append((i, similarity, window_text))
174
+
175
+ # 按相似度降序排序
176
+ similarities.sort(key=lambda x: x[1], reverse=True)
177
+ return similarities
178
+
179
+ def get_statistics(self) -> Dict[str, Any]:
180
+ """
181
+ 获取文本统计信息
182
+
183
+ Returns:
184
+ 包含各种统计信息的字典
185
+ """
186
+ return {
187
+ "text_a_lines": self.m,
188
+ "text_b_lines": self.n,
189
+ "text_a_chars": len(self.text_a),
190
+ "text_b_chars": len(self.text_b),
191
+ "possible_windows": max(0, self.n - self.m + 1) if self.m <= self.n else 0,
192
+ "full_text_similarity": self._levenshtein_ratio(self.text_a, self.text_b)
193
+ }
194
+
@@ -0,0 +1,125 @@
1
+
2
+ """
3
+ Text Similarity Utilities
4
+
5
+ 提供文本相似度计算的辅助工具函数。
6
+ """
7
+
8
+ from typing import List, Tuple, Dict, Any
9
+ from .text_similarity import TextSimilarity
10
+
11
+
12
+ def compare_texts_simple(text_a: str, text_b: str) -> Dict[str, Any]:
13
+ """
14
+ 简单的文本比较函数
15
+
16
+ Args:
17
+ text_a: 第一个文本
18
+ text_b: 第二个文本
19
+
20
+ Returns:
21
+ 包含比较结果的字典
22
+ """
23
+ similarity = TextSimilarity(text_a, text_b)
24
+
25
+ # 获取基本匹配结果
26
+ basic_score, basic_window = similarity.get_best_matching_window()
27
+
28
+ # 获取全面匹配结果
29
+ full_score, full_window, full_info = similarity.get_best_matching_window_all_sizes()
30
+
31
+ # 获取统计信息
32
+ stats = similarity.get_statistics()
33
+
34
+ return {
35
+ "basic_matching": {
36
+ "score": basic_score,
37
+ "window": basic_window
38
+ },
39
+ "comprehensive_matching": {
40
+ "score": full_score,
41
+ "window": full_window,
42
+ "details": full_info
43
+ },
44
+ "statistics": stats
45
+ }
46
+
47
+
48
+ def find_best_matches(text_a: str, text_b: str, top_k: int = 5) -> List[Dict[str, Any]]:
49
+ """
50
+ 查找最佳匹配的前K个结果
51
+
52
+ Args:
53
+ text_a: 源文本
54
+ text_b: 目标文本
55
+ top_k: 返回前K个最佳匹配
56
+
57
+ Returns:
58
+ 匹配结果列表,按相似度降序排列
59
+ """
60
+ similarity = TextSimilarity(text_a, text_b)
61
+ window_similarities = similarity.get_window_similarities()
62
+
63
+ results = []
64
+ for i, (start_pos, score, window_text) in enumerate(window_similarities[:top_k]):
65
+ results.append({
66
+ "rank": i + 1,
67
+ "start_position": start_pos,
68
+ "end_position": start_pos + similarity.m,
69
+ "similarity_score": score,
70
+ "window_text": window_text
71
+ })
72
+
73
+ return results
74
+
75
+
76
+ def analyze_text_similarity(text_a: str, text_b: str) -> Dict[str, Any]:
77
+ """
78
+ 全面分析两个文本的相似度
79
+
80
+ Args:
81
+ text_a: 第一个文本
82
+ text_b: 第二个文本
83
+
84
+ Returns:
85
+ 详细的相似度分析结果
86
+ """
87
+ similarity = TextSimilarity(text_a, text_b)
88
+
89
+ # 基本信息
90
+ stats = similarity.get_statistics()
91
+
92
+ # 基本窗口匹配
93
+ basic_score, basic_window = similarity.get_best_matching_window()
94
+
95
+ # 全面窗口匹配
96
+ full_score, full_window, full_info = similarity.get_best_matching_window_all_sizes()
97
+
98
+ # 相似度矩阵
99
+ matrix = similarity.get_similarity_matrix()
100
+
101
+ # 前5个最佳匹配
102
+ top_matches = find_best_matches(text_a, text_b, 5)
103
+
104
+ return {
105
+ "summary": {
106
+ "basic_best_score": basic_score,
107
+ "comprehensive_best_score": full_score,
108
+ "improvement": full_score - basic_score,
109
+ "total_windows_checked": full_info.get("total_windows_checked", 0)
110
+ },
111
+ "basic_matching": {
112
+ "score": basic_score,
113
+ "window": basic_window
114
+ },
115
+ "comprehensive_matching": {
116
+ "score": full_score,
117
+ "window": full_window,
118
+ "details": full_info
119
+ },
120
+ "top_matches": top_matches,
121
+ "statistics": stats,
122
+ "similarity_matrix_shape": (len(matrix), len(matrix[0]) if matrix else 0)
123
+ }
124
+
125
+
@@ -0,0 +1,61 @@
1
+ """
2
+ Todos management module for AutoCoder.
3
+
4
+ This module provides comprehensive todo and task management functionality
5
+ with conversation-based storage, caching, and session management.
6
+ """
7
+
8
+ from .exceptions import (
9
+ TodoManagerError,
10
+ TodoNotFoundError,
11
+ TodoListNotFoundError
12
+ )
13
+
14
+ from .models import (
15
+ Todo,
16
+ TodoList
17
+ )
18
+
19
+ from .config import TodoManagerConfig
20
+
21
+ # Storage layer
22
+ from .storage import (
23
+ BaseStorage,
24
+ FileStorage
25
+ )
26
+
27
+ # Cache layer
28
+ from .cache import (
29
+ BaseCache,
30
+ MemoryCache,
31
+ CacheManager
32
+ )
33
+
34
+ # Main manager
35
+ from .manager import TodoManager
36
+
37
+ __all__ = [
38
+ # Main manager
39
+ 'TodoManager',
40
+
41
+ # Exceptions
42
+ 'TodoManagerError',
43
+ 'TodoNotFoundError',
44
+ 'TodoListNotFoundError',
45
+
46
+ # Models
47
+ 'Todo',
48
+ 'TodoList',
49
+
50
+ # Configuration
51
+ 'TodoManagerConfig',
52
+
53
+ # Storage layer
54
+ 'BaseStorage',
55
+ 'FileStorage',
56
+
57
+ # Cache layer
58
+ 'BaseCache',
59
+ 'MemoryCache',
60
+ 'CacheManager'
61
+ ]
@@ -0,0 +1,16 @@
1
+ """
2
+ Cache module for todo management.
3
+
4
+ This module provides caching functionality for todos and todo lists,
5
+ including memory-based caching with LRU eviction and TTL support.
6
+ """
7
+
8
+ from .base_cache import BaseCache
9
+ from .memory_cache import MemoryCache
10
+ from .cache_manager import CacheManager
11
+
12
+ __all__ = [
13
+ 'BaseCache',
14
+ 'MemoryCache',
15
+ 'CacheManager'
16
+ ]