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.
- mindroot/coreplugins/admin/static/js/model-preferences-v2.js +1 -1
- mindroot/coreplugins/home/templates/home.jinja2 +1 -0
- mindroot/docs/Makefile +20 -0
- mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
- mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
- mindroot/docs/_build/doctrees/environment.pickle +0 -0
- mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
- mindroot/docs/_build/doctrees/index.doctree +0 -0
- mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
- mindroot/docs/_build/doctrees/installation.doctree +0 -0
- mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
- mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
- mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
- mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
- mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
- mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
- mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
- mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
- mindroot/docs/_build/html/.buildinfo +4 -0
- mindroot/docs/_build/html/.buildinfo.bak +4 -0
- mindroot/docs/_build/html/_images/envvar.png +0 -0
- mindroot/docs/_build/html/_images/files.png +0 -0
- mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
- mindroot/docs/_build/html/_images/mood.png +0 -0
- mindroot/docs/_build/html/_images/moon.png +0 -0
- mindroot/docs/_build/html/_images/openrouter.png +0 -0
- mindroot/docs/_build/html/_images/restart.png +0 -0
- mindroot/docs/_build/html/_modules/index.html +425 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
- mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
- mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
- mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
- mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
- mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
- mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
- mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
- mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
- mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
- mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
- mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
- mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
- mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
- mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
- mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
- mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
- mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
- mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
- mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
- mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
- mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
- mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
- mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- mindroot/docs/_build/html/_static/basic.css +906 -0
- mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
- mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- mindroot/docs/_build/html/_static/css/theme.css +4 -0
- mindroot/docs/_build/html/_static/custom.css +19 -0
- mindroot/docs/_build/html/_static/debug.css +69 -0
- mindroot/docs/_build/html/_static/doctools.js +149 -0
- mindroot/docs/_build/html/_static/documentation_options.js +13 -0
- mindroot/docs/_build/html/_static/file.png +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- mindroot/docs/_build/html/_static/jquery.js +2 -0
- mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
- mindroot/docs/_build/html/_static/js/theme.js +1 -0
- mindroot/docs/_build/html/_static/js/versions.js +228 -0
- mindroot/docs/_build/html/_static/language_data.js +192 -0
- mindroot/docs/_build/html/_static/minus.png +0 -0
- mindroot/docs/_build/html/_static/plus.png +0 -0
- mindroot/docs/_build/html/_static/pygments.css +232 -0
- mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
- mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
- mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
- mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
- mindroot/docs/_build/html/_static/searchtools.js +635 -0
- mindroot/docs/_build/html/_static/skeleton.css +296 -0
- mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
- mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
- mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
- mindroot/docs/_build/html/_static/styles/furo.css +2 -0
- mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
- mindroot/docs/_build/html/chat_with_assistant.html +329 -0
- mindroot/docs/_build/html/developer_documentation.html +338 -0
- mindroot/docs/_build/html/genindex.html +4690 -0
- mindroot/docs/_build/html/getting_started.html +423 -0
- mindroot/docs/_build/html/index.html +357 -0
- mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
- mindroot/docs/_build/html/installation.html +330 -0
- mindroot/docs/_build/html/llm_api_key.html +337 -0
- mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
- mindroot/docs/_build/html/objects.inv +0 -0
- mindroot/docs/_build/html/programming_task.html +326 -0
- mindroot/docs/_build/html/py-modindex.html +1307 -0
- mindroot/docs/_build/html/search.html +307 -0
- mindroot/docs/_build/html/searchindex.js +1 -0
- mindroot/docs/_build/html/source/ahp.html +302 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
- mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
- mindroot/docs/_build/html/source/mindroot.html +811 -0
- mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
- mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
- mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
- mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
- mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
- mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
- mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
- mindroot/docs/_build/html/source/modules.html +377 -0
- mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
- mindroot/docs/_build/html/starting_mindroot.html +325 -0
- mindroot/docs/_build/html/user_documentation.html +333 -0
- mindroot/docs/_static/custom.css +19 -0
- mindroot/docs/chat_with_assistant.rst +14 -0
- mindroot/docs/conf.py +54 -0
- mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
- mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
- mindroot/docs/data/equivalent_flags.json +1 -0
- mindroot/docs/data/mcp/servers.json +9 -0
- mindroot/docs/data/models.json +57 -0
- mindroot/docs/data/plugin_manifest.json +95 -0
- mindroot/docs/data/preferred_models.json +12 -0
- mindroot/docs/data/providers.json +62 -0
- mindroot/docs/developer_documentation.rst +26 -0
- mindroot/docs/envvar.png +0 -0
- mindroot/docs/files.png +0 -0
- mindroot/docs/getting_started.rst +139 -0
- mindroot/docs/index.rst +38 -0
- mindroot/docs/install_plugins_with_tools.rst +25 -0
- mindroot/docs/installation.rst +21 -0
- mindroot/docs/installopenrouter.png +0 -0
- mindroot/docs/llm_api_key.rst +22 -0
- mindroot/docs/llm_plugin_installation.rst +27 -0
- mindroot/docs/make.bat +35 -0
- mindroot/docs/mood.png +0 -0
- mindroot/docs/moon.png +0 -0
- mindroot/docs/openrouter.png +0 -0
- mindroot/docs/personas/local/Assistant/avatar.png +0 -0
- mindroot/docs/personas/local/Assistant/faceref.png +0 -0
- mindroot/docs/personas/local/Assistant/persona.json +7 -0
- mindroot/docs/programming_task.rst +10 -0
- mindroot/docs/restart.png +0 -0
- mindroot/docs/source/ahp.rst +7 -0
- mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
- mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
- mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
- mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
- mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
- mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
- mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
- mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
- mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
- mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
- mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
- mindroot/docs/source/mindroot.coreplugins.rst +35 -0
- mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
- mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
- mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
- mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
- mindroot/docs/source/mindroot.lib.auth.rst +29 -0
- mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
- mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
- mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
- mindroot/docs/source/mindroot.lib.providers.rst +61 -0
- mindroot/docs/source/mindroot.lib.rst +152 -0
- mindroot/docs/source/mindroot.registry.rst +29 -0
- mindroot/docs/source/mindroot.rst +54 -0
- mindroot/docs/source/modules.rst +7 -0
- mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
- mindroot/docs/starting_mindroot.rst +12 -0
- mindroot/docs/user_documentation.rst +16 -0
- mindroot/lib/providers/model_preferences_v2.py +5 -3
- mindroot/server.py +10 -1
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/METADATA +1 -1
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/RECORD +417 -10
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/WHEEL +0 -0
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/entry_points.txt +0 -0
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/licenses/LICENSE +0 -0
- {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,518 @@
|
|
|
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.command_router — 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.command_router</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.command_router</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>
|
|
73
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service_manager</span>
|
|
74
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="o">,</span><span class="w"> </span><span class="nn">json</span>
|
|
75
|
+
<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">plugin_install</span>
|
|
76
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.missing</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_missing_commands</span>
|
|
77
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.plugins.mapping</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_command_plugin_mapping</span>
|
|
78
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
|
|
79
|
+
<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">install_recommended_plugins</span><span class="p">,</span> <span class="n">download_github_files</span>
|
|
80
|
+
<span class="kn">from</span><span class="w"> </span><span class="nn">lib.plugins.manifest</span><span class="w"> </span><span class="kn">import</span> <span class="n">update_plugin_manifest</span>
|
|
81
|
+
<span class="c1"># For Server-Sent Events (streamed logs)</span>
|
|
82
|
+
<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>
|
|
83
|
+
<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>
|
|
84
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">contextlib</span><span class="o">,</span><span class="w"> </span><span class="nn">io</span><span class="o">,</span><span class="w"> </span><span class="nn">json</span><span class="o">,</span><span class="w"> </span><span class="nn">asyncio</span><span class="o">,</span><span class="w"> </span><span class="nn">sys</span>
|
|
85
|
+
|
|
86
|
+
<span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">()</span>
|
|
87
|
+
|
|
88
|
+
<span class="c1"># Global installation queue</span>
|
|
89
|
+
<span class="n">plugin_install_queue</span> <span class="o">=</span> <span class="p">[]</span>
|
|
90
|
+
|
|
91
|
+
<div class="viewcode-block" id="missing_commands">
|
|
92
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.missing_commands">[docs]</a>
|
|
93
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"/admin/missing-commands/</span><span class="si">{agent_name}</span><span class="s2">"</span><span class="p">)</span>
|
|
94
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">missing_commands</span><span class="p">(</span><span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
95
|
+
<span class="w"> </span><span class="sd">"""Get commands mentioned in agent instructions but not available."""</span>
|
|
96
|
+
<span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_missing_commands</span><span class="p">(</span><span class="n">agent_name</span><span class="p">)</span>
|
|
97
|
+
<span class="k">if</span> <span class="s2">"error"</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
|
|
98
|
+
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="n">result</span><span class="p">[</span><span class="s2">"error"</span><span class="p">])</span>
|
|
99
|
+
<span class="k">return</span> <span class="n">result</span></div>
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
<span class="c1"># ------------------------------------------------------------------</span>
|
|
103
|
+
<span class="c1"># NEW: Stream installation of recommended plugins with live logs</span>
|
|
104
|
+
<span class="c1"># ------------------------------------------------------------------</span>
|
|
105
|
+
|
|
106
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"/admin/stream-install-recommended-plugins/</span><span class="si">{agent_name}</span><span class="s2">"</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">EventSourceResponse</span><span class="p">)</span>
|
|
107
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_install_recommended_plugins</span><span class="p">(</span><span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
108
|
+
<span class="w"> </span><span class="sd">"""</span>
|
|
109
|
+
<span class="sd"> SSE endpoint that installs all recommended plugins for `agent_name`</span>
|
|
110
|
+
<span class="sd"> and streams stdout/stderr lines back to the browser. It finishes by</span>
|
|
111
|
+
<span class="sd"> sending a JSON summary and the literal string 'END'.</span>
|
|
112
|
+
<span class="sd"> """</span>
|
|
113
|
+
|
|
114
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">event_generator</span><span class="p">():</span>
|
|
115
|
+
<span class="k">try</span><span class="p">:</span>
|
|
116
|
+
<span class="c1"># Load agent data</span>
|
|
117
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/local/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
118
|
+
<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">agent_path</span><span class="p">):</span>
|
|
119
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/shared/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
120
|
+
|
|
121
|
+
<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">agent_path</span><span class="p">):</span>
|
|
122
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Error: Agent </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2"> not found</span><span class="se">\n</span><span class="s2">"</span>
|
|
123
|
+
<span class="k">yield</span> <span class="s2">"END</span><span class="se">\n</span><span class="s2">"</span>
|
|
124
|
+
<span class="k">return</span>
|
|
125
|
+
|
|
126
|
+
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">agent_path</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
127
|
+
<span class="n">agent_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>
|
|
128
|
+
|
|
129
|
+
<span class="c1"># Get recommended plugins</span>
|
|
130
|
+
<span class="n">recommended_plugins</span> <span class="o">=</span> <span class="n">agent_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'recommended_plugins'</span><span class="p">,</span> <span class="n">agent_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'required_plugins'</span><span class="p">,</span> <span class="p">[]))</span>
|
|
131
|
+
|
|
132
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">recommended_plugins</span><span class="p">:</span>
|
|
133
|
+
<span class="k">yield</span> <span class="s2">"No recommended plugins found for this agent</span><span class="se">\n</span><span class="s2">"</span>
|
|
134
|
+
<span class="k">yield</span> <span class="s2">"END</span><span class="se">\n</span><span class="s2">"</span>
|
|
135
|
+
<span class="k">return</span>
|
|
136
|
+
|
|
137
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">recommended_plugins</span><span class="p">)</span><span class="si">}</span><span class="s2"> recommended plugins for </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">...</span><span class="se">\n</span><span class="s2">"</span>
|
|
138
|
+
|
|
139
|
+
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
140
|
+
|
|
141
|
+
<span class="c1"># Install each plugin and stream the output</span>
|
|
142
|
+
<span class="k">for</span> <span class="n">plugin_source</span> <span class="ow">in</span> <span class="n">recommended_plugins</span><span class="p">:</span>
|
|
143
|
+
<span class="n">plugin_name</span> <span class="o">=</span> <span class="n">plugin_source</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
144
|
+
|
|
145
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">=== Installing </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> ===</span><span class="se">\n</span><span class="s2">"</span>
|
|
146
|
+
|
|
147
|
+
<span class="k">try</span><span class="p">:</span>
|
|
148
|
+
<span class="c1"># Check if already installed</span>
|
|
149
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">pkg_resources</span>
|
|
150
|
+
<span class="k">try</span><span class="p">:</span>
|
|
151
|
+
<span class="n">pkg_resources</span><span class="o">.</span><span class="n">get_distribution</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
|
|
152
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> is already installed</span><span class="se">\n</span><span class="s2">"</span>
|
|
153
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"already_installed"</span><span class="p">})</span>
|
|
154
|
+
<span class="k">continue</span>
|
|
155
|
+
<span class="k">except</span> <span class="n">pkg_resources</span><span class="o">.</span><span class="n">DistributionNotFound</span><span class="p">:</span>
|
|
156
|
+
<span class="k">pass</span>
|
|
157
|
+
|
|
158
|
+
<span class="c1"># Determine installation source</span>
|
|
159
|
+
<span class="k">if</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">plugin_source</span><span class="p">:</span> <span class="c1"># GitHub format</span>
|
|
160
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing from GitHub: </span><span class="si">{</span><span class="n">plugin_source</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
161
|
+
|
|
162
|
+
<span class="c1"># Download and extract</span>
|
|
163
|
+
<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">plugin_source</span><span class="p">)</span>
|
|
164
|
+
|
|
165
|
+
<span class="c1"># Stream the pip install</span>
|
|
166
|
+
<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">'-m'</span><span class="p">,</span> <span class="s1">'pip'</span><span class="p">,</span> <span class="s1">'install'</span><span class="p">,</span> <span class="s1">'-e'</span><span class="p">,</span> <span class="n">plugin_dir</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">]</span>
|
|
167
|
+
<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>
|
|
168
|
+
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'message'</span><span class="p">:</span>
|
|
169
|
+
<span class="k">yield</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
170
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'warning'</span><span class="p">:</span>
|
|
171
|
+
<span class="k">yield</span> <span class="s2">"WARNING: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
172
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
|
|
173
|
+
<span class="k">yield</span> <span class="s2">"ERROR: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
174
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'complete'</span><span class="p">:</span>
|
|
175
|
+
<span class="c1"># Update the plugin manifest after successful installation</span>
|
|
176
|
+
<span class="n">update_plugin_manifest</span><span class="p">(</span>
|
|
177
|
+
<span class="n">plugin_info</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span>
|
|
178
|
+
<span class="s1">'github'</span><span class="p">,</span>
|
|
179
|
+
<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>
|
|
180
|
+
<span class="n">remote_source</span><span class="o">=</span><span class="n">plugin_source</span><span class="p">,</span>
|
|
181
|
+
<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">'version'</span><span class="p">,</span> <span class="s1">'0.0.1'</span><span class="p">),</span>
|
|
182
|
+
<span class="n">metadata</span><span class="o">=</span><span class="n">plugin_info</span>
|
|
183
|
+
<span class="p">)</span>
|
|
184
|
+
|
|
185
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"github"</span><span class="p">,</span> <span class="s2">"source_path"</span><span class="p">:</span> <span class="n">plugin_source</span><span class="p">})</span>
|
|
186
|
+
<span class="k">else</span><span class="p">:</span>
|
|
187
|
+
<span class="c1"># PyPI installation</span>
|
|
188
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing from PyPI: </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
189
|
+
<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">'-m'</span><span class="p">,</span> <span class="s1">'pip'</span><span class="p">,</span> <span class="s1">'install'</span><span class="p">,</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">]</span>
|
|
190
|
+
<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>
|
|
191
|
+
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'message'</span><span class="p">:</span>
|
|
192
|
+
<span class="k">yield</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
193
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'warning'</span><span class="p">:</span>
|
|
194
|
+
<span class="k">yield</span> <span class="s2">"WARNING: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
195
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
|
|
196
|
+
<span class="k">yield</span> <span class="s2">"ERROR: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
197
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'complete'</span><span class="p">:</span>
|
|
198
|
+
<span class="c1"># Update the plugin manifest for PyPI install</span>
|
|
199
|
+
<span class="n">update_plugin_manifest</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">,</span> <span class="s1">'pypi'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
200
|
+
|
|
201
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"pypi"</span><span class="p">})</span>
|
|
202
|
+
|
|
203
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
204
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"ERROR: Failed to install </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2">: </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</span><span class="s2">"</span>
|
|
205
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>
|
|
206
|
+
|
|
207
|
+
<span class="c1"># Send results and END</span>
|
|
208
|
+
<span class="k">yield</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s2">"results"</span><span class="p">:</span> <span class="n">results</span><span class="p">})</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
209
|
+
<span class="k">yield</span> <span class="s2">"END"</span>
|
|
210
|
+
|
|
211
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
212
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"ERROR: </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</span><span class="s2">"</span>
|
|
213
|
+
<span class="k">yield</span> <span class="s2">"END"</span>
|
|
214
|
+
|
|
215
|
+
<span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">event_generator</span><span class="p">())</span>
|
|
216
|
+
|
|
217
|
+
<div class="viewcode-block" id="command_plugin_mapping">
|
|
218
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.command_plugin_mapping">[docs]</a>
|
|
219
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"/admin/command-plugin-mapping"</span><span class="p">)</span>
|
|
220
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">command_plugin_mapping</span><span class="p">():</span>
|
|
221
|
+
<span class="w"> </span><span class="sd">"""Get mapping of commands to plugins that provide them."""</span>
|
|
222
|
+
<span class="k">return</span> <span class="k">await</span> <span class="n">get_command_plugin_mapping</span><span class="p">()</span></div>
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
<div class="viewcode-block" id="queue_plugin_install">
|
|
226
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.queue_plugin_install">[docs]</a>
|
|
227
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">"/admin/queue-plugin-install"</span><span class="p">)</span>
|
|
228
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">queue_plugin_install</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">source</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">source_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">remote_source</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
|
|
229
|
+
<span class="w"> </span><span class="sd">"""Queue a plugin for installation."""</span>
|
|
230
|
+
<span class="c1"># Check if plugin is already in queue</span>
|
|
231
|
+
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">plugin_install_queue</span><span class="p">:</span>
|
|
232
|
+
<span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="s1">'plugin_name'</span><span class="p">]</span> <span class="o">==</span> <span class="n">plugin_name</span><span class="p">:</span>
|
|
233
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"already_queued"</span><span class="p">,</span> <span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">}</span>
|
|
234
|
+
|
|
235
|
+
<span class="c1"># Add to installation queue</span>
|
|
236
|
+
<span class="n">plugin_install_queue</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
|
|
237
|
+
<span class="s1">'plugin_name'</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span>
|
|
238
|
+
<span class="s1">'source'</span><span class="p">:</span> <span class="n">source</span><span class="p">,</span>
|
|
239
|
+
<span class="s1">'source_path'</span><span class="p">:</span> <span class="n">source_path</span><span class="p">,</span>
|
|
240
|
+
<span class="s1">'remote_source'</span><span class="p">:</span> <span class="n">remote_source</span>
|
|
241
|
+
<span class="p">})</span>
|
|
242
|
+
|
|
243
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"queued"</span><span class="p">,</span> <span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">}</span></div>
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
<div class="viewcode-block" id="install_queued_plugins">
|
|
247
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.install_queued_plugins">[docs]</a>
|
|
248
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">"/admin/install-queued-plugins"</span><span class="p">)</span>
|
|
249
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">install_queued_plugins</span><span class="p">():</span>
|
|
250
|
+
<span class="w"> </span><span class="sd">"""Install all queued plugins."""</span>
|
|
251
|
+
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
252
|
+
|
|
253
|
+
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">plugin_install_queue</span><span class="o">.</span><span class="n">copy</span><span class="p">():</span>
|
|
254
|
+
<span class="k">try</span><span class="p">:</span>
|
|
255
|
+
<span class="k">await</span> <span class="n">plugin_install</span><span class="p">(</span>
|
|
256
|
+
<span class="n">item</span><span class="p">[</span><span class="s1">'plugin_name'</span><span class="p">],</span>
|
|
257
|
+
<span class="n">item</span><span class="p">[</span><span class="s1">'source'</span><span class="p">],</span>
|
|
258
|
+
<span class="n">item</span><span class="p">[</span><span class="s1">'source_path'</span><span class="p">],</span>
|
|
259
|
+
<span class="n">item</span><span class="p">[</span><span class="s1">'remote_source'</span><span class="p">]</span>
|
|
260
|
+
<span class="p">)</span>
|
|
261
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
|
|
262
|
+
<span class="s1">'plugin_name'</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s1">'plugin_name'</span><span class="p">],</span>
|
|
263
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'success'</span>
|
|
264
|
+
<span class="p">})</span>
|
|
265
|
+
<span class="n">plugin_install_queue</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
|
|
266
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
267
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
|
|
268
|
+
<span class="s1">'plugin_name'</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="s1">'plugin_name'</span><span class="p">],</span>
|
|
269
|
+
<span class="s1">'status'</span><span class="p">:</span> <span class="s1">'error'</span><span class="p">,</span>
|
|
270
|
+
<span class="s1">'message'</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
|
271
|
+
<span class="p">})</span>
|
|
272
|
+
|
|
273
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"completed"</span><span class="p">,</span> <span class="s2">"results"</span><span class="p">:</span> <span class="n">results</span><span class="p">}</span></div>
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
<div class="viewcode-block" id="check_recommended_plugins">
|
|
277
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.check_recommended_plugins">[docs]</a>
|
|
278
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"/admin/check-recommended-plugins/</span><span class="si">{agent_name}</span><span class="s2">"</span><span class="p">)</span>
|
|
279
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">check_recommended_plugins</span><span class="p">(</span><span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
280
|
+
<span class="w"> </span><span class="sd">"""Check which recommended plugins are not installed."""</span>
|
|
281
|
+
<span class="k">try</span><span class="p">:</span>
|
|
282
|
+
<span class="c1"># Load agent data</span>
|
|
283
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/local/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
284
|
+
<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">agent_path</span><span class="p">):</span>
|
|
285
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/shared/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
286
|
+
|
|
287
|
+
<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">agent_path</span><span class="p">):</span>
|
|
288
|
+
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">404</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="sa">f</span><span class="s2">"Agent </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2"> not found"</span><span class="p">)</span>
|
|
289
|
+
|
|
290
|
+
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">agent_path</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
291
|
+
<span class="n">agent_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>
|
|
292
|
+
|
|
293
|
+
<span class="c1"># Get recommended plugins</span>
|
|
294
|
+
<span class="n">recommended_plugins</span> <span class="o">=</span> <span class="n">agent_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'recommended_plugins'</span><span class="p">)</span>
|
|
295
|
+
|
|
296
|
+
<span class="n">pending_plugins</span> <span class="o">=</span> <span class="p">[]</span>
|
|
297
|
+
<span class="n">plugin_sources</span> <span class="o">=</span> <span class="p">{}</span>
|
|
298
|
+
|
|
299
|
+
<span class="c1"># Define indices directory path</span>
|
|
300
|
+
<span class="n">indices_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s2">"indices"</span><span class="p">)</span>
|
|
301
|
+
<span class="n">data_indices_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s2">"data/indices"</span><span class="p">)</span>
|
|
302
|
+
|
|
303
|
+
<span class="c1"># Determine which indices directory exists</span>
|
|
304
|
+
<span class="k">if</span> <span class="n">data_indices_dir</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
|
|
305
|
+
<span class="n">indices_dir</span> <span class="o">=</span> <span class="n">data_indices_dir</span>
|
|
306
|
+
|
|
307
|
+
<span class="c1"># Get all available indices</span>
|
|
308
|
+
<span class="n">available_indices</span> <span class="o">=</span> <span class="p">[]</span>
|
|
309
|
+
<span class="k">for</span> <span class="n">index_file</span> <span class="ow">in</span> <span class="n">indices_dir</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">"*.json"</span><span class="p">):</span>
|
|
310
|
+
<span class="k">try</span><span class="p">:</span>
|
|
311
|
+
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">index_file</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
312
|
+
<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>
|
|
313
|
+
<span class="n">available_indices</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">index_data</span><span class="p">)</span>
|
|
314
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
315
|
+
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Error reading index file </span><span class="si">{</span><span class="n">index_file</span><span class="si">}</span><span class="s2">: </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="p">)</span>
|
|
316
|
+
|
|
317
|
+
<span class="c1"># Check each recommended plugin</span>
|
|
318
|
+
<span class="k">for</span> <span class="n">plugin_source</span> <span class="ow">in</span> <span class="n">recommended_plugins</span><span class="p">:</span>
|
|
319
|
+
<span class="k">try</span><span class="p">:</span>
|
|
320
|
+
<span class="c1"># if there is a slash, the name is the last part</span>
|
|
321
|
+
<span class="n">plugin_name</span> <span class="o">=</span> <span class="n">plugin_source</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
322
|
+
<span class="c1"># First check if plugin is already installed</span>
|
|
323
|
+
<span class="k">try</span><span class="p">:</span>
|
|
324
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">pkg_resources</span>
|
|
325
|
+
<span class="n">pkg_resources</span><span class="o">.</span><span class="n">get_distribution</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
|
|
326
|
+
<span class="k">continue</span> <span class="c1"># Plugin is installed, skip to next</span>
|
|
327
|
+
<span class="k">except</span> <span class="n">pkg_resources</span><span class="o">.</span><span class="n">DistributionNotFound</span><span class="p">:</span>
|
|
328
|
+
<span class="c1"># Plugin is not installed, look for it in indices</span>
|
|
329
|
+
<span class="n">found</span> <span class="o">=</span> <span class="kc">False</span>
|
|
330
|
+
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">available_indices</span><span class="p">:</span>
|
|
331
|
+
<span class="k">for</span> <span class="n">plugin</span> <span class="ow">in</span> <span class="n">index</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'plugins'</span><span class="p">,</span> <span class="p">[]):</span>
|
|
332
|
+
<span class="k">if</span> <span class="n">plugin</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span> <span class="o">==</span> <span class="n">plugin_name</span><span class="p">:</span>
|
|
333
|
+
<span class="c1"># Found the plugin in an index</span>
|
|
334
|
+
<span class="n">remote_source</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'remote_source'</span><span class="p">)</span>
|
|
335
|
+
<span class="n">github_url</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'github_url'</span><span class="p">)</span>
|
|
336
|
+
|
|
337
|
+
<span class="c1"># Extract GitHub repo path if available</span>
|
|
338
|
+
<span class="k">if</span> <span class="n">github_url</span> <span class="ow">and</span> <span class="s1">'github.com/'</span> <span class="ow">in</span> <span class="n">github_url</span><span class="p">:</span>
|
|
339
|
+
<span class="n">github_path</span> <span class="o">=</span> <span class="n">github_url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'github.com/'</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
|
|
340
|
+
<span class="n">plugin_sources</span><span class="p">[</span><span class="n">plugin_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">github_path</span>
|
|
341
|
+
<span class="k">elif</span> <span class="n">remote_source</span><span class="p">:</span>
|
|
342
|
+
<span class="n">plugin_sources</span><span class="p">[</span><span class="n">plugin_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">remote_source</span>
|
|
343
|
+
|
|
344
|
+
<span class="n">found</span> <span class="o">=</span> <span class="kc">True</span>
|
|
345
|
+
<span class="k">break</span>
|
|
346
|
+
|
|
347
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">found</span><span class="p">:</span>
|
|
348
|
+
<span class="c1"># If not found in indices, use the name as is</span>
|
|
349
|
+
<span class="n">plugin_sources</span><span class="p">[</span><span class="n">plugin_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">plugin_name</span>
|
|
350
|
+
|
|
351
|
+
<span class="n">pending_plugins</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
|
|
352
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
353
|
+
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Error checking plugin </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2">: </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="p">)</span>
|
|
354
|
+
<span class="n">pending_plugins</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
|
|
355
|
+
|
|
356
|
+
<span class="k">return</span> <span class="p">{</span><span class="s2">"pending_plugins"</span><span class="p">:</span> <span class="n">pending_plugins</span><span class="p">,</span> <span class="s2">"plugin_sources"</span><span class="p">:</span> <span class="n">plugin_sources</span><span class="p">}</span>
|
|
357
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
358
|
+
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
<div class="viewcode-block" id="install_agent_recommended_plugins">
|
|
362
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.install_agent_recommended_plugins">[docs]</a>
|
|
363
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">"/admin/install-recommended-plugins/</span><span class="si">{agent_name}</span><span class="s2">"</span><span class="p">)</span>
|
|
364
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">install_agent_recommended_plugins</span><span class="p">(</span><span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
365
|
+
<span class="w"> </span><span class="sd">"""Install plugins recommended for an agent."""</span>
|
|
366
|
+
<span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">install_recommended_plugins</span><span class="p">(</span><span class="n">agent_name</span><span class="p">)</span>
|
|
367
|
+
<span class="k">if</span> <span class="s2">"error"</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
|
|
368
|
+
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="n">result</span><span class="p">[</span><span class="s2">"error"</span><span class="p">])</span>
|
|
369
|
+
<span class="k">return</span> <span class="n">result</span></div>
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
<span class="c1"># ------------------------------------------------------------------</span>
|
|
373
|
+
<span class="c1"># NEW: Stream installation of recommended plugins with live logs</span>
|
|
374
|
+
<span class="c1"># ------------------------------------------------------------------</span>
|
|
375
|
+
|
|
376
|
+
<div class="viewcode-block" id="stream_install_recommended_plugins">
|
|
377
|
+
<a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.command_router.stream_install_recommended_plugins">[docs]</a>
|
|
378
|
+
<span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"/admin/stream-install-recommended-plugins/</span><span class="si">{agent_name}</span><span class="s2">"</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">EventSourceResponse</span><span class="p">)</span>
|
|
379
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">stream_install_recommended_plugins</span><span class="p">(</span><span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
|
|
380
|
+
<span class="w"> </span><span class="sd">"""</span>
|
|
381
|
+
<span class="sd"> SSE endpoint that installs all recommended plugins for `agent_name`</span>
|
|
382
|
+
<span class="sd"> and streams stdout/stderr lines back to the browser. It finishes by</span>
|
|
383
|
+
<span class="sd"> sending a JSON summary and the literal string 'END'.</span>
|
|
384
|
+
<span class="sd"> """</span>
|
|
385
|
+
|
|
386
|
+
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">event_generator</span><span class="p">():</span>
|
|
387
|
+
<span class="k">try</span><span class="p">:</span>
|
|
388
|
+
<span class="c1"># Load agent data</span>
|
|
389
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/local/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
390
|
+
<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">agent_path</span><span class="p">):</span>
|
|
391
|
+
<span class="n">agent_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"data/agents/shared/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/agent.json"</span>
|
|
392
|
+
|
|
393
|
+
<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">agent_path</span><span class="p">):</span>
|
|
394
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Error: Agent </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2"> not found</span><span class="se">\n</span><span class="s2">"</span>
|
|
395
|
+
<span class="k">yield</span> <span class="s2">"END</span><span class="se">\n</span><span class="s2">"</span>
|
|
396
|
+
<span class="k">return</span>
|
|
397
|
+
|
|
398
|
+
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">agent_path</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
399
|
+
<span class="n">agent_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>
|
|
400
|
+
|
|
401
|
+
<span class="c1"># Get recommended plugins</span>
|
|
402
|
+
<span class="n">recommended_plugins</span> <span class="o">=</span> <span class="n">agent_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'recommended_plugins'</span><span class="p">,</span> <span class="n">agent_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'required_plugins'</span><span class="p">,</span> <span class="p">[]))</span>
|
|
403
|
+
|
|
404
|
+
<span class="k">if</span> <span class="ow">not</span> <span class="n">recommended_plugins</span><span class="p">:</span>
|
|
405
|
+
<span class="k">yield</span> <span class="s2">"No recommended plugins found for this agent</span><span class="se">\n</span><span class="s2">"</span>
|
|
406
|
+
<span class="k">yield</span> <span class="s2">"END</span><span class="se">\n</span><span class="s2">"</span>
|
|
407
|
+
<span class="k">return</span>
|
|
408
|
+
|
|
409
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">recommended_plugins</span><span class="p">)</span><span class="si">}</span><span class="s2"> recommended plugins for </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">...</span><span class="se">\n</span><span class="s2">"</span>
|
|
410
|
+
|
|
411
|
+
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
|
|
412
|
+
|
|
413
|
+
<span class="c1"># Install each plugin and stream the output</span>
|
|
414
|
+
<span class="k">for</span> <span class="n">plugin_source</span> <span class="ow">in</span> <span class="n">recommended_plugins</span><span class="p">:</span>
|
|
415
|
+
<span class="n">plugin_name</span> <span class="o">=</span> <span class="n">plugin_source</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
416
|
+
|
|
417
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"</span><span class="se">\n</span><span class="s2">=== Installing </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> ===</span><span class="se">\n</span><span class="s2">"</span>
|
|
418
|
+
|
|
419
|
+
<span class="k">try</span><span class="p">:</span>
|
|
420
|
+
<span class="c1"># Check if already installed</span>
|
|
421
|
+
<span class="kn">import</span><span class="w"> </span><span class="nn">pkg_resources</span>
|
|
422
|
+
<span class="k">try</span><span class="p">:</span>
|
|
423
|
+
<span class="n">pkg_resources</span><span class="o">.</span><span class="n">get_distribution</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">)</span>
|
|
424
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2"> is already installed</span><span class="se">\n</span><span class="s2">"</span>
|
|
425
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"already_installed"</span><span class="p">})</span>
|
|
426
|
+
<span class="k">continue</span>
|
|
427
|
+
<span class="k">except</span> <span class="n">pkg_resources</span><span class="o">.</span><span class="n">DistributionNotFound</span><span class="p">:</span>
|
|
428
|
+
<span class="k">pass</span>
|
|
429
|
+
|
|
430
|
+
<span class="c1"># Determine installation source</span>
|
|
431
|
+
<span class="k">if</span> <span class="s1">'/'</span> <span class="ow">in</span> <span class="n">plugin_source</span><span class="p">:</span> <span class="c1"># GitHub format</span>
|
|
432
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing from GitHub: </span><span class="si">{</span><span class="n">plugin_source</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
433
|
+
|
|
434
|
+
<span class="c1"># Download and extract</span>
|
|
435
|
+
<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">plugin_source</span><span class="p">)</span>
|
|
436
|
+
|
|
437
|
+
<span class="c1"># Stream the pip install</span>
|
|
438
|
+
<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">'-m'</span><span class="p">,</span> <span class="s1">'pip'</span><span class="p">,</span> <span class="s1">'install'</span><span class="p">,</span> <span class="s1">'-e'</span><span class="p">,</span> <span class="n">plugin_dir</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">]</span>
|
|
439
|
+
<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>
|
|
440
|
+
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'message'</span><span class="p">:</span>
|
|
441
|
+
<span class="k">yield</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
442
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'warning'</span><span class="p">:</span>
|
|
443
|
+
<span class="k">yield</span> <span class="s2">"WARNING: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
444
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
|
|
445
|
+
<span class="k">yield</span> <span class="s2">"ERROR: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
446
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'complete'</span><span class="p">:</span>
|
|
447
|
+
<span class="c1"># Update the plugin manifest after successful installation</span>
|
|
448
|
+
<span class="n">update_plugin_manifest</span><span class="p">(</span>
|
|
449
|
+
<span class="n">plugin_info</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span>
|
|
450
|
+
<span class="s1">'github'</span><span class="p">,</span>
|
|
451
|
+
<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>
|
|
452
|
+
<span class="n">remote_source</span><span class="o">=</span><span class="n">plugin_source</span><span class="p">,</span>
|
|
453
|
+
<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">'version'</span><span class="p">,</span> <span class="s1">'0.0.1'</span><span class="p">),</span>
|
|
454
|
+
<span class="n">metadata</span><span class="o">=</span><span class="n">plugin_info</span>
|
|
455
|
+
<span class="p">)</span>
|
|
456
|
+
|
|
457
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"github"</span><span class="p">,</span> <span class="s2">"source_path"</span><span class="p">:</span> <span class="n">plugin_source</span><span class="p">})</span>
|
|
458
|
+
<span class="k">else</span><span class="p">:</span>
|
|
459
|
+
<span class="c1"># PyPI installation</span>
|
|
460
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"Installing from PyPI: </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span>
|
|
461
|
+
<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">'-m'</span><span class="p">,</span> <span class="s1">'pip'</span><span class="p">,</span> <span class="s1">'install'</span><span class="p">,</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s1">'-v'</span><span class="p">]</span>
|
|
462
|
+
<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>
|
|
463
|
+
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'message'</span><span class="p">:</span>
|
|
464
|
+
<span class="k">yield</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
465
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'warning'</span><span class="p">:</span>
|
|
466
|
+
<span class="k">yield</span> <span class="s2">"WARNING: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
467
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'error'</span><span class="p">:</span>
|
|
468
|
+
<span class="k">yield</span> <span class="s2">"ERROR: "</span> <span class="o">+</span> <span class="n">event</span><span class="p">[</span><span class="s1">'data'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
469
|
+
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'event'</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'complete'</span><span class="p">:</span>
|
|
470
|
+
<span class="c1"># Update the plugin manifest for PyPI install</span>
|
|
471
|
+
<span class="n">update_plugin_manifest</span><span class="p">(</span><span class="n">plugin_name</span><span class="p">,</span> <span class="s1">'pypi'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
472
|
+
|
|
473
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"source"</span><span class="p">:</span> <span class="s2">"pypi"</span><span class="p">})</span>
|
|
474
|
+
|
|
475
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
476
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"ERROR: Failed to install </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="s2">: </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</span><span class="s2">"</span>
|
|
477
|
+
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">"plugin"</span><span class="p">:</span> <span class="n">plugin_name</span><span class="p">,</span> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span> <span class="s2">"message"</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)})</span>
|
|
478
|
+
|
|
479
|
+
<span class="c1"># Send results and END</span>
|
|
480
|
+
<span class="k">yield</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="o">+</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s2">"results"</span><span class="p">:</span> <span class="n">results</span><span class="p">})</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
481
|
+
<span class="k">yield</span> <span class="s2">"END"</span>
|
|
482
|
+
|
|
483
|
+
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
484
|
+
<span class="k">yield</span> <span class="sa">f</span><span class="s2">"ERROR: </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</span><span class="s2">"</span>
|
|
485
|
+
<span class="k">yield</span> <span class="s2">"END"</span>
|
|
486
|
+
|
|
487
|
+
<span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="n">event_generator</span><span class="p">())</span></div>
|
|
488
|
+
|
|
489
|
+
</pre></div>
|
|
490
|
+
|
|
491
|
+
</div>
|
|
492
|
+
</div>
|
|
493
|
+
<footer>
|
|
494
|
+
|
|
495
|
+
<hr/>
|
|
496
|
+
|
|
497
|
+
<div role="contentinfo">
|
|
498
|
+
<p>© Copyright 2025, Jason Livesay.</p>
|
|
499
|
+
</div>
|
|
500
|
+
|
|
501
|
+
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
|
502
|
+
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
|
503
|
+
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
</footer>
|
|
507
|
+
</div>
|
|
508
|
+
</div>
|
|
509
|
+
</section>
|
|
510
|
+
</div>
|
|
511
|
+
<script>
|
|
512
|
+
jQuery(function () {
|
|
513
|
+
SphinxRtdTheme.Navigation.enable(true);
|
|
514
|
+
});
|
|
515
|
+
</script>
|
|
516
|
+
|
|
517
|
+
</body>
|
|
518
|
+
</html>
|