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

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

Potentially problematic release.


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

Files changed (417) hide show
  1. mindroot/coreplugins/admin/static/js/model-preferences-v2.js +1 -1
  2. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  3. mindroot/docs/Makefile +20 -0
  4. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  5. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  6. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  7. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  8. mindroot/docs/_build/doctrees/index.doctree +0 -0
  9. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  10. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  13. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  45. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  46. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  47. mindroot/docs/_build/html/.buildinfo +4 -0
  48. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  49. mindroot/docs/_build/html/_images/envvar.png +0 -0
  50. mindroot/docs/_build/html/_images/files.png +0 -0
  51. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  52. mindroot/docs/_build/html/_images/mood.png +0 -0
  53. mindroot/docs/_build/html/_images/moon.png +0 -0
  54. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  55. mindroot/docs/_build/html/_images/restart.png +0 -0
  56. mindroot/docs/_build/html/_modules/index.html +425 -0
  57. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  152. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  153. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  182. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  183. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  184. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  185. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  186. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  188. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  189. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  190. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  191. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  192. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  193. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  194. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  195. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  196. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  197. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  198. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  199. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  226. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  227. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  228. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  229. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  230. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  231. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  232. mindroot/docs/_build/html/_static/basic.css +906 -0
  233. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  234. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  250. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  251. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  252. mindroot/docs/_build/html/_static/custom.css +19 -0
  253. mindroot/docs/_build/html/_static/debug.css +69 -0
  254. mindroot/docs/_build/html/_static/doctools.js +149 -0
  255. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  256. mindroot/docs/_build/html/_static/file.png +0 -0
  257. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  272. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  273. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  280. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  281. mindroot/docs/_build/html/_static/jquery.js +2 -0
  282. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  283. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  284. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  285. mindroot/docs/_build/html/_static/language_data.js +192 -0
  286. mindroot/docs/_build/html/_static/minus.png +0 -0
  287. mindroot/docs/_build/html/_static/plus.png +0 -0
  288. mindroot/docs/_build/html/_static/pygments.css +232 -0
  289. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  290. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  292. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  293. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  294. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  295. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  296. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  297. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  298. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  299. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  300. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  301. mindroot/docs/_build/html/developer_documentation.html +338 -0
  302. mindroot/docs/_build/html/genindex.html +4690 -0
  303. mindroot/docs/_build/html/getting_started.html +423 -0
  304. mindroot/docs/_build/html/index.html +357 -0
  305. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  306. mindroot/docs/_build/html/installation.html +330 -0
  307. mindroot/docs/_build/html/llm_api_key.html +337 -0
  308. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  309. mindroot/docs/_build/html/objects.inv +0 -0
  310. mindroot/docs/_build/html/programming_task.html +326 -0
  311. mindroot/docs/_build/html/py-modindex.html +1307 -0
  312. mindroot/docs/_build/html/search.html +307 -0
  313. mindroot/docs/_build/html/searchindex.js +1 -0
  314. mindroot/docs/_build/html/source/ahp.html +302 -0
  315. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  334. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  335. mindroot/docs/_build/html/source/mindroot.html +811 -0
  336. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  341. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  342. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  343. mindroot/docs/_build/html/source/modules.html +377 -0
  344. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  345. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  346. mindroot/docs/_build/html/user_documentation.html +333 -0
  347. mindroot/docs/_static/custom.css +19 -0
  348. mindroot/docs/chat_with_assistant.rst +14 -0
  349. mindroot/docs/conf.py +54 -0
  350. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  351. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  352. mindroot/docs/data/equivalent_flags.json +1 -0
  353. mindroot/docs/data/mcp/servers.json +9 -0
  354. mindroot/docs/data/models.json +57 -0
  355. mindroot/docs/data/plugin_manifest.json +95 -0
  356. mindroot/docs/data/preferred_models.json +12 -0
  357. mindroot/docs/data/providers.json +62 -0
  358. mindroot/docs/developer_documentation.rst +26 -0
  359. mindroot/docs/envvar.png +0 -0
  360. mindroot/docs/files.png +0 -0
  361. mindroot/docs/getting_started.rst +139 -0
  362. mindroot/docs/index.rst +38 -0
  363. mindroot/docs/install_plugins_with_tools.rst +25 -0
  364. mindroot/docs/installation.rst +21 -0
  365. mindroot/docs/installopenrouter.png +0 -0
  366. mindroot/docs/llm_api_key.rst +22 -0
  367. mindroot/docs/llm_plugin_installation.rst +27 -0
  368. mindroot/docs/make.bat +35 -0
  369. mindroot/docs/mood.png +0 -0
  370. mindroot/docs/moon.png +0 -0
  371. mindroot/docs/openrouter.png +0 -0
  372. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  373. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  374. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  375. mindroot/docs/programming_task.rst +10 -0
  376. mindroot/docs/restart.png +0 -0
  377. mindroot/docs/source/ahp.rst +7 -0
  378. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  379. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  380. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  381. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  382. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  383. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  384. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  385. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  386. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  387. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  388. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  389. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  390. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  391. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  392. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  393. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  394. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  395. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  396. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  397. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  398. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  399. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  400. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  401. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  402. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  403. mindroot/docs/source/mindroot.lib.rst +152 -0
  404. mindroot/docs/source/mindroot.registry.rst +29 -0
  405. mindroot/docs/source/mindroot.rst +54 -0
  406. mindroot/docs/source/modules.rst +7 -0
  407. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  408. mindroot/docs/starting_mindroot.rst +12 -0
  409. mindroot/docs/user_documentation.rst +16 -0
  410. mindroot/lib/providers/model_preferences_v2.py +5 -3
  411. mindroot/server.py +10 -1
  412. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/METADATA +1 -1
  413. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/RECORD +417 -10
  414. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/WHEEL +0 -0
  415. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/entry_points.txt +0 -0
  416. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/licenses/LICENSE +0 -0
  417. {mindroot-9.11.0.dist-info → mindroot-9.13.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,234 @@
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.user_service.admin_init &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.user_service.admin_init</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.user_service.admin_init</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
70
+ <span class="kn">import</span><span class="w"> </span><span class="nn">random</span>
71
+ <span class="kn">import</span><span class="w"> </span><span class="nn">string</span>
72
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Optional</span>
73
+ <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>
74
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
75
+ <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span>
76
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.hooks</span><span class="w"> </span><span class="kn">import</span> <span class="n">hook</span>
77
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">UserAuth</span><span class="p">,</span> <span class="n">UserCreate</span>
78
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.role_service</span><span class="w"> </span><span class="kn">import</span> <span class="n">has_role</span>
79
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.mod</span><span class="w"> </span><span class="kn">import</span> <span class="n">create_user</span>
80
+ <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</span>
81
+ <span class="kn">from</span><span class="w"> </span><span class="nn">rich.console</span><span class="w"> </span><span class="kn">import</span> <span class="n">Console</span>
82
+
83
+ <span class="n">console</span> <span class="o">=</span> <span class="n">Console</span><span class="p">()</span>
84
+
85
+ <span class="n">USER_DATA_ROOT</span> <span class="o">=</span> <span class="s2">&quot;data/users&quot;</span>
86
+
87
+
88
+ <span class="n">created_admin</span> <span class="o">=</span> <span class="p">{}</span>
89
+
90
+ <div class="viewcode-block" id="startup">
91
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.admin_init.startup">[docs]</a>
92
+ <span class="nd">@hook</span><span class="p">()</span>
93
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">startup</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
94
+ <span class="n">admin_user</span><span class="p">,</span> <span class="n">admin_pass</span> <span class="o">=</span> <span class="k">await</span> <span class="n">initialize_admin</span><span class="p">(</span><span class="n">USER_DATA_ROOT</span><span class="p">,</span> <span class="n">app</span><span class="p">)</span>
95
+ <span class="k">if</span> <span class="n">admin_user</span><span class="p">:</span>
96
+ <span class="n">created_admin</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">admin_user</span>
97
+ <span class="n">created_admin</span><span class="p">[</span><span class="s2">&quot;password&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">admin_pass</span>
98
+ <span class="n">console</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Created admin user: </span><span class="si">{</span><span class="n">created_admin</span><span class="p">[</span><span class="s1">&#39;username&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> password: </span><span class="si">{</span><span class="n">created_admin</span><span class="p">[</span><span class="s1">&#39;password&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
99
+ <span class="n">style</span><span class="o">=</span> <span class="s2">&quot;yellow on dark_blue&quot;</span><span class="p">)</span></div>
100
+
101
+
102
+
103
+ <div class="viewcode-block" id="generate_random_credentials">
104
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.admin_init.generate_random_credentials">[docs]</a>
105
+ <span class="k">def</span><span class="w"> </span><span class="nf">generate_random_credentials</span><span class="p">(</span><span class="n">prefix</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;admin&quot;</span><span class="p">,</span> <span class="n">length</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">8</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
106
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Generate random admin username and password.&quot;&quot;&quot;</span>
107
+ <span class="n">chars</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">ascii_letters</span> <span class="o">+</span> <span class="n">string</span><span class="o">.</span><span class="n">digits</span>
108
+ <span class="n">random_suffix</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">choices</span><span class="p">(</span><span class="n">chars</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="n">length</span><span class="p">))</span>
109
+ <span class="n">random_pass</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">choices</span><span class="p">(</span><span class="n">chars</span> <span class="o">+</span> <span class="s2">&quot;!@#$%^&amp;*&quot;</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">16</span><span class="p">))</span>
110
+
111
+ <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">prefix</span><span class="si">}{</span><span class="n">random_suffix</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">random_pass</span></div>
112
+
113
+
114
+ <div class="viewcode-block" id="check_for_admin">
115
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.admin_init.check_for_admin">[docs]</a>
116
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">check_for_admin</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
117
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if any admin user exists.&quot;&quot;&quot;</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">user_data_root</span><span class="p">):</span>
119
+ <span class="k">return</span> <span class="kc">False</span>
120
+
121
+ <span class="k">for</span> <span class="n">username</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">):</span>
122
+ <span class="n">auth_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&quot;auth.json&quot;</span><span class="p">)</span>
123
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">auth_file</span><span class="p">):</span>
124
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">auth_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
125
+ <span class="k">try</span><span class="p">:</span>
126
+ <span class="n">auth_data</span> <span class="o">=</span> <span class="n">UserAuth</span><span class="p">(</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>
127
+ <span class="k">if</span> <span class="s2">&quot;admin&quot;</span> <span class="ow">in</span> <span class="n">auth_data</span><span class="o">.</span><span class="n">roles</span><span class="p">:</span>
128
+ <span class="k">return</span> <span class="kc">True</span>
129
+ <span class="k">except</span><span class="p">:</span>
130
+ <span class="k">continue</span>
131
+ <span class="k">return</span> <span class="kc">False</span></div>
132
+
133
+
134
+ <div class="viewcode-block" id="initialize_admin">
135
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.admin_init.initialize_admin">[docs]</a>
136
+ <span class="nd">@service</span><span class="p">()</span>
137
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">initialize_admin</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">app</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
138
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Check for and create admin user if needed.</span>
139
+ <span class="sd"> Returns tuple of (username, password) if created, (None, None) if admin exists.</span>
140
+ <span class="sd"> </span>
141
+ <span class="sd"> This should be called during system startup to ensure at least one admin exists.</span>
142
+ <span class="sd"> The admin user will have &#39;admin&#39;, &#39;verified&#39;, and &#39;user&#39; roles.</span>
143
+ <span class="sd"> &quot;&quot;&quot;</span>
144
+
145
+ <span class="n">args</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">cmd_args</span>
146
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;args&quot;</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
147
+
148
+ <span class="n">username</span> <span class="o">=</span> <span class="kc">None</span>
149
+ <span class="n">password</span> <span class="o">=</span> <span class="kc">None</span>
150
+
151
+ <span class="n">admin_user</span> <span class="o">=</span> <span class="kc">None</span>
152
+ <span class="n">admin_pass</span> <span class="o">=</span> <span class="kc">None</span>
153
+
154
+ <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">admin_user</span><span class="p">:</span>
155
+ <span class="n">admin_user</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">admin_user</span>
156
+ <span class="n">admin_pass</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">admin_password</span>
157
+
158
+ <span class="k">if</span> <span class="n">admin_user</span> <span class="ow">and</span> <span class="n">admin_pass</span><span class="p">:</span>
159
+ <span class="n">username</span> <span class="o">=</span> <span class="n">admin_user</span>
160
+ <span class="n">password</span> <span class="o">=</span> <span class="n">admin_pass</span>
161
+ <span class="k">else</span><span class="p">:</span>
162
+ <span class="k">if</span> <span class="k">await</span> <span class="n">check_for_admin</span><span class="p">(</span><span class="n">user_data_root</span><span class="p">):</span>
163
+ <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
164
+
165
+ <span class="c1"># Check environment variables first</span>
166
+ <span class="n">env_user</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ADMIN_USER&#39;</span><span class="p">)</span>
167
+ <span class="n">env_pass</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ADMIN_PASS&#39;</span><span class="p">)</span>
168
+
169
+ <span class="c1"># If no admin exists, either use env credentials or generate new ones</span>
170
+ <span class="n">username</span> <span class="o">=</span> <span class="n">env_user</span>
171
+ <span class="n">password</span> <span class="o">=</span> <span class="n">env_pass</span>
172
+
173
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">username</span> <span class="ow">and</span> <span class="n">password</span><span class="p">):</span>
174
+ <span class="n">username</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">generate_random_credentials</span><span class="p">()</span>
175
+ <span class="n">username</span> <span class="o">=</span> <span class="s1">&#39;admin&#39;</span>
176
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">50</span><span class="p">)</span>
177
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;INITIAL ADMIN CREDENTIALS GENERATED:&quot;</span><span class="p">)</span>
178
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Username: </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
179
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Password: </span><span class="si">{</span><span class="n">password</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
180
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">50</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
181
+
182
+ <span class="c1"># Create admin user with appropriate roles</span>
183
+ <span class="n">user_data</span> <span class="o">=</span> <span class="n">UserCreate</span><span class="p">(</span>
184
+ <span class="n">username</span><span class="o">=</span><span class="n">username</span><span class="p">,</span>
185
+ <span class="n">password</span><span class="o">=</span><span class="n">password</span><span class="p">,</span>
186
+ <span class="n">email</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ADMIN_EMAIL&#39;</span><span class="p">,</span> <span class="s1">&#39;admin@admin.com&#39;</span><span class="p">)</span>
187
+ <span class="p">)</span>
188
+
189
+ <span class="k">try</span><span class="p">:</span>
190
+ <span class="k">await</span> <span class="n">create_user</span><span class="p">(</span>
191
+ <span class="n">user_data</span><span class="p">,</span>
192
+ <span class="n">roles</span><span class="o">=</span><span class="p">[</span><span class="s2">&quot;admin&quot;</span><span class="p">,</span> <span class="s2">&quot;verified&quot;</span><span class="p">],</span>
193
+ <span class="n">skip_verification</span><span class="o">=</span><span class="kc">True</span> <span class="c1"># Admin is automatically verified</span>
194
+ <span class="p">)</span>
195
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
196
+ <span class="c1"># if it has &#39;exists&#39; in the error message, then it&#39;s a duplicate user</span>
197
+ <span class="k">if</span> <span class="s1">&#39;exists&#39;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">):</span>
198
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Admin user already exists&quot;</span><span class="p">)</span>
199
+ <span class="k">pass</span>
200
+ <span class="k">else</span><span class="p">:</span>
201
+ <span class="k">raise</span> <span class="n">e</span>
202
+
203
+ <span class="k">return</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span></div>
204
+
205
+ </pre></div>
206
+
207
+ </div>
208
+ </div>
209
+ <footer>
210
+
211
+ <hr/>
212
+
213
+ <div role="contentinfo">
214
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
215
+ </div>
216
+
217
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
218
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
219
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
220
+
221
+
222
+ </footer>
223
+ </div>
224
+ </div>
225
+ </section>
226
+ </div>
227
+ <script>
228
+ jQuery(function () {
229
+ SphinxRtdTheme.Navigation.enable(true);
230
+ });
231
+ </script>
232
+
233
+ </body>
234
+ </html>
@@ -0,0 +1,204 @@
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.user_service.email_service &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.user_service.email_service</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.user_service.email_service</h1><div class="highlight"><pre>
69
+ <span></span><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>
70
+ <span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
71
+ <span class="kn">import</span><span class="w"> </span><span class="nn">secrets</span>
72
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
73
+ <span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
74
+
75
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
76
+
77
+ <span class="n">REQUIRE_EMAIL_VERIFY</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;REQUIRE_EMAIL_VERIFY&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
78
+ <span class="n">BASE_URL</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;BASE_URL&#39;</span><span class="p">,</span> <span class="s1">&#39;http://localhost:8011&#39;</span><span class="p">)</span>
79
+
80
+ <div class="viewcode-block" id="send_verification_email">
81
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.email_service.send_verification_email">[docs]</a>
82
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">send_verification_email</span><span class="p">(</span><span class="n">email</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">verification_token</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
83
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Send email verification link to user.&quot;&quot;&quot;</span>
84
+ <span class="n">verification_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">BASE_URL</span><span class="si">}</span><span class="s2">/verify-email?token=</span><span class="si">{</span><span class="n">verification_token</span><span class="si">}</span><span class="s2">&quot;</span>
85
+
86
+ <span class="n">email_html</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span>
87
+ <span class="s2"> &lt;html&gt;</span>
88
+ <span class="s2"> &lt;body&gt;</span>
89
+ <span class="s2"> &lt;h1&gt;Welcome to MindRoot!&lt;/h1&gt;</span>
90
+ <span class="s2"> &lt;p&gt;Please verify your email address by clicking the link below:&lt;/p&gt;</span>
91
+ <span class="s2"> &lt;p&gt;&lt;a href=&quot;</span><span class="si">{</span><span class="n">verification_url</span><span class="si">}</span><span class="s2">&quot; style=&quot;background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px;&quot;&gt;Verify Email&lt;/a&gt;&lt;/p&gt;</span>
92
+ <span class="s2"> &lt;p&gt;Or copy and paste this link into your browser:&lt;/p&gt;</span>
93
+ <span class="s2"> &lt;p&gt;&lt;code&gt;</span><span class="si">{</span><span class="n">verification_url</span><span class="si">}</span><span class="s2">&lt;/code&gt;&lt;/p&gt;</span>
94
+ <span class="s2"> &lt;p&gt;This link will expire in 24 hours.&lt;/p&gt;</span>
95
+ <span class="s2"> &lt;br&gt;</span>
96
+ <span class="s2"> &lt;p&gt;&lt;small&gt;If you did not create this account, please ignore this email.&lt;/small&gt;&lt;/p&gt;</span>
97
+ <span class="s2"> &lt;/body&gt;</span>
98
+ <span class="s2"> &lt;/html&gt;</span>
99
+ <span class="s2"> &quot;&quot;&quot;</span>
100
+
101
+ <span class="k">try</span><span class="p">:</span>
102
+ <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">send_email</span><span class="p">(</span>
103
+ <span class="n">to</span><span class="o">=</span><span class="n">email</span><span class="p">,</span>
104
+ <span class="n">subject</span><span class="o">=</span><span class="s2">&quot;Verify Your MindRoot Account&quot;</span><span class="p">,</span>
105
+ <span class="n">body</span><span class="o">=</span><span class="n">email_html</span> <span class="c1"># HTML content will be auto-detected</span>
106
+ <span class="p">)</span>
107
+
108
+ <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;success&#39;</span><span class="p">):</span>
109
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Verification email sent successfully to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
110
+ <span class="k">return</span> <span class="kc">True</span>
111
+ <span class="k">else</span><span class="p">:</span>
112
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to send verification email to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
113
+ <span class="k">return</span> <span class="kc">False</span>
114
+
115
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
116
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Exception sending verification email to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
117
+ <span class="k">return</span> <span class="kc">False</span></div>
118
+
119
+
120
+ <div class="viewcode-block" id="send_password_reset_email">
121
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.email_service.send_password_reset_email">[docs]</a>
122
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">send_password_reset_email</span><span class="p">(</span><span class="n">email</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">reset_token</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
123
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Send password reset email to user.&quot;&quot;&quot;</span>
124
+ <span class="n">reset_url</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">BASE_URL</span><span class="si">}</span><span class="s2">/reset-password?token=</span><span class="si">{</span><span class="n">reset_token</span><span class="si">}</span><span class="s2">&quot;</span>
125
+
126
+ <span class="n">email_html</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;&quot;&quot;</span>
127
+ <span class="s2"> &lt;html&gt;</span>
128
+ <span class="s2"> &lt;body&gt;</span>
129
+ <span class="s2"> &lt;h1&gt;Password Reset Request&lt;/h1&gt;</span>
130
+ <span class="s2"> &lt;p&gt;Hello </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2">,&lt;/p&gt;</span>
131
+ <span class="s2"> &lt;p&gt;You have requested to reset your password for your MindRoot account.&lt;/p&gt;</span>
132
+ <span class="s2"> &lt;p&gt;Click the link below to reset your password:&lt;/p&gt;</span>
133
+ <span class="s2"> &lt;p&gt;&lt;a href=&quot;</span><span class="si">{</span><span class="n">reset_url</span><span class="si">}</span><span class="s2">&quot; style=&quot;background-color: #f44336; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px;&quot;&gt;Reset Password&lt;/a&gt;&lt;/p&gt;</span>
134
+ <span class="s2"> &lt;p&gt;Or copy and paste this link into your browser:&lt;/p&gt;</span>
135
+ <span class="s2"> &lt;p&gt;&lt;code&gt;</span><span class="si">{</span><span class="n">reset_url</span><span class="si">}</span><span class="s2">&lt;/code&gt;&lt;/p&gt;</span>
136
+ <span class="s2"> &lt;p&gt;This link will expire in 1 hour.&lt;/p&gt;</span>
137
+ <span class="s2"> &lt;br&gt;</span>
138
+ <span class="s2"> &lt;p&gt;&lt;small&gt;If you did not request this password reset, please ignore this email.&lt;/small&gt;&lt;/p&gt;</span>
139
+ <span class="s2"> &lt;/body&gt;</span>
140
+ <span class="s2"> &lt;/html&gt;</span>
141
+ <span class="s2"> &quot;&quot;&quot;</span>
142
+
143
+ <span class="k">try</span><span class="p">:</span>
144
+ <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">send_email</span><span class="p">(</span>
145
+ <span class="n">to</span><span class="o">=</span><span class="n">email</span><span class="p">,</span>
146
+ <span class="n">subject</span><span class="o">=</span><span class="s2">&quot;Password Reset Request - MindRoot&quot;</span><span class="p">,</span>
147
+ <span class="n">body</span><span class="o">=</span><span class="n">email_html</span> <span class="c1"># HTML content will be auto-detected</span>
148
+ <span class="p">)</span>
149
+
150
+ <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;success&#39;</span><span class="p">):</span>
151
+ <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Password reset email sent successfully to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
152
+ <span class="k">return</span> <span class="kc">True</span>
153
+ <span class="k">else</span><span class="p">:</span>
154
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to send password reset email to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;error&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
155
+ <span class="k">return</span> <span class="kc">False</span>
156
+
157
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
158
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Exception sending password reset email to </span><span class="si">{</span><span class="n">email</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
159
+ <span class="k">return</span> <span class="kc">False</span></div>
160
+
161
+
162
+ <div class="viewcode-block" id="setup_verification">
163
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.user_service.html#mindroot.coreplugins.user_service.email_service.setup_verification">[docs]</a>
164
+ <span class="k">def</span><span class="w"> </span><span class="nf">setup_verification</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">bool</span><span class="p">]:</span>
165
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Setup email verification token and expiry.</span>
166
+ <span class="sd"> Returns: (token, expiry timestamp, verified status)</span>
167
+ <span class="sd"> &quot;&quot;&quot;</span>
168
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">REQUIRE_EMAIL_VERIFY</span><span class="p">:</span>
169
+ <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">True</span>
170
+
171
+ <span class="n">verification_token</span> <span class="o">=</span> <span class="n">secrets</span><span class="o">.</span><span class="n">token_urlsafe</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span>
172
+ <span class="n">verification_expires</span> <span class="o">=</span> <span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">24</span><span class="p">))</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
173
+ <span class="k">return</span> <span class="n">verification_token</span><span class="p">,</span> <span class="n">verification_expires</span><span class="p">,</span> <span class="kc">False</span></div>
174
+
175
+ </pre></div>
176
+
177
+ </div>
178
+ </div>
179
+ <footer>
180
+
181
+ <hr/>
182
+
183
+ <div role="contentinfo">
184
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
185
+ </div>
186
+
187
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
188
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
189
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
190
+
191
+
192
+ </footer>
193
+ </div>
194
+ </div>
195
+ </section>
196
+ </div>
197
+ <script>
198
+ jQuery(function () {
199
+ SphinxRtdTheme.Navigation.enable(true);
200
+ });
201
+ </script>
202
+
203
+ </body>
204
+ </html>