auto-coder 0.1.288__tar.gz → 0.1.290__tar.gz

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 (202) hide show
  1. {auto_coder-0.1.288 → auto_coder-0.1.290}/PKG-INFO +2 -2
  2. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/PKG-INFO +2 -2
  3. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/SOURCES.txt +4 -0
  4. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/requires.txt +1 -1
  5. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder_rag.py +10 -0
  6. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/chat_auto_coder_lang.py +16 -16
  7. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/__init__.py +4 -0
  8. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/auto_coder_lang.py +16 -4
  9. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/mcp_hub.py +99 -77
  10. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/mcp_server.py +162 -61
  11. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/filter/quick_filter.py +373 -3
  12. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/api_server.py +48 -0
  13. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/cache/byzer_storage_cache.py +254 -44
  14. auto_coder-0.1.290/src/autocoder/rag/cache/cache_result_merge.py +265 -0
  15. auto_coder-0.1.290/src/autocoder/rag/cache/file_monitor_cache.py +259 -0
  16. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/cache/local_byzer_storage_cache.py +286 -58
  17. auto_coder-0.1.290/src/autocoder/rag/cache/rag_file_meta.py +494 -0
  18. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/cache/simple_cache.py +67 -3
  19. auto_coder-0.1.290/src/autocoder/rag/conversation_to_queries.py +139 -0
  20. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/long_context_rag.py +31 -12
  21. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/qa_conversation_strategy.py +21 -10
  22. auto_coder-0.1.290/src/autocoder/rag/searchable.py +58 -0
  23. auto_coder-0.1.290/src/autocoder/version.py +1 -0
  24. auto_coder-0.1.288/src/autocoder/rag/cache/file_monitor_cache.py +0 -146
  25. auto_coder-0.1.288/src/autocoder/version.py +0 -1
  26. {auto_coder-0.1.288 → auto_coder-0.1.290}/LICENSE +0 -0
  27. {auto_coder-0.1.288 → auto_coder-0.1.290}/README.md +0 -0
  28. {auto_coder-0.1.288 → auto_coder-0.1.290}/setup.cfg +0 -0
  29. {auto_coder-0.1.288 → auto_coder-0.1.290}/setup.py +0 -0
  30. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  31. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/entry_points.txt +0 -0
  32. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/auto_coder.egg-info/top_level.txt +0 -0
  33. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/__init__.py +0 -0
  34. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/__init__.py +0 -0
  35. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  36. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_filegroup.py +0 -0
  37. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_guess_query.py +0 -0
  38. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  39. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_review_commit.py +0 -0
  40. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/auto_tool.py +0 -0
  41. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/coder.py +0 -0
  42. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/designer.py +0 -0
  43. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/planner.py +0 -0
  44. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/agent/project_reader.py +0 -0
  45. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder.py +0 -0
  46. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder_rag_client_mcp.py +0 -0
  47. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder_rag_mcp.py +0 -0
  48. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder_runner.py +0 -0
  49. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/auto_coder_server.py +0 -0
  50. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/benchmark.py +0 -0
  51. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/chat/__init__.py +0 -0
  52. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/chat_auto_coder.py +0 -0
  53. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/command_args.py +0 -0
  54. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/commands/__init__.py +0 -0
  55. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/commands/auto_command.py +0 -0
  56. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/commands/auto_web.py +0 -0
  57. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/commands/tools.py +0 -0
  58. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/JupyterClient.py +0 -0
  59. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/ShellClient.py +0 -0
  60. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/anything2images.py +0 -0
  61. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/anything2img.py +0 -0
  62. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/audio.py +0 -0
  63. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/auto_configure.py +0 -0
  64. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/buildin_tokenizer.py +0 -0
  65. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/chunk_validation.py +0 -0
  66. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/cleaner.py +0 -0
  67. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_execute.py +0 -0
  68. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_generate.py +0 -0
  69. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  70. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  71. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  72. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_merge.py +0 -0
  73. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  74. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  75. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  76. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/code_modification_ranker.py +0 -0
  77. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/command_completer.py +0 -0
  78. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/command_generator.py +0 -0
  79. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/command_templates.py +0 -0
  80. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/computer_use.py +0 -0
  81. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/conf_import_export.py +0 -0
  82. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/conf_validator.py +0 -0
  83. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/const.py +0 -0
  84. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/context_pruner.py +0 -0
  85. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/conversation_pruner.py +0 -0
  86. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/files.py +0 -0
  87. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/git_utils.py +0 -0
  88. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/global_cancel.py +0 -0
  89. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/image_to_page.py +0 -0
  90. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/index_import_export.py +0 -0
  91. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/interpreter.py +0 -0
  92. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/llm_rerank.py +0 -0
  93. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  94. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  95. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/mcp_tools.py +0 -0
  96. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/memory_manager.py +0 -0
  97. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/model_speed_test.py +0 -0
  98. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/printer.py +0 -0
  99. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/recall_validation.py +0 -0
  100. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/result_manager.py +0 -0
  101. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/screenshots.py +0 -0
  102. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/search.py +0 -0
  103. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/search_replace.py +0 -0
  104. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/shells.py +0 -0
  105. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/stats_panel.py +0 -0
  106. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/sys_prompt.py +0 -0
  107. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/text.py +0 -0
  108. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/types.py +0 -0
  109. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/common/utils_code_auto_generate.py +0 -0
  110. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/data/byzerllm.md +0 -0
  111. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/data/tokenizer.json +0 -0
  112. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/db/__init__.py +0 -0
  113. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/db/store.py +0 -0
  114. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/__init__.py +0 -0
  115. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/__init__.py +0 -0
  116. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/action.py +0 -0
  117. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/copilot.py +0 -0
  118. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  119. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  120. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/dispacher/actions/plugins/action_translate.py +0 -0
  121. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/__init__.py +0 -0
  122. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/entry.py +0 -0
  123. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/filter/__init__.py +0 -0
  124. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/filter/normal_filter.py +0 -0
  125. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/for_command.py +0 -0
  126. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/index.py +0 -0
  127. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/symbols_utils.py +0 -0
  128. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/index/types.py +0 -0
  129. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/lang.py +0 -0
  130. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/models.py +0 -0
  131. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/__init__.py +0 -0
  132. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
  133. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/git_helper_plugin.py +0 -0
  134. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/sample_plugin.py +0 -0
  135. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/token_helper_plugin.py +0 -0
  136. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/plugins/utils.py +0 -0
  137. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/privacy/__init__.py +0 -0
  138. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/privacy/model_filter.py +0 -0
  139. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/pyproject/__init__.py +0 -0
  140. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/__init__.py +0 -0
  141. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/cache/__init__.py +0 -0
  142. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/cache/base_cache.py +0 -0
  143. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/doc_filter.py +0 -0
  144. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/document_retriever.py +0 -0
  145. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/lang.py +0 -0
  146. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/llm_wrapper.py +0 -0
  147. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/loaders/__init__.py +0 -0
  148. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  149. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  150. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  151. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  152. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/rag_config.py +0 -0
  153. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/rag_entry.py +0 -0
  154. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/raw_rag.py +0 -0
  155. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/relevant_utils.py +0 -0
  156. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/simple_directory_reader.py +0 -0
  157. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/simple_rag.py +0 -0
  158. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/stream_event/__init__.py +0 -0
  159. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  160. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/stream_event/types.py +0 -0
  161. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/token_checker.py +0 -0
  162. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/token_counter.py +0 -0
  163. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/token_limiter.py +0 -0
  164. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/token_limiter_utils.py +0 -0
  165. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/types.py +0 -0
  166. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/utils.py +0 -0
  167. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/rag/variable_holder.py +0 -0
  168. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/regexproject/__init__.py +0 -0
  169. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/suffixproject/__init__.py +0 -0
  170. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/tsproject/__init__.py +0 -0
  171. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/__init__.py +0 -0
  172. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/_markitdown.py +0 -0
  173. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  174. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  175. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/auto_project_type.py +0 -0
  176. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  177. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/conversation_store.py +0 -0
  178. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  179. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/llms.py +0 -0
  180. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/log_capture.py +0 -0
  181. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/model_provider_selector.py +0 -0
  182. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/multi_turn.py +0 -0
  183. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/operate_config_api.py +0 -0
  184. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/print_table.py +0 -0
  185. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/project_structure.py +0 -0
  186. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/queue_communicate.py +0 -0
  187. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/request_event_queue.py +0 -0
  188. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/request_queue.py +0 -0
  189. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/rest.py +0 -0
  190. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/stream_thinking.py +0 -0
  191. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/tests.py +0 -0
  192. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/thread_utils.py +0 -0
  193. {auto_coder-0.1.288 → auto_coder-0.1.290}/src/autocoder/utils/types.py +0 -0
  194. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_action_regex_project.py +0 -0
  195. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_chat_auto_coder.py +0 -0
  196. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_code_auto_merge_editblock.py +0 -0
  197. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_command_completer.py +0 -0
  198. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_planner.py +0 -0
  199. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_plugins.py +0 -0
  200. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_privacy.py +0 -0
  201. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_queue_communicate.py +0 -0
  202. {auto_coder-0.1.288 → auto_coder-0.1.290}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.288
3
+ Version: 0.1.290
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.171
29
+ Requires-Dist: byzerllm[saas]>=0.1.174
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.288
3
+ Version: 0.1.290
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
26
26
  Requires-Dist: jupyter_client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
- Requires-Dist: byzerllm[saas]>=0.1.171
29
+ Requires-Dist: byzerllm[saas]>=0.1.174
30
30
  Requires-Dist: patch
31
31
  Requires-Dist: diff_match_patch
32
32
  Requires-Dist: GitPython
@@ -124,6 +124,7 @@ src/autocoder/privacy/model_filter.py
124
124
  src/autocoder/pyproject/__init__.py
125
125
  src/autocoder/rag/__init__.py
126
126
  src/autocoder/rag/api_server.py
127
+ src/autocoder/rag/conversation_to_queries.py
127
128
  src/autocoder/rag/doc_filter.py
128
129
  src/autocoder/rag/document_retriever.py
129
130
  src/autocoder/rag/lang.py
@@ -134,6 +135,7 @@ src/autocoder/rag/rag_config.py
134
135
  src/autocoder/rag/rag_entry.py
135
136
  src/autocoder/rag/raw_rag.py
136
137
  src/autocoder/rag/relevant_utils.py
138
+ src/autocoder/rag/searchable.py
137
139
  src/autocoder/rag/simple_directory_reader.py
138
140
  src/autocoder/rag/simple_rag.py
139
141
  src/autocoder/rag/token_checker.py
@@ -146,8 +148,10 @@ src/autocoder/rag/variable_holder.py
146
148
  src/autocoder/rag/cache/__init__.py
147
149
  src/autocoder/rag/cache/base_cache.py
148
150
  src/autocoder/rag/cache/byzer_storage_cache.py
151
+ src/autocoder/rag/cache/cache_result_merge.py
149
152
  src/autocoder/rag/cache/file_monitor_cache.py
150
153
  src/autocoder/rag/cache/local_byzer_storage_cache.py
154
+ src/autocoder/rag/cache/rag_file_meta.py
151
155
  src/autocoder/rag/cache/simple_cache.py
152
156
  src/autocoder/rag/loaders/__init__.py
153
157
  src/autocoder/rag/loaders/docx_loader.py
@@ -16,7 +16,7 @@ tabulate
16
16
  jupyter_client
17
17
  prompt-toolkit
18
18
  tokenizers
19
- byzerllm[saas]>=0.1.171
19
+ byzerllm[saas]>=0.1.174
20
20
  patch
21
21
  diff_match_patch
22
22
  GitPython
@@ -262,6 +262,7 @@ def main(input_args: Optional[List[str]] = None):
262
262
  serve_parser.add_argument("--source_dir", default=".", help="")
263
263
  serve_parser.add_argument("--host", default="", help="")
264
264
  serve_parser.add_argument("--port", type=int, default=8000, help="")
265
+ serve_parser.add_argument("--workers", type=int, default=4, help="")
265
266
  serve_parser.add_argument("--uvicorn_log_level", default="info", help="")
266
267
  serve_parser.add_argument("--allow_credentials", action="store_true", help="")
267
268
  serve_parser.add_argument("--allowed_origins", default=["*"], help="")
@@ -274,6 +275,7 @@ def main(input_args: Optional[List[str]] = None):
274
275
  serve_parser.add_argument("--ssl_certfile", default="", help="")
275
276
  serve_parser.add_argument("--response_role", default="assistant", help="")
276
277
  serve_parser.add_argument("--doc_dir", default="", help="")
278
+ serve_parser.add_argument("--enable_local_image_host", action="store_true", help=" enable local image host for local Chat app")
277
279
  serve_parser.add_argument("--tokenizer_path", default=tokenizer_path, help="")
278
280
  serve_parser.add_argument(
279
281
  "--collections", default="", help="Collection name for indexing"
@@ -516,6 +518,14 @@ def main(input_args: Optional[List[str]] = None):
516
518
  if hasattr(args, arg)
517
519
  }
518
520
  )
521
+ # 设置本地图床的地址
522
+ if args.enable_local_image_host:
523
+ host = server_args.host or "127.0.0.1"
524
+ if host == "0.0.0.0":
525
+ host = "127.0.0.1"
526
+ port = str(server_args.port)
527
+ auto_coder_args.local_image_host = f"{host}:{port}"
528
+
519
529
 
520
530
  # Generate unique name for RAG build if doc_dir exists
521
531
  if server_args.doc_dir:
@@ -4,16 +4,16 @@ from byzerllm.utils import format_str_jinja2
4
4
  MESSAGES = {
5
5
  "en": {
6
6
  "auto_command_analyzing": "Analyzing Command Request",
7
- "mcp_remove_error": "Error removing MCP server: {error}",
8
- "mcp_remove_success": "Successfully removed MCP server: {result}",
9
- "mcp_list_running_error": "Error listing running MCP servers: {error}",
7
+ "mcp_remove_error": "Error removing MCP server: {{error}}",
8
+ "mcp_remove_success": "Successfully removed MCP server: {{result}}",
9
+ "mcp_list_running_error": "Error listing running MCP servers: {{error}}",
10
10
  "mcp_list_running_title": "Running MCP servers:",
11
- "mcp_list_builtin_error": "Error listing builtin MCP servers: {error}",
11
+ "mcp_list_builtin_error": "Error listing builtin MCP servers: {{error}}",
12
12
  "mcp_list_builtin_title": "Available builtin MCP servers:",
13
- "mcp_refresh_error": "Error refreshing MCP servers: {error}",
13
+ "mcp_refresh_error": "Error refreshing MCP servers: {{error}}",
14
14
  "mcp_refresh_success": "Successfully refreshed MCP servers",
15
- "mcp_install_error": "Error installing MCP server: {error}",
16
- "mcp_install_success": "Successfully installed MCP server: {result}",
15
+ "mcp_install_error": "Error installing MCP server: {{error}}",
16
+ "mcp_install_success": "Successfully installed MCP server: {{result}}",
17
17
  "mcp_query_empty": "Please enter your query.",
18
18
  "mcp_error_title": "Error",
19
19
  "mcp_response_title": "MCP Response",
@@ -24,7 +24,7 @@ MESSAGES = {
24
24
  "init_fail": "Failed to initialize the project.",
25
25
  "init_manual": "Please try manually: auto-coder init --source_dir .",
26
26
  "exit_no_init": "Exiting without initialization.",
27
- "created_dir": "Created directory: {}",
27
+ "created_dir": "Created directory: {{path}}",
28
28
  "init_complete": "Project initialization completed.",
29
29
  "checking_ray": "Checking Ray status...",
30
30
  "ray_not_running": "Ray is not running. Starting Ray...",
@@ -145,16 +145,16 @@ MESSAGES = {
145
145
  "auto_command_reasoning_title": "回复",
146
146
  "commit_message": "{{ model_name }} 生成的提交信息: {{ message }}",
147
147
  "commit_failed": "{{ model_name }} 生成提交信息失败: {{ error }}",
148
- "mcp_remove_error": "移除 MCP 服务器时出错:{error}",
149
- "mcp_remove_success": "成功移除 MCP 服务器:{result}",
150
- "mcp_list_running_error": "列出运行中的 MCP 服务器时出错:{error}",
148
+ "mcp_remove_error": "移除 MCP 服务器时出错:{{error}}",
149
+ "mcp_remove_success": "成功移除 MCP 服务器:{{result}}",
150
+ "mcp_list_running_error": "列出运行中的 MCP 服务器时出错:{{error}}",
151
151
  "mcp_list_running_title": "正在运行的 MCP 服务器:",
152
- "mcp_list_builtin_error": "列出内置 MCP 服务器时出错:{error}",
152
+ "mcp_list_builtin_error": "列出内置 MCP 服务器时出错:{{error}}",
153
153
  "mcp_list_builtin_title": "可用的内置 MCP 服务器:",
154
- "mcp_refresh_error": "刷新 MCP 服务器时出错:{error}",
154
+ "mcp_refresh_error": "刷新 MCP 服务器时出错:{{error}}",
155
155
  "mcp_refresh_success": "成功刷新 MCP 服务器",
156
- "mcp_install_error": "安装 MCP 服务器时出错:{error}",
157
- "mcp_install_success": "成功安装 MCP 服务器:{result}",
156
+ "mcp_install_error": "安装 MCP 服务器时出错:{{error}}",
157
+ "mcp_install_success": "成功安装 MCP 服务器:{{result}}",
158
158
  "mcp_query_empty": "请输入您的查询。",
159
159
  "mcp_error_title": "错误",
160
160
  "mcp_response_title": "MCP 响应",
@@ -165,7 +165,7 @@ MESSAGES = {
165
165
  "init_fail": "项目初始化失败。",
166
166
  "init_manual": "请尝试手动初始化:auto-coder init --source_dir .",
167
167
  "exit_no_init": "退出而不初始化。",
168
- "created_dir": "创建目录:{}",
168
+ "created_dir": "创建目录:{{path}}",
169
169
  "init_complete": "项目初始化完成。",
170
170
  "checking_ray": "正在检查Ray状态...",
171
171
  "ray_not_running": "Ray未运行。正在启动Ray...",
@@ -296,6 +296,10 @@ class AutoCoderArgs(pydantic.BaseModel):
296
296
  rag_params_max_tokens: Optional[int] = 4096
297
297
  rag_doc_filter_relevance: Optional[int] = 5
298
298
  rag_context_window_limit: Optional[int] = 120000
299
+ # rag 本地图床地址
300
+ local_image_host: Optional[str] = ""
301
+ rag_recall_max_queries: Optional[int] = 5
302
+
299
303
 
300
304
  # 回答用户问题时,使用哪种对话历史策略
301
305
  # single_round: 单轮对话
@@ -184,9 +184,14 @@ MESSAGES = {
184
184
  "action_verification_failed": "Action verification failed: {{action}} - {{reason}}",
185
185
  "action_succeeded": "Action succeeded: {{action}}",
186
186
  "replanned_actions": "Replanned {{count}} actions",
187
- "web_automation_ask_user": "Your answer: " # 新增消息
188
-
189
-
187
+ "web_automation_ask_user": "Your answer: ",
188
+ "filter_mode_normal": "Using normal filter mode for index processing...",
189
+ "filter_mode_big": "Index file is large ({{ tokens_len }} tokens), using big_filter mode for processing...",
190
+ "filter_mode_super_big": "Index file is very large ({{ tokens_len }} tokens), using super_big_filter mode for processing...",
191
+ "super_big_filter_failed": "❌ Super big filter failed: {{ error }}.",
192
+ "super_big_filter_stats": "{{ model_names }} Super big filter completed in {{ elapsed_time }} seconds, input tokens: {{ input_tokens }}, output tokens: {{ output_tokens }}, input cost: {{ input_cost }}, output cost: {{ output_cost }}, speed: {{ speed }} tokens/s, chunk_index: {{ chunk_index }}",
193
+ "super_big_filter_splitting": "⚠️ Index file is extremely large ({{ tokens_len }}/{{ max_tokens }}). The query will be split into {{ split_size }} chunks for processing.",
194
+ "super_big_filter_title": "{{ model_name }} is analyzing how to filter extremely large context..."
190
195
  },
191
196
  "zh": {
192
197
  "file_sliding_window_processing": "文件 {{ file_path }} 过大 ({{ tokens }} tokens),正在使用滑动窗口处理...",
@@ -368,7 +373,14 @@ MESSAGES = {
368
373
  "action_verification_failed": "操作验证失败: {{action}} - {{reason}}",
369
374
  "action_succeeded": "操作成功: {{action}}",
370
375
  "replanned_actions": "已重新规划 {{count}} 个操作",
371
- "web_automation_ask_user": "您的回答: " # 新增消息
376
+ "web_automation_ask_user": "您的回答: ",
377
+ "filter_mode_normal": "正在使用普通过滤模式处理索引...",
378
+ "filter_mode_big": "索引文件较大 ({{ tokens_len }} tokens),正在使用 big_filter 模式处理...",
379
+ "filter_mode_super_big": "索引文件非常大 ({{ tokens_len }} tokens),正在使用 super_big_filter 模式处理...",
380
+ "super_big_filter_failed": "❌ 超大过滤器失败: {{ error }}.",
381
+ "super_big_filter_stats": "{{ model_names }} 超大过滤器完成耗时 {{ elapsed_time }} 秒,输入token数: {{ input_tokens }}, 输出token数: {{ output_tokens }}, 输入成本: {{ input_cost }}, 输出成本: {{ output_cost }}, 速度: {{ speed }} tokens/秒, 块索引: {{ chunk_index }}",
382
+ "super_big_filter_splitting": "⚠️ 索引文件极其庞大 ({{ tokens_len }}/{{ max_tokens }})。查询将被分成 {{ split_size }} 个部分进行处理。",
383
+ "super_big_filter_title": "{{ model_name }} 正在分析如何过滤极大规模上下文..."
372
384
  }}
373
385
 
374
386
 
@@ -2,16 +2,18 @@ import os
2
2
  import json
3
3
  import asyncio
4
4
  import aiohttp
5
- from datetime import datetime
5
+ from datetime import datetime, timedelta
6
6
  from typing import Dict, List, Optional, Any, Set, Optional
7
7
  from pathlib import Path
8
8
  from pydantic import BaseModel, Field
9
9
 
10
10
  from mcp import ClientSession
11
11
  from mcp.client.stdio import stdio_client, StdioServerParameters
12
+ from mcp.client.sse import sse_client
12
13
  import mcp.types as mcp_types
13
14
  from loguru import logger
14
- import time
15
+ from contextlib import AsyncExitStack
16
+ from datetime import timedelta
15
17
 
16
18
 
17
19
  class McpTool(BaseModel):
@@ -55,12 +57,9 @@ class McpServer(BaseModel):
55
57
  class McpConnection:
56
58
  """Represents an active MCP server connection"""
57
59
 
58
- def __init__(self, server: McpServer, session: ClientSession, transport_manager):
60
+ def __init__(self, server: McpServer, session: ClientSession):
59
61
  self.server = server
60
- self.session = session
61
- self.transport_manager = (
62
- transport_manager # Will hold transport context manager
63
- )
62
+ self.session = session
64
63
 
65
64
 
66
65
  MCP_PERPLEXITY_SERVER = '''
@@ -81,6 +80,7 @@ MCP_BUILD_IN_SERVERS = {
81
80
  "perplexity": json.loads(MCP_PERPLEXITY_SERVER)["perplexity"]
82
81
  }
83
82
 
83
+
84
84
  class McpHub:
85
85
  """
86
86
  Manages MCP server connections and interactions.
@@ -105,6 +105,7 @@ class McpHub:
105
105
  self.settings_path = Path(settings_path)
106
106
  self.connections: Dict[str, McpConnection] = {}
107
107
  self.is_connecting = False
108
+ self.exit_stacks: Dict[str, AsyncExitStack] = {}
108
109
 
109
110
  # Ensure settings directory exists
110
111
  self.settings_path.parent.mkdir(parents=True, exist_ok=True)
@@ -116,26 +117,31 @@ class McpHub:
116
117
  def _write_default_settings(self):
117
118
  """Write default MCP settings file"""
118
119
  default_settings = {"mcpServers": {}}
119
- with open(self.settings_path, "w",encoding="utf-8") as f:
120
+ with open(self.settings_path, "w", encoding="utf-8") as f:
120
121
  json.dump(default_settings, f, indent=2)
121
122
 
122
- async def add_server_config(self, name: str, config:Dict[str,Any]) -> None:
123
+ async def add_server_config(self, name: str, config: Dict[str, Any]) -> None:
123
124
  """
124
125
  Add or update MCP server configuration in settings file.
125
126
 
126
127
  Args:
127
128
  server_name_or_config: Name of the server or server configuration dictionary
128
129
  """
129
- try:
130
- settings = self._read_settings()
131
- settings["mcpServers"][name] = config
132
- with open(self.settings_path, "w",encoding="utf-8") as f:
133
- json.dump(settings, f, indent=2, ensure_ascii=False)
134
- await self.initialize()
135
- logger.info(f"Added/updated MCP server config: {name}")
136
- except Exception as e:
137
- logger.error(f"Failed to add MCP server config: {e}")
138
- raise
130
+ settings = self._read_settings()
131
+ settings["mcpServers"][name] = config
132
+ with open(self.settings_path, "w", encoding="utf-8") as f:
133
+ json.dump(settings, f, indent=2, ensure_ascii=False)
134
+ await self.initialize()
135
+ if name in self.connections:
136
+ if self.connections[name].server.status == "connected":
137
+ logger.info(f"Added/updated MCP server config: {name}")
138
+ return True
139
+ else:
140
+ logger.error(f"Failed to add MCP server config: {name}")
141
+ return False
142
+ else:
143
+ logger.error(f"Failed to add MCP server config: {name}")
144
+ return False
139
145
 
140
146
  async def remove_server_config(self, name: str) -> None:
141
147
  """
@@ -148,7 +154,7 @@ class McpHub:
148
154
  settings = self._read_settings()
149
155
  if name in settings["mcpServers"]:
150
156
  del settings["mcpServers"][name]
151
- with open(self.settings_path, "w",encoding="utf-8") as f:
157
+ with open(self.settings_path, "w", encoding="utf-8") as f:
152
158
  json.dump(settings, f, indent=2, ensure_ascii=False)
153
159
  logger.info(f"Removed MCP server config: {name}")
154
160
  await self.initialize()
@@ -160,18 +166,14 @@ class McpHub:
160
166
 
161
167
  async def initialize(self):
162
168
  """Initialize MCP server connections from settings"""
163
- try:
164
- config = self._read_settings()
165
- await self.update_server_connections(config.get("mcpServers", {}))
166
- except Exception as e:
167
- logger.error(f"Failed to initialize MCP servers: {e}")
168
- raise
169
+ config = self._read_settings()
170
+ await self.update_server_connections(config.get("mcpServers", {}))
169
171
 
170
172
  def get_servers(self) -> List[McpServer]:
171
173
  """Get list of all configured servers"""
172
174
  return [conn.server for conn in self.connections.values()]
173
175
 
174
- async def connect_to_server(self, name: str, config: dict) -> None:
176
+ async def connect_to_server(self, name: str, config: dict) -> McpServer:
175
177
  """
176
178
  Establish connection to an MCP server with proper resource management
177
179
  """
@@ -179,79 +181,90 @@ class McpHub:
179
181
  if name in self.connections:
180
182
  await self.delete_connection(name)
181
183
 
182
- try:
183
- server = McpServer(
184
- name=name, config=json.dumps(config), status="connecting"
185
- )
184
+ self.exit_stacks[name] = AsyncExitStack()
185
+ exit_stack = self.exit_stacks[name]
186
+
187
+ server = McpServer(
188
+ name=name, config=json.dumps(config), status="connecting"
189
+ )
190
+ transport_config = config.get("transport", {
191
+ "type": "stdio",
192
+ "endpoint":""
193
+ })
186
194
 
195
+ if transport_config["type"] not in ["stdio", "sse"]:
196
+ raise ValueError(f"Invalid transport type: {transport_config['type']}")
197
+
198
+ if transport_config["type"] == "stdio":
187
199
  # Setup transport parameters
188
200
  server_params = StdioServerParameters(
189
201
  command=config["command"],
190
202
  args=config.get("args", []),
191
203
  env={**config.get("env", {}),
192
- "PATH": os.environ.get("PATH", "")},
204
+ "PATH": os.environ.get("PATH", "")},
193
205
  )
194
206
 
195
- # Create transport using context manager
196
- transport_manager = stdio_client(server_params)
197
- transport = await transport_manager.__aenter__()
198
- try:
199
- session = await ClientSession(transport[0], transport[1]).__aenter__()
200
- await session.initialize()
201
-
202
- # Store connection with transport manager
203
- connection = McpConnection(server, session, transport_manager)
204
- self.connections[name] = connection
205
-
206
- # Update server status and fetch capabilities
207
- server.status = "connected"
208
- server.tools = await self._fetch_tools(name)
209
- server.resources = await self._fetch_resources(name)
210
- server.resource_templates = await self._fetch_resource_templates(name)
211
-
212
- except Exception as e:
213
- # Clean up transport if session initialization fails
214
-
215
- await transport_manager.__aexit__(None, None, None)
216
- raise
217
-
207
+ # Create transport using context manager
208
+ transport = await exit_stack.enter_async_context(stdio_client(server_params))
209
+
210
+ if transport_config["type"] == "sse":
211
+ url = transport_config["endpoint"]
212
+ transport = await exit_stack.enter_async_context(sse_client(url))
213
+
214
+
215
+ try:
216
+ stdio, write = transport
217
+ session = await exit_stack.enter_async_context(
218
+ ClientSession(stdio, write, read_timeout_seconds=timedelta(seconds=60)))
219
+ await session.initialize()
220
+ connection = McpConnection(server, session)
221
+ self.connections[name] = connection
222
+ # Update server status and fetch capabilities
223
+ server.status = "connected"
224
+ server.tools = await self._fetch_tools(name)
225
+ server.resources = await self._fetch_resources(name)
226
+ server.resource_templates = await self._fetch_resource_templates(name)
227
+ return server
228
+
218
229
  except Exception as e:
219
230
  error_msg = str(e)
220
231
  logger.error(f"Failed to connect to server {name}: {error_msg}")
221
232
  if name in self.connections:
222
233
  self.connections[name].server.status = "disconnected"
223
234
  self.connections[name].server.error = error_msg
224
- raise
235
+ return server
236
+
237
+
238
+
239
+
240
+
225
241
 
226
242
  async def delete_connection(self, name: str) -> None:
227
243
  """
228
244
  Close and remove a server connection with proper cleanup
229
245
  """
230
246
  if name in self.connections:
231
- try:
232
- connection = self.connections[name]
233
- # Clean up in reverse order of creation
234
- await connection.session.__aexit__(None, None, None)
235
- await connection.transport_manager.__aexit__(None, None, None)
247
+
248
+ try:
236
249
  del self.connections[name]
237
250
  except Exception as e:
238
251
  logger.error(f"Error closing connection to {name}: {e}")
239
- # Continue with deletion even if cleanup fails
240
- if name in self.connections:
241
- del self.connections[name]
252
+
253
+ try:
254
+ exit_stack = self.exit_stacks[name]
255
+ await exit_stack.aclose()
256
+ del self.exit_stacks[name]
257
+ except Exception as e:
258
+ logger.error(f"Error cleaning up to {name}: {e}")
259
+
242
260
 
243
261
  async def refresh_server_connection(self, name: str) -> None:
244
262
  """
245
263
  Refresh a server connection
246
264
  """
247
- try:
248
- config = self._read_settings()
249
- await self.delete_connection(name)
250
- await self.connect_to_server(name, config.get("mcpServers", {}).get(name, {}))
251
- except Exception as e:
252
- logger.error(f"Failed to refresh MCP server {name}: {e}")
253
- raise
254
-
265
+ config = self._read_settings()
266
+ await self.delete_connection(name)
267
+ await self.connect_to_server(name, config.get("mcpServers", {}).get(name, {}))
255
268
 
256
269
  async def update_server_connections(self, new_servers: Dict[str, Any]) -> None:
257
270
  """
@@ -273,13 +286,22 @@ class McpHub:
273
286
 
274
287
  if not current_conn:
275
288
  # New server
276
- await self.connect_to_server(name, config)
277
- logger.info(f"Connected to new MCP server: {name}")
289
+ server = await self.connect_to_server(name, config)
290
+ if server.status == "connected":
291
+ logger.info(f"Connected to new MCP server: {name}")
292
+ else:
293
+ logger.error(
294
+ f"Failed to connect to new MCP server: {name}")
295
+
278
296
  elif current_conn.server.config != json.dumps(config):
279
297
  # Updated configuration
280
- await self.connect_to_server(name, config)
281
- logger.info(
282
- f"Reconnected MCP server with updated config: {name}")
298
+ server = await self.connect_to_server(name, config)
299
+ if server.status == "connected":
300
+ logger.info(
301
+ f"Reconnected MCP server with updated config: {name}")
302
+ else:
303
+ logger.error(
304
+ f"Failed to reconnected MCP server with updated config: {name}")
283
305
 
284
306
  finally:
285
307
  self.is_connecting = False