mindroot 9.11.0__py3-none-any.whl → 9.13.0__py3-none-any.whl

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

Potentially problematic release.


This version of mindroot might be problematic. Click here for more details.

Files changed (417) hide show
  1. mindroot/coreplugins/admin/static/js/model-preferences-v2.js +1 -1
  2. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  3. mindroot/docs/Makefile +20 -0
  4. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  5. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  6. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  7. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  8. mindroot/docs/_build/doctrees/index.doctree +0 -0
  9. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  10. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  13. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  45. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  46. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  47. mindroot/docs/_build/html/.buildinfo +4 -0
  48. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  49. mindroot/docs/_build/html/_images/envvar.png +0 -0
  50. mindroot/docs/_build/html/_images/files.png +0 -0
  51. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  52. mindroot/docs/_build/html/_images/mood.png +0 -0
  53. mindroot/docs/_build/html/_images/moon.png +0 -0
  54. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  55. mindroot/docs/_build/html/_images/restart.png +0 -0
  56. mindroot/docs/_build/html/_modules/index.html +425 -0
  57. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  152. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  153. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  182. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  183. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  184. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  185. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  186. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  188. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  189. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  190. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  191. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  192. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  193. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  194. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  195. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  196. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  197. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  198. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  199. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  226. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  227. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  228. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  229. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  230. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  231. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  232. mindroot/docs/_build/html/_static/basic.css +906 -0
  233. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  234. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  250. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  251. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  252. mindroot/docs/_build/html/_static/custom.css +19 -0
  253. mindroot/docs/_build/html/_static/debug.css +69 -0
  254. mindroot/docs/_build/html/_static/doctools.js +149 -0
  255. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  256. mindroot/docs/_build/html/_static/file.png +0 -0
  257. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  272. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  273. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  280. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  281. mindroot/docs/_build/html/_static/jquery.js +2 -0
  282. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  283. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  284. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  285. mindroot/docs/_build/html/_static/language_data.js +192 -0
  286. mindroot/docs/_build/html/_static/minus.png +0 -0
  287. mindroot/docs/_build/html/_static/plus.png +0 -0
  288. mindroot/docs/_build/html/_static/pygments.css +232 -0
  289. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  290. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  292. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  293. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  294. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  295. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  296. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  297. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  298. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  299. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  300. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  301. mindroot/docs/_build/html/developer_documentation.html +338 -0
  302. mindroot/docs/_build/html/genindex.html +4690 -0
  303. mindroot/docs/_build/html/getting_started.html +423 -0
  304. mindroot/docs/_build/html/index.html +357 -0
  305. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  306. mindroot/docs/_build/html/installation.html +330 -0
  307. mindroot/docs/_build/html/llm_api_key.html +337 -0
  308. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  309. mindroot/docs/_build/html/objects.inv +0 -0
  310. mindroot/docs/_build/html/programming_task.html +326 -0
  311. mindroot/docs/_build/html/py-modindex.html +1307 -0
  312. mindroot/docs/_build/html/search.html +307 -0
  313. mindroot/docs/_build/html/searchindex.js +1 -0
  314. mindroot/docs/_build/html/source/ahp.html +302 -0
  315. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  334. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  335. mindroot/docs/_build/html/source/mindroot.html +811 -0
  336. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  341. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  342. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  343. mindroot/docs/_build/html/source/modules.html +377 -0
  344. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  345. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  346. mindroot/docs/_build/html/user_documentation.html +333 -0
  347. mindroot/docs/_static/custom.css +19 -0
  348. mindroot/docs/chat_with_assistant.rst +14 -0
  349. mindroot/docs/conf.py +54 -0
  350. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  351. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  352. mindroot/docs/data/equivalent_flags.json +1 -0
  353. mindroot/docs/data/mcp/servers.json +9 -0
  354. mindroot/docs/data/models.json +57 -0
  355. mindroot/docs/data/plugin_manifest.json +95 -0
  356. mindroot/docs/data/preferred_models.json +12 -0
  357. mindroot/docs/data/providers.json +62 -0
  358. mindroot/docs/developer_documentation.rst +26 -0
  359. mindroot/docs/envvar.png +0 -0
  360. mindroot/docs/files.png +0 -0
  361. mindroot/docs/getting_started.rst +139 -0
  362. mindroot/docs/index.rst +38 -0
  363. mindroot/docs/install_plugins_with_tools.rst +25 -0
  364. mindroot/docs/installation.rst +21 -0
  365. mindroot/docs/installopenrouter.png +0 -0
  366. mindroot/docs/llm_api_key.rst +22 -0
  367. mindroot/docs/llm_plugin_installation.rst +27 -0
  368. mindroot/docs/make.bat +35 -0
  369. mindroot/docs/mood.png +0 -0
  370. mindroot/docs/moon.png +0 -0
  371. mindroot/docs/openrouter.png +0 -0
  372. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  373. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  374. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  375. mindroot/docs/programming_task.rst +10 -0
  376. mindroot/docs/restart.png +0 -0
  377. mindroot/docs/source/ahp.rst +7 -0
  378. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  379. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  380. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  381. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  382. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  383. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  384. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  385. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  386. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  387. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  388. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  389. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  390. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  391. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  392. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  393. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  394. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  395. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  396. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  397. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  398. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  399. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  400. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  401. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  402. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  403. mindroot/docs/source/mindroot.lib.rst +152 -0
  404. mindroot/docs/source/mindroot.registry.rst +29 -0
  405. mindroot/docs/source/mindroot.rst +54 -0
  406. mindroot/docs/source/modules.rst +7 -0
  407. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  408. mindroot/docs/starting_mindroot.rst +12 -0
  409. mindroot/docs/user_documentation.rst +16 -0
  410. mindroot/lib/providers/model_preferences_v2.py +5 -3
  411. mindroot/server.py +10 -1
  412. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/METADATA +1 -1
  413. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/RECORD +417 -10
  414. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/WHEEL +0 -0
  415. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/entry_points.txt +0 -0
  416. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/licenses/LICENSE +0 -0
  417. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,610 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.coreplugins.admin.plugin_manager &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
43
+ <ul>
44
+ <li class="toctree-l1"><a class="reference internal" href="../../../../getting_started.html">Getting Started</a></li>
45
+ </ul>
46
+
47
+ </div>
48
+ </div>
49
+ </nav>
50
+
51
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
52
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
53
+ <a href="../../../../index.html">MindRoot</a>
54
+ </nav>
55
+
56
+ <div class="wy-nav-content">
57
+ <div class="rst-content">
58
+ <div role="navigation" aria-label="Page navigation">
59
+ <ul class="wy-breadcrumbs">
60
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
61
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
62
+ <li class="breadcrumb-item active">mindroot.coreplugins.admin.plugin_manager</li>
63
+ <li class="wy-breadcrumbs-aside">
64
+ </li>
65
+ </ul>
66
+ <hr/>
67
+ </div>
68
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
69
+ <div itemprop="articleBody">
70
+
71
+ <h1>Source code for mindroot.coreplugins.admin.plugin_manager</h1><div class="highlight"><pre>
72
+ <span></span><span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">APIRouter</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">,</span> <span class="n">Request</span>
73
+ <span class="kn">from</span><span class="w"> </span><span class="nn">pydantic</span><span class="w"> </span><span class="kn">import</span> <span class="n">BaseModel</span>
74
+ <span class="kn">from</span><span class="w"> </span><span class="nn">sse_starlette.sse</span><span class="w"> </span><span class="kn">import</span> <span class="n">EventSourceResponse</span>
75
+ <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
76
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
77
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
78
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>
79
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
80
+ <span class="n">load_plugin_manifest</span><span class="p">,</span> <span class="n">update_plugin_manifest</span><span class="p">,</span> <span class="n">plugin_install</span><span class="p">,</span>
81
+ <span class="n">save_plugin_manifest</span><span class="p">,</span> <span class="n">plugin_update</span><span class="p">,</span> <span class="n">toggle_plugin_state</span><span class="p">,</span> <span class="n">get_plugin_path</span>
82
+ <span class="p">)</span>
83
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.plugins.installation</span><span class="w"> </span><span class="kn">import</span> <span class="n">download_github_files</span>
84
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.streamcmd</span><span class="w"> </span><span class="kn">import</span> <span class="n">stream_command_as_events</span>
85
+ <span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
86
+ <span class="kn">import</span><span class="w"> </span><span class="nn">httpx</span>
87
+
88
+
89
+ <span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">()</span>
90
+
91
+ <div class="viewcode-block" id="DirectoryRequest">
92
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.DirectoryRequest">[docs]</a>
93
+ <span class="k">class</span><span class="w"> </span><span class="nc">DirectoryRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
94
+ <span class="n">directory</span><span class="p">:</span> <span class="nb">str</span></div>
95
+
96
+
97
+ <div class="viewcode-block" id="PluginRequest">
98
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.PluginRequest">[docs]</a>
99
+ <span class="k">class</span><span class="w"> </span><span class="nc">PluginRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
100
+ <span class="n">plugin</span><span class="p">:</span> <span class="nb">str</span></div>
101
+
102
+
103
+ <div class="viewcode-block" id="GitHubPluginRequest">
104
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.GitHubPluginRequest">[docs]</a>
105
+ <span class="k">class</span><span class="w"> </span><span class="nc">GitHubPluginRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
106
+ <span class="n">plugin</span><span class="p">:</span> <span class="nb">str</span>
107
+ <span class="n">url</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
108
+ <span class="n">github_url</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span></div>
109
+
110
+
111
+ <div class="viewcode-block" id="TogglePluginRequest">
112
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.TogglePluginRequest">[docs]</a>
113
+ <span class="k">class</span><span class="w"> </span><span class="nc">TogglePluginRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
114
+ <span class="n">plugin</span><span class="p">:</span> <span class="nb">str</span>
115
+ <span class="n">enabled</span><span class="p">:</span> <span class="nb">bool</span></div>
116
+
117
+
118
+ <div class="viewcode-block" id="InstallFromIndexRequest">
119
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.InstallFromIndexRequest">[docs]</a>
120
+ <span class="k">class</span><span class="w"> </span><span class="nc">InstallFromIndexRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
121
+ <span class="n">plugin</span><span class="p">:</span> <span class="nb">str</span>
122
+ <span class="n">index_name</span><span class="p">:</span> <span class="nb">str</span></div>
123
+
124
+
125
+ <div class="viewcode-block" id="StreamInstallRequest">
126
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.StreamInstallRequest">[docs]</a>
127
+ <span class="k">class</span><span class="w"> </span><span class="nc">StreamInstallRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
128
+ <span class="n">plugin</span><span class="p">:</span> <span class="nb">str</span>
129
+ <span class="n">source</span><span class="p">:</span> <span class="nb">str</span>
130
+ <span class="n">source_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span></div>
131
+
132
+
133
+ <div class="viewcode-block" id="PluginMetadata">
134
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.PluginMetadata">[docs]</a>
135
+ <span class="k">class</span><span class="w"> </span><span class="nc">PluginMetadata</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
136
+ <span class="n">description</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
137
+ <span class="n">commands</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
138
+ <span class="n">services</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
139
+ <span class="n">dependencies</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span></div>
140
+
141
+
142
+ <span class="kn">import</span><span class="w"> </span><span class="nn">sys</span><span class="o">,</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">shlex</span>
143
+
144
+ <div class="viewcode-block" id="stream_install_plugin">
145
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.stream_install_plugin">[docs]</a>
146
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/stream-install-plugin&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">EventSourceResponse</span><span class="p">)</span>
147
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_install_plugin</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">StreamInstallRequest</span><span class="p">):</span>
148
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Stream the installation process of a plugin using SSE (POST method).&quot;&quot;&quot;</span>
149
+ <span class="c1"># Prepare the command based on the source</span>
150
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Stream Install Request:&quot;</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
151
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;github_direct&#39;</span> <span class="ow">or</span> <span class="n">request</span><span class="o">.</span><span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;github&#39;</span><span class="p">:</span>
152
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">source_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">):</span>
153
+ <span class="c1"># For direct GitHub URLs, we can use the pip install directly</span>
154
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">source_path</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
155
+ <span class="k">else</span><span class="p">:</span>
156
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">source_path</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
157
+ <span class="k">elif</span> <span class="n">request</span><span class="o">.</span><span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;local&#39;</span><span class="p">:</span>
158
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">source_path</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
159
+ <span class="k">elif</span> <span class="n">request</span><span class="o">.</span><span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;pypi&#39;</span><span class="p">:</span>
160
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
161
+ <span class="k">else</span><span class="p">:</span>
162
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Invalid source&quot;</span><span class="p">)</span>
163
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid source&quot;</span><span class="p">}</span>
164
+
165
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Command to execute:&quot;</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span>
166
+ <span class="c1"># For GitHub installations, use the plugin_install function which handles the download and extraction</span>
167
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;github&#39;</span><span class="p">:</span>
168
+ <span class="k">try</span><span class="p">:</span>
169
+ <span class="c1"># Use the streaming approach for GitHub installations</span>
170
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">source_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
171
+ <span class="n">repo_path</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
172
+ <span class="n">tag</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span>
173
+
174
+ <span class="nb">print</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
175
+
176
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_github_install</span><span class="p">():</span>
177
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;dling&quot;</span><span class="p">)</span>
178
+ <span class="k">yield</span> <span class="p">{</span><span class="s2">&quot;event&quot;</span><span class="p">:</span> <span class="s2">&quot;message&quot;</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Downloading GitHub repository </span><span class="si">{</span><span class="n">repo_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">}</span>
179
+
180
+ <span class="k">try</span><span class="p">:</span>
181
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;dling 2&quot;</span><span class="p">)</span>
182
+ <span class="n">plugin_dir</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="o">=</span> <span class="n">download_github_files</span><span class="p">(</span><span class="n">repo_path</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
183
+
184
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">plugin_dir</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
185
+ <span class="k">async</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">stream_command_as_events</span><span class="p">(</span><span class="n">cmd</span><span class="p">):</span>
186
+ <span class="k">yield</span> <span class="n">event</span>
187
+
188
+ <span class="n">update_plugin_manifest</span><span class="p">(</span>
189
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="s1">&#39;github&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">plugin_dir</span><span class="p">),</span>
190
+ <span class="n">remote_source</span><span class="o">=</span><span class="n">repo_path</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;version&#39;</span><span class="p">,</span> <span class="s1">&#39;0.0.1&#39;</span><span class="p">),</span>
191
+ <span class="n">metadata</span><span class="o">=</span><span class="n">plugin_info</span>
192
+ <span class="p">)</span>
193
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
194
+ <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
195
+ <span class="k">yield</span> <span class="p">{</span><span class="s2">&quot;event&quot;</span><span class="p">:</span> <span class="s2">&quot;error&quot;</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing from GitHub: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
196
+
197
+ <span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">stream_github_install</span><span class="p">())</span>
198
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
199
+ <span class="nb">print</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
200
+ <span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
201
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error setting up GitHub installation: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
202
+
203
+ <span class="c1"># For other sources, use our streamcmd module to stream the command output</span>
204
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;stream cmd as events&quot;</span><span class="p">)</span>
205
+ <span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">stream_command_as_events</span><span class="p">(</span><span class="n">cmd</span><span class="p">))</span></div>
206
+
207
+
208
+ <div class="viewcode-block" id="stream_install_plugin_get">
209
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.stream_install_plugin_get">[docs]</a>
210
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/stream-install-plugin&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">EventSourceResponse</span><span class="p">)</span>
211
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_install_plugin_get</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">):</span>
212
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Stream the installation process of a plugin using SSE (GET method).&quot;&quot;&quot;</span>
213
+ <span class="c1"># Extract parameters from query string</span>
214
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Stream Install GET Request:&quot;</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="p">)</span>
215
+ <span class="n">plugin</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;plugin&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
216
+ <span class="n">source</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;source&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
217
+ <span class="n">source_path</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;source_path&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
218
+
219
+ <span class="c1"># Use the new simpler approach</span>
220
+ <span class="k">if</span> <span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;github&#39;</span><span class="p">:</span>
221
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">source_path</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
222
+ <span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Installing </span><span class="si">{</span><span class="n">plugin</span><span class="si">}</span><span class="s2"> from GitHub repository </span><span class="si">{</span><span class="n">source_path</span><span class="si">}</span><span class="s2">...&quot;</span>
223
+ <span class="k">elif</span> <span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;local&#39;</span><span class="p">:</span>
224
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">source_path</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
225
+ <span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Installing from local path: </span><span class="si">{</span><span class="n">source_path</span><span class="si">}</span><span class="s2">&quot;</span>
226
+ <span class="k">elif</span> <span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;pypi&#39;</span><span class="p">:</span>
227
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="n">plugin</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
228
+ <span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Installing from PyPI: </span><span class="si">{</span><span class="n">plugin</span><span class="si">}</span><span class="s2">&quot;</span>
229
+ <span class="k">else</span><span class="p">:</span>
230
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid source&quot;</span><span class="p">}</span>
231
+
232
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Command to execute:&quot;</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span>
233
+ <span class="n">tag</span> <span class="o">=</span> <span class="kc">None</span>
234
+ <span class="c1"># For GitHub installations, use the plugin_install function which handles the download and extraction</span>
235
+ <span class="k">if</span> <span class="n">source</span> <span class="o">==</span> <span class="s1">&#39;github&#39;</span><span class="p">:</span>
236
+ <span class="k">try</span><span class="p">:</span>
237
+ <span class="c1"># Use the streaming approach for GitHub installations</span>
238
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;source_path:&quot;</span><span class="p">,</span> <span class="n">source_path</span><span class="p">)</span>
239
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">source_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
240
+ <span class="n">repo_path</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
241
+ <span class="n">tag</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="kc">None</span>
242
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;repo_path:&quot;</span><span class="p">,</span> <span class="n">repo_path</span><span class="p">,</span> <span class="s2">&quot;tag:&quot;</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span>
243
+ <span class="c1"># First yield a message about downloading</span>
244
+ <span class="c1">#</span>
245
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_github_install</span><span class="p">():</span>
246
+ <span class="k">yield</span> <span class="p">{</span><span class="s2">&quot;event&quot;</span><span class="p">:</span> <span class="s2">&quot;message&quot;</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Downloading GitHub repository </span><span class="si">{</span><span class="n">repo_path</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">}</span>
247
+ <span class="n">repo_path_</span> <span class="o">=</span> <span class="n">repo_path</span>
248
+ <span class="n">tag_</span> <span class="o">=</span> <span class="n">tag</span>
249
+ <span class="c1"># Download and extract the GitHub repository</span>
250
+ <span class="k">try</span><span class="p">:</span>
251
+ <span class="k">if</span> <span class="n">source_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">):</span>
252
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Processing direct GitHub URL&quot;</span><span class="p">)</span>
253
+ <span class="n">repo_path_</span> <span class="o">=</span> <span class="n">source_path</span>
254
+ <span class="n">tag_</span> <span class="o">=</span> <span class="kc">None</span>
255
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">repo_path_</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
256
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">5</span><span class="p">:</span>
257
+ <span class="n">repo_path_</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">parts</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">parts</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span>
258
+
259
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;repo_path_:&quot;</span><span class="p">,</span> <span class="n">repo_path_</span><span class="p">)</span>
260
+ <span class="n">plugin_dir</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="o">=</span> <span class="n">download_github_files</span><span class="p">(</span><span class="n">repo_path_</span><span class="p">,</span> <span class="n">tag_</span><span class="p">)</span>
261
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;ok&#39;</span><span class="p">)</span>
262
+ <span class="c1"># Now stream the installation from the local directory</span>
263
+ <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="p">,</span> <span class="s1">&#39;-m&#39;</span><span class="p">,</span> <span class="s1">&#39;pip&#39;</span><span class="p">,</span> <span class="s1">&#39;install&#39;</span><span class="p">,</span> <span class="s1">&#39;-e&#39;</span><span class="p">,</span> <span class="n">plugin_dir</span><span class="p">,</span> <span class="s1">&#39;-v&#39;</span><span class="p">,</span> <span class="s1">&#39;--no-cache-dir&#39;</span><span class="p">]</span>
264
+ <span class="k">async</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">stream_command_as_events</span><span class="p">(</span><span class="n">cmd</span><span class="p">):</span>
265
+ <span class="k">yield</span> <span class="n">event</span>
266
+
267
+ <span class="c1"># Update the plugin manifest</span>
268
+ <span class="n">update_plugin_manifest</span><span class="p">(</span>
269
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">],</span> <span class="s1">&#39;github&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">plugin_dir</span><span class="p">),</span>
270
+ <span class="n">remote_source</span><span class="o">=</span><span class="n">repo_path_</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;version&#39;</span><span class="p">,</span> <span class="s1">&#39;0.0.1&#39;</span><span class="p">),</span>
271
+ <span class="n">metadata</span><span class="o">=</span><span class="n">plugin_info</span>
272
+ <span class="p">)</span>
273
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
274
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
275
+ <span class="k">yield</span> <span class="p">{</span><span class="s2">&quot;event&quot;</span><span class="p">:</span> <span class="s2">&quot;error&quot;</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing from GitHub: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2"> </span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
276
+
277
+ <span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">stream_github_install</span><span class="p">())</span>
278
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
279
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
280
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing from GitHub: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
281
+
282
+ <span class="c1"># Use our new streamcmd module</span>
283
+ <span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">stream_command_as_events</span><span class="p">(</span><span class="n">cmd</span><span class="p">))</span></div>
284
+
285
+
286
+ <div class="viewcode-block" id="get_all_plugins">
287
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.get_all_plugins">[docs]</a>
288
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/get-all-plugins&quot;</span><span class="p">)</span>
289
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_all_plugins</span><span class="p">():</span>
290
+ <span class="k">try</span><span class="p">:</span>
291
+ <span class="n">manifest</span> <span class="o">=</span> <span class="n">load_plugin_manifest</span><span class="p">()</span>
292
+ <span class="n">plugins</span> <span class="o">=</span> <span class="p">[]</span>
293
+
294
+ <span class="c1"># Process core plugins</span>
295
+ <span class="k">for</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="ow">in</span> <span class="n">manifest</span><span class="p">[</span><span class="s1">&#39;plugins&#39;</span><span class="p">][</span><span class="s1">&#39;core&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
296
+ <span class="n">plugins</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
297
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span>
298
+ <span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="s2">&quot;core&quot;</span><span class="p">,</span>
299
+ <span class="s2">&quot;enabled&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;enabled&#39;</span><span class="p">],</span>
300
+ <span class="s2">&quot;source&quot;</span><span class="p">:</span> <span class="s2">&quot;core&quot;</span><span class="p">,</span>
301
+ <span class="s2">&quot;remote_source&quot;</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span>
302
+ <span class="s2">&quot;version&quot;</span><span class="p">:</span> <span class="s2">&quot;1.0.0&quot;</span><span class="p">,</span>
303
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
304
+ <span class="p">})</span>
305
+
306
+ <span class="c1"># Process installed plugins</span>
307
+ <span class="k">for</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="ow">in</span> <span class="n">manifest</span><span class="p">[</span><span class="s1">&#39;plugins&#39;</span><span class="p">][</span><span class="s1">&#39;installed&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
308
+ <span class="n">plugins</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
309
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span>
310
+ <span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="s2">&quot;installed&quot;</span><span class="p">,</span>
311
+ <span class="s2">&quot;enabled&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;enabled&#39;</span><span class="p">],</span>
312
+ <span class="s2">&quot;source&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">],</span>
313
+ <span class="s2">&quot;remote_source&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;remote_source&#39;</span><span class="p">,</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;github_url&#39;</span><span class="p">)),</span>
314
+ <span class="s2">&quot;source_path&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;source_path&#39;</span><span class="p">),</span>
315
+ <span class="s2">&quot;version&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;version&#39;</span><span class="p">,</span> <span class="s1">&#39;0.0.1&#39;</span><span class="p">),</span>
316
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
317
+ <span class="s2">&quot;index_source&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;index_source&#39;</span><span class="p">)</span>
318
+ <span class="p">})</span>
319
+
320
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="n">plugins</span><span class="p">}</span>
321
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
322
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
323
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error fetching plugins: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
324
+
325
+
326
+
327
+ <div class="viewcode-block" id="scan_directory">
328
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.scan_directory">[docs]</a>
329
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/scan-directory&quot;</span><span class="p">)</span>
330
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">scan_directory</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">DirectoryRequest</span><span class="p">):</span>
331
+ <span class="k">try</span><span class="p">:</span>
332
+ <span class="n">directory</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">directory</span>
333
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
334
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Invalid directory path&quot;</span><span class="p">}</span>
335
+
336
+ <span class="n">discovered_plugins</span> <span class="o">=</span> <span class="n">discover_plugins</span><span class="p">(</span><span class="n">directory</span><span class="p">)</span>
337
+ <span class="n">manifest</span> <span class="o">=</span> <span class="n">load_plugin_manifest</span><span class="p">()</span>
338
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;discoverd_plugins&quot;</span><span class="p">,</span> <span class="n">discovered_plugins</span><span class="p">)</span>
339
+
340
+ <span class="c1"># Analyze plugins for index compatibility</span>
341
+ <span class="n">addable_count</span> <span class="o">=</span> <span class="mi">0</span>
342
+ <span class="k">for</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="ow">in</span> <span class="n">discovered_plugins</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
343
+ <span class="c1"># Check if plugin has GitHub info</span>
344
+ <span class="n">has_github</span> <span class="o">=</span> <span class="p">(</span>
345
+ <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;github_url&#39;</span><span class="p">)</span> <span class="ow">or</span>
346
+ <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;remote_source&#39;</span><span class="p">)</span> <span class="ow">or</span>
347
+ <span class="p">(</span><span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;github_url&#39;</span><span class="p">))</span>
348
+ <span class="p">)</span>
349
+ <span class="k">if</span> <span class="n">has_github</span><span class="p">:</span>
350
+ <span class="n">addable_count</span> <span class="o">+=</span> <span class="mi">1</span>
351
+
352
+ <span class="c1"># Update installed plugins from discovered ones</span>
353
+ <span class="k">for</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="n">plugin_info</span> <span class="ow">in</span> <span class="n">discovered_plugins</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
354
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;source&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;local&#39;</span>
355
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;metadata&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span> <span class="ow">or</span> <span class="p">{</span>
356
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
357
+ <span class="s2">&quot;install_date&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;install_date&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span>
358
+ <span class="s2">&quot;commands&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;commands&#39;</span><span class="p">,</span> <span class="p">[]),</span>
359
+ <span class="s2">&quot;services&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;services&#39;</span><span class="p">,</span> <span class="p">[])</span>
360
+ <span class="p">}</span>
361
+ <span class="nb">print</span><span class="p">(</span><span class="n">plugin_info</span><span class="p">)</span>
362
+ <span class="n">manifest</span><span class="p">[</span><span class="s1">&#39;plugins&#39;</span><span class="p">][</span><span class="s1">&#39;installed&#39;</span><span class="p">][</span><span class="n">plugin_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">plugin_info</span>
363
+
364
+ <span class="c1"># Prepare plugin list for response</span>
365
+ <span class="n">plugins_list</span> <span class="o">=</span> <span class="p">[{</span>
366
+ <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span>
367
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;metadata&#39;</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="n">info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
368
+ <span class="p">}</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">discovered_plugins</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
369
+
370
+ <span class="n">save_plugin_manifest</span><span class="p">(</span><span class="n">manifest</span><span class="p">)</span>
371
+
372
+ <span class="n">response</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
373
+ <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Scanned </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">discovered_plugins</span><span class="p">)</span><span class="si">}</span><span class="s2"> plugins in </span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
374
+ <span class="s2">&quot;plugins&quot;</span><span class="p">:</span> <span class="n">plugins_list</span><span class="p">,</span>
375
+ <span class="s2">&quot;addable_to_index&quot;</span><span class="p">:</span> <span class="n">addable_count</span><span class="p">}</span>
376
+ <span class="k">if</span> <span class="n">addable_count</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">discovered_plugins</span><span class="p">):</span>
377
+ <span class="n">response</span><span class="p">[</span><span class="s2">&quot;warning&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">discovered_plugins</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">addable_count</span><span class="si">}</span><span class="s2"> plugins missing GitHub info and cannot be added to indices&quot;</span>
378
+ <span class="k">return</span> <span class="n">response</span>
379
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
380
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
381
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error during scan: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
382
+
383
+
384
+ <div class="viewcode-block" id="install_local_plugin">
385
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.install_local_plugin">[docs]</a>
386
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/install-local-plugin&quot;</span><span class="p">)</span>
387
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">install_local_plugin</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">PluginRequest</span><span class="p">):</span>
388
+ <span class="k">try</span><span class="p">:</span>
389
+ <span class="n">plugin_name</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">plugin</span>
390
+ <span class="n">plugin_path</span> <span class="o">=</span> <span class="n">get_plugin_path</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
391
+
392
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">plugin_path</span><span class="p">:</span>
393
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Plugin path not found&quot;</span><span class="p">}</span>
394
+
395
+ <span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">plugin_install</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="n">source_path</span><span class="o">=</span><span class="n">plugin_path</span><span class="p">)</span>
396
+ <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
397
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Plugin </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> installed successfully&quot;</span><span class="p">}</span>
398
+ <span class="k">else</span><span class="p">:</span>
399
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Installation failed&quot;</span><span class="p">}</span>
400
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
401
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
402
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing plugin: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
403
+
404
+
405
+
406
+ <div class="viewcode-block" id="install_github_plugin">
407
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.install_github_plugin">[docs]</a>
408
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/install-x-github-plugin&quot;</span><span class="p">)</span>
409
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">install_github_plugin</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">GitHubPluginRequest</span><span class="p">):</span>
410
+ <span class="k">try</span><span class="p">:</span>
411
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Request:&quot;</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
412
+ <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">url</span> <span class="ow">or</span> <span class="n">request</span><span class="o">.</span><span class="n">github_url</span>
413
+ <span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">plugin_install</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="s1">&#39;github&#39;</span><span class="p">,</span> <span class="n">source_path</span><span class="o">=</span><span class="n">url</span><span class="p">)</span>
414
+ <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
415
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Plugin installed successfully from GitHub&quot;</span><span class="p">}</span>
416
+ <span class="k">else</span><span class="p">:</span>
417
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Installation failed&quot;</span><span class="p">}</span>
418
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
419
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
420
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing from GitHub: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
421
+
422
+
423
+ <div class="viewcode-block" id="install_from_index">
424
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.install_from_index">[docs]</a>
425
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/install-from-index&quot;</span><span class="p">)</span>
426
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">install_from_index</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">InstallFromIndexRequest</span><span class="p">):</span>
427
+ <span class="k">try</span><span class="p">:</span>
428
+ <span class="c1"># Load the index to get plugin information</span>
429
+ <span class="n">index_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;indices&#39;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">index_name</span><span class="si">}</span><span class="s2">.json&quot;</span><span class="p">)</span>
430
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">index_path</span><span class="p">):</span>
431
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Index not found&quot;</span><span class="p">}</span>
432
+
433
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">index_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
434
+ <span class="n">index_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
435
+
436
+ <span class="c1"># Find plugin in index</span>
437
+ <span class="n">plugin_data</span> <span class="o">=</span> <span class="kc">None</span>
438
+ <span class="k">for</span> <span class="n">plugin</span> <span class="ow">in</span> <span class="n">index_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;plugins&#39;</span><span class="p">,</span> <span class="p">[]):</span>
439
+ <span class="k">if</span> <span class="n">plugin</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">:</span>
440
+ <span class="n">plugin_data</span> <span class="o">=</span> <span class="n">plugin</span>
441
+ <span class="k">break</span>
442
+
443
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">plugin_data</span><span class="p">:</span>
444
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Plugin not found in index&quot;</span><span class="p">}</span>
445
+
446
+ <span class="c1"># Install the plugin</span>
447
+ <span class="k">if</span> <span class="n">plugin_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;github_url&#39;</span><span class="p">):</span>
448
+ <span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">plugin_install</span><span class="p">(</span>
449
+ <span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span>
450
+ <span class="n">source</span><span class="o">=</span><span class="s1">&#39;github&#39;</span><span class="p">,</span>
451
+ <span class="n">source_path</span><span class="o">=</span><span class="n">plugin_data</span><span class="p">[</span><span class="s1">&#39;github_url&#39;</span><span class="p">]</span>
452
+ <span class="p">)</span>
453
+ <span class="k">elif</span> <span class="n">plugin_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;source_path&#39;</span><span class="p">):</span>
454
+ <span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">plugin_install</span><span class="p">(</span>
455
+ <span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span>
456
+ <span class="n">source</span><span class="o">=</span><span class="s1">&#39;local&#39;</span><span class="p">,</span>
457
+ <span class="n">source_path</span><span class="o">=</span><span class="n">plugin_data</span><span class="p">[</span><span class="s1">&#39;source_path&#39;</span><span class="p">]</span>
458
+ <span class="p">)</span>
459
+ <span class="k">else</span><span class="p">:</span>
460
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;No valid installation source in index&quot;</span><span class="p">}</span>
461
+
462
+ <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
463
+ <span class="c1"># Update plugin metadata with index information</span>
464
+ <span class="n">manifest</span> <span class="o">=</span> <span class="n">load_plugin_manifest</span><span class="p">()</span>
465
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">plugin</span> <span class="ow">in</span> <span class="n">manifest</span><span class="p">[</span><span class="s1">&#39;plugins&#39;</span><span class="p">][</span><span class="s1">&#39;installed&#39;</span><span class="p">]:</span>
466
+ <span class="n">manifest</span><span class="p">[</span><span class="s1">&#39;plugins&#39;</span><span class="p">][</span><span class="s1">&#39;installed&#39;</span><span class="p">][</span><span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">][</span><span class="s1">&#39;metadata&#39;</span><span class="p">][</span><span class="s1">&#39;index_source&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">index_name</span>
467
+ <span class="n">save_plugin_manifest</span><span class="p">(</span><span class="n">manifest</span><span class="p">)</span>
468
+
469
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Plugin </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="si">}</span><span class="s2"> installed successfully from index&quot;</span><span class="p">}</span>
470
+ <span class="k">else</span><span class="p">:</span>
471
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Installation failed&quot;</span><span class="p">}</span>
472
+
473
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
474
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
475
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error installing from index: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
476
+
477
+
478
+
479
+ <div class="viewcode-block" id="toggle_plugin">
480
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.toggle_plugin">[docs]</a>
481
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/toggle-plugin&quot;</span><span class="p">)</span>
482
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">toggle_plugin</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">TogglePluginRequest</span><span class="p">):</span>
483
+ <span class="k">try</span><span class="p">:</span>
484
+ <span class="n">success</span> <span class="o">=</span> <span class="n">toggle_plugin_state</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">enabled</span><span class="p">)</span>
485
+ <span class="k">if</span> <span class="n">success</span><span class="p">:</span>
486
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Plugin </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">plugin</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="s1">&#39;enabled&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">request</span><span class="o">.</span><span class="n">enabled</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;disabled&#39;</span><span class="si">}</span><span class="s2"> successfully&quot;</span><span class="p">}</span>
487
+ <span class="k">else</span><span class="p">:</span>
488
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Failed to toggle plugin state&quot;</span><span class="p">}</span>
489
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
490
+ <span class="n">trace</span> <span class="o">=</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
491
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Error toggling plugin: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="se">\n\n</span><span class="si">{</span><span class="n">trace</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span></div>
492
+
493
+
494
+ <span class="c1"># Helper function</span>
495
+ <div class="viewcode-block" id="discover_plugins">
496
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.discover_plugins">[docs]</a>
497
+ <span class="k">def</span><span class="w"> </span><span class="nf">discover_plugins</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
498
+ <span class="n">discovered</span> <span class="o">=</span> <span class="p">{}</span>
499
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">directory</span><span class="p">):</span>
500
+ <span class="n">item_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">directory</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
501
+ <span class="n">plugin_info_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">item_path</span><span class="p">,</span> <span class="s1">&#39;plugin_info.json&#39;</span><span class="p">)</span>
502
+
503
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">plugin_info_path</span><span class="p">):</span>
504
+ <span class="k">try</span><span class="p">:</span>
505
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">plugin_info_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
506
+ <span class="n">plugin_info</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
507
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;enabled&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
508
+ <span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;source_path&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">item_path</span>
509
+ <span class="n">discovered</span><span class="p">[</span><span class="n">plugin_info</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">plugin_info</span>
510
+ <span class="k">except</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span><span class="p">:</span>
511
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error reading plugin info for </span><span class="si">{</span><span class="n">item</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
512
+ <span class="k">continue</span>
513
+
514
+ <span class="k">return</span> <span class="n">discovered</span></div>
515
+
516
+
517
+ <div class="viewcode-block" id="publish_plugin_from_github">
518
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.plugin_manager.publish_plugin_from_github">[docs]</a>
519
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">publish_plugin_from_github</span><span class="p">(</span><span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">registry_token</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">registry_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
520
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
521
+ <span class="sd"> Fetches plugin_info.json from a GitHub repo and publishes it to the registry.</span>
522
+ <span class="sd"> &quot;&quot;&quot;</span>
523
+ <span class="n">plugin_info</span> <span class="o">=</span> <span class="kc">None</span>
524
+ <span class="c1"># Try to fetch from &#39;main&#39; and then &#39;master&#39; branch</span>
525
+ <span class="k">for</span> <span class="n">branch</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;main&#39;</span><span class="p">,</span> <span class="s1">&#39;master&#39;</span><span class="p">]:</span>
526
+ <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;https://raw.githubusercontent.com/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">branch</span><span class="si">}</span><span class="s2">/plugin_info.json&quot;</span>
527
+ <span class="k">async</span> <span class="k">with</span> <span class="n">httpx</span><span class="o">.</span><span class="n">AsyncClient</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
528
+ <span class="k">try</span><span class="p">:</span>
529
+ <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
530
+ <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">==</span> <span class="mi">200</span><span class="p">:</span>
531
+ <span class="n">plugin_info</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span>
532
+ <span class="k">break</span>
533
+ <span class="k">except</span> <span class="n">httpx</span><span class="o">.</span><span class="n">RequestError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
534
+ <span class="c1"># This might happen if the repo is private or other network issues</span>
535
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error fetching from </span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
536
+ <span class="k">continue</span>
537
+
538
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">plugin_info</span><span class="p">:</span>
539
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not find or access plugin_info.json in repo </span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2"> on &#39;main&#39; or &#39;master&#39; branch.&quot;</span><span class="p">)</span>
540
+
541
+ <span class="c1"># Construct the payload for the registry&#39;s /publish endpoint</span>
542
+ <span class="n">publish_data</span> <span class="o">=</span> <span class="p">{</span>
543
+ <span class="s2">&quot;title&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">),</span>
544
+ <span class="s2">&quot;description&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;description&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span>
545
+ <span class="s2">&quot;category&quot;</span><span class="p">:</span> <span class="s2">&quot;plugin&quot;</span><span class="p">,</span>
546
+ <span class="s2">&quot;content_type&quot;</span><span class="p">:</span> <span class="s2">&quot;mindroot_plugin&quot;</span><span class="p">,</span>
547
+ <span class="s2">&quot;version&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;version&quot;</span><span class="p">,</span> <span class="s2">&quot;0.1.0&quot;</span><span class="p">),</span>
548
+ <span class="s2">&quot;github_url&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;https://github.com/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
549
+ <span class="s2">&quot;pypi_module&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;pypi_module&quot;</span><span class="p">),</span>
550
+ <span class="s2">&quot;commands&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;commands&quot;</span><span class="p">,</span> <span class="p">[]),</span>
551
+ <span class="s2">&quot;services&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;services&quot;</span><span class="p">,</span> <span class="p">[]),</span>
552
+ <span class="s2">&quot;tags&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;tags&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;plugin&quot;</span><span class="p">]),</span>
553
+ <span class="s2">&quot;dependencies&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;dependencies&quot;</span><span class="p">,</span> <span class="p">[]),</span>
554
+ <span class="s2">&quot;data&quot;</span><span class="p">:</span> <span class="p">{</span>
555
+ <span class="s2">&quot;plugin_info&quot;</span><span class="p">:</span> <span class="n">plugin_info</span><span class="p">,</span>
556
+ <span class="s2">&quot;installation&quot;</span><span class="p">:</span> <span class="p">{</span>
557
+ <span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;github&quot;</span><span class="p">,</span>
558
+ <span class="s2">&quot;source_path&quot;</span><span class="p">:</span> <span class="n">repo</span>
559
+ <span class="p">}</span>
560
+ <span class="p">}</span>
561
+ <span class="p">}</span>
562
+
563
+ <span class="c1"># Post the data to the registry</span>
564
+ <span class="n">publish_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">registry_url</span><span class="si">}</span><span class="s2">/publish&quot;</span>
565
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
566
+ <span class="s2">&quot;Authorization&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Bearer </span><span class="si">{</span><span class="n">registry_token</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
567
+ <span class="s2">&quot;Content-Type&quot;</span><span class="p">:</span> <span class="s2">&quot;application/json&quot;</span>
568
+ <span class="p">}</span>
569
+ <span class="k">async</span> <span class="k">with</span> <span class="n">httpx</span><span class="o">.</span><span class="n">AsyncClient</span><span class="p">()</span> <span class="k">as</span> <span class="n">client</span><span class="p">:</span>
570
+ <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">publish_url</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">publish_data</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
571
+
572
+ <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="o">&gt;=</span> <span class="mi">400</span><span class="p">:</span>
573
+ <span class="k">try</span><span class="p">:</span>
574
+ <span class="n">error_detail</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;detail&quot;</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
575
+ <span class="k">except</span><span class="p">:</span>
576
+ <span class="n">error_detail</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">text</span>
577
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to publish to registry: </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="n">error_detail</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
578
+
579
+ <span class="k">return</span> <span class="n">response</span><span class="o">.</span><span class="n">json</span><span class="p">()</span></div>
580
+
581
+ </pre></div>
582
+
583
+ </div>
584
+ </div>
585
+ <footer>
586
+
587
+ <hr/>
588
+
589
+ <div role="contentinfo">
590
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
591
+ </div>
592
+
593
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
594
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
595
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
596
+
597
+
598
+ </footer>
599
+ </div>
600
+ </div>
601
+ </section>
602
+ </div>
603
+ <script>
604
+ jQuery(function () {
605
+ SphinxRtdTheme.Navigation.enable(true);
606
+ });
607
+ </script>
608
+
609
+ </body>
610
+ </html>