mindroot 9.10.0__py3-none-any.whl → 9.12.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 (418) hide show
  1. mindroot/__init__.py +1 -0
  2. mindroot/coreplugins/__init__.py +2 -0
  3. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  4. mindroot/docs/Makefile +20 -0
  5. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  6. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  7. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  8. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  9. mindroot/docs/_build/doctrees/index.doctree +0 -0
  10. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  11. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  13. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  14. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  44. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  45. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  46. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  47. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  48. mindroot/docs/_build/html/.buildinfo +4 -0
  49. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  50. mindroot/docs/_build/html/_images/envvar.png +0 -0
  51. mindroot/docs/_build/html/_images/files.png +0 -0
  52. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  53. mindroot/docs/_build/html/_images/mood.png +0 -0
  54. mindroot/docs/_build/html/_images/moon.png +0 -0
  55. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  56. mindroot/docs/_build/html/_images/restart.png +0 -0
  57. mindroot/docs/_build/html/_modules/index.html +425 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  152. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  153. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  182. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  183. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  184. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  185. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  186. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  188. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  189. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  190. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  191. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  192. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  193. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  194. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  195. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  196. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  197. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  198. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  199. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  226. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  227. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  228. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  229. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  230. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  231. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  232. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  233. mindroot/docs/_build/html/_static/basic.css +906 -0
  234. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  251. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  252. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  253. mindroot/docs/_build/html/_static/custom.css +19 -0
  254. mindroot/docs/_build/html/_static/debug.css +69 -0
  255. mindroot/docs/_build/html/_static/doctools.js +149 -0
  256. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  257. mindroot/docs/_build/html/_static/file.png +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  272. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  273. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  280. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  281. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  282. mindroot/docs/_build/html/_static/jquery.js +2 -0
  283. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  284. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  285. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  286. mindroot/docs/_build/html/_static/language_data.js +192 -0
  287. mindroot/docs/_build/html/_static/minus.png +0 -0
  288. mindroot/docs/_build/html/_static/plus.png +0 -0
  289. mindroot/docs/_build/html/_static/pygments.css +232 -0
  290. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  292. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  293. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  294. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  295. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  296. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  297. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  299. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  300. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  301. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  302. mindroot/docs/_build/html/developer_documentation.html +338 -0
  303. mindroot/docs/_build/html/genindex.html +4690 -0
  304. mindroot/docs/_build/html/getting_started.html +423 -0
  305. mindroot/docs/_build/html/index.html +357 -0
  306. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  307. mindroot/docs/_build/html/installation.html +330 -0
  308. mindroot/docs/_build/html/llm_api_key.html +337 -0
  309. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  310. mindroot/docs/_build/html/objects.inv +0 -0
  311. mindroot/docs/_build/html/programming_task.html +326 -0
  312. mindroot/docs/_build/html/py-modindex.html +1307 -0
  313. mindroot/docs/_build/html/search.html +307 -0
  314. mindroot/docs/_build/html/searchindex.js +1 -0
  315. mindroot/docs/_build/html/source/ahp.html +302 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  334. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  335. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  336. mindroot/docs/_build/html/source/mindroot.html +811 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  341. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  342. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  343. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  344. mindroot/docs/_build/html/source/modules.html +377 -0
  345. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  346. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  347. mindroot/docs/_build/html/user_documentation.html +333 -0
  348. mindroot/docs/_static/custom.css +19 -0
  349. mindroot/docs/chat_with_assistant.rst +14 -0
  350. mindroot/docs/conf.py +54 -0
  351. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  352. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  353. mindroot/docs/data/equivalent_flags.json +1 -0
  354. mindroot/docs/data/mcp/servers.json +9 -0
  355. mindroot/docs/data/models.json +57 -0
  356. mindroot/docs/data/plugin_manifest.json +95 -0
  357. mindroot/docs/data/preferred_models.json +12 -0
  358. mindroot/docs/data/providers.json +62 -0
  359. mindroot/docs/developer_documentation.rst +26 -0
  360. mindroot/docs/envvar.png +0 -0
  361. mindroot/docs/files.png +0 -0
  362. mindroot/docs/getting_started.rst +139 -0
  363. mindroot/docs/index.rst +38 -0
  364. mindroot/docs/install_plugins_with_tools.rst +25 -0
  365. mindroot/docs/installation.rst +21 -0
  366. mindroot/docs/installopenrouter.png +0 -0
  367. mindroot/docs/llm_api_key.rst +22 -0
  368. mindroot/docs/llm_plugin_installation.rst +27 -0
  369. mindroot/docs/make.bat +35 -0
  370. mindroot/docs/mood.png +0 -0
  371. mindroot/docs/moon.png +0 -0
  372. mindroot/docs/openrouter.png +0 -0
  373. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  374. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  375. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  376. mindroot/docs/programming_task.rst +10 -0
  377. mindroot/docs/restart.png +0 -0
  378. mindroot/docs/source/ahp.rst +7 -0
  379. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  380. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  381. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  382. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  383. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  384. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  385. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  386. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  387. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  388. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  390. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  391. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  392. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  393. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  394. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  395. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  396. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  397. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  398. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  399. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  400. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  401. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  402. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  403. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  404. mindroot/docs/source/mindroot.lib.rst +152 -0
  405. mindroot/docs/source/mindroot.registry.rst +29 -0
  406. mindroot/docs/source/mindroot.rst +54 -0
  407. mindroot/docs/source/modules.rst +7 -0
  408. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  409. mindroot/docs/starting_mindroot.rst +12 -0
  410. mindroot/docs/user_documentation.rst +16 -0
  411. mindroot/lib/plugins/default_plugin_manifest.json +1 -1
  412. mindroot/server.py +10 -1
  413. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  414. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +418 -10
  415. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  416. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  417. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  418. {mindroot-9.10.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,428 @@
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.persona_router &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.admin.persona_router</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.admin.persona_router</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">APIRouter</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">,</span> <span class="n">UploadFile</span><span class="p">,</span> <span class="n">File</span><span class="p">,</span> <span class="n">Form</span>
70
+ <span class="kn">from</span><span class="w"> </span><span class="nn">fastapi.responses</span><span class="w"> </span><span class="kn">import</span> <span class="n">Response</span>
71
+ <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>
72
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
73
+ <span class="kn">import</span><span class="w"> </span><span class="nn">shutil</span>
74
+ <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
75
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.asset_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">asset_manager</span>
76
+
77
+ <span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">()</span>
78
+
79
+ <span class="n">BASE_DIR</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="s1">&#39;personas&#39;</span><span class="p">)</span>
80
+ <span class="n">local_dir</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s2">&quot;local&quot;</span>
81
+ <span class="n">shared_dir</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s2">&quot;shared&quot;</span>
82
+ <span class="n">local_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
83
+ <span class="n">shared_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
84
+
85
+ <span class="c1"># Registry directory for namespaced personas</span>
86
+ <span class="n">registry_dir</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s2">&quot;registry&quot;</span>
87
+ <span class="n">registry_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
88
+
89
+ <div class="viewcode-block" id="read_persona">
90
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.read_persona">[docs]</a>
91
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;/personas/</span><span class="si">{scope}</span><span class="s1">/</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">)</span>
92
+ <span class="k">def</span><span class="w"> </span><span class="nf">read_persona</span><span class="p">(</span><span class="n">scope</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
93
+ <span class="k">if</span> <span class="n">scope</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="s1">&#39;shared&#39;</span><span class="p">,</span> <span class="s1">&#39;registry&#39;</span><span class="p">]:</span>
94
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Invalid scope&#39;</span><span class="p">)</span>
95
+ <span class="n">persona_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="n">scope</span> <span class="o">/</span> <span class="n">name</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
96
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
97
+ <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="s1">&#39;Persona not found&#39;</span><span class="p">)</span>
98
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
99
+ <span class="n">persona</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>
100
+ <span class="k">if</span> <span class="s1">&#39;moderated&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">persona</span><span class="p">:</span>
101
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;moderated&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
102
+ <span class="k">return</span> <span class="n">persona</span></div>
103
+
104
+
105
+
106
+ <div class="viewcode-block" id="list_personas">
107
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.list_personas">[docs]</a>
108
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;/personas/</span><span class="si">{scope}</span><span class="s1">&#39;</span><span class="p">)</span>
109
+ <span class="k">def</span><span class="w"> </span><span class="nf">list_personas</span><span class="p">(</span><span class="n">scope</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
110
+ <span class="k">if</span> <span class="n">scope</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="s1">&#39;shared&#39;</span><span class="p">,</span> <span class="s1">&#39;registry&#39;</span><span class="p">]:</span>
111
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Invalid scope&#39;</span><span class="p">)</span>
112
+ <span class="n">scope_dir</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="n">scope</span>
113
+ <span class="n">personas</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">scope_dir</span><span class="o">.</span><span class="n">iterdir</span><span class="p">()</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">is_dir</span><span class="p">()]</span>
114
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Read personas from dir </span><span class="si">{</span><span class="n">scope_dir</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">personas</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
115
+ <span class="k">return</span> <span class="p">[{</span><span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">}</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">personas</span><span class="p">]</span></div>
116
+
117
+
118
+ <div class="viewcode-block" id="read_persona_by_path">
119
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.read_persona_by_path">[docs]</a>
120
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;/personas/{persona_path:path}&#39;</span><span class="p">)</span>
121
+ <span class="k">def</span><span class="w"> </span><span class="nf">read_persona_by_path</span><span class="p">(</span><span class="n">persona_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
122
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Read persona by full path (supports registry/owner/name format)&quot;&quot;&quot;</span>
123
+ <span class="k">try</span><span class="p">:</span>
124
+ <span class="c1"># Handle registry personas: registry/owner/name</span>
125
+ <span class="k">if</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;registry/&#39;</span><span class="p">):</span>
126
+ <span class="n">full_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="n">persona_path</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
127
+ <span class="k">else</span><span class="p">:</span>
128
+ <span class="c1"># Handle simple names: check local first, then shared</span>
129
+ <span class="n">full_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s1">&#39;local&#39;</span> <span class="o">/</span> <span class="n">persona_path</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
130
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">full_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
131
+ <span class="n">full_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s1">&#39;shared&#39;</span> <span class="o">/</span> <span class="n">persona_path</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
132
+
133
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">full_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
134
+ <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="s1">&#39;Persona not found&#39;</span><span class="p">)</span>
135
+
136
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">full_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
137
+ <span class="k">return</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>
138
+
139
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
140
+ <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="s1">&#39;Persona not found: </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="s1">&#39;</span><span class="p">)</span></div>
141
+
142
+
143
+ <div class="viewcode-block" id="create_registry_persona">
144
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.create_registry_persona">[docs]</a>
145
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">&#39;/personas/registry&#39;</span><span class="p">)</span>
146
+ <span class="k">def</span><span class="w"> </span><span class="nf">create_registry_persona</span><span class="p">(</span><span class="n">persona</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">owner</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">)):</span>
147
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a registry persona with owner namespace&quot;&quot;&quot;</span>
148
+ <span class="k">try</span><span class="p">:</span>
149
+ <span class="n">persona_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">persona</span><span class="p">)</span>
150
+ <span class="n">persona_name</span> <span class="o">=</span> <span class="n">persona_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
151
+
152
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">persona_name</span><span class="p">:</span>
153
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Persona name is required&#39;</span><span class="p">)</span>
154
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">owner</span><span class="p">:</span>
155
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Owner is required for registry personas&#39;</span><span class="p">)</span>
156
+
157
+ <span class="c1"># Create registry persona path: personas/registry/owner/name/</span>
158
+ <span class="n">persona_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s1">&#39;registry&#39;</span> <span class="o">/</span> <span class="n">owner</span> <span class="o">/</span> <span class="n">persona_name</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
159
+
160
+ <span class="k">if</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
161
+ <span class="c1"># Update existing persona instead of failing</span>
162
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Updating existing registry persona: </span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">persona_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
163
+
164
+ <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
165
+
166
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
167
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">persona_data</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
168
+
169
+ <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">,</span> <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;registry/</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">persona_name</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">}</span>
170
+
171
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
172
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error creating registry persona: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
173
+ <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="sa">f</span><span class="s1">&#39;Internal server 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="s1">&#39;</span><span class="p">)</span></div>
174
+
175
+
176
+ <div class="viewcode-block" id="create_registry_persona_with_assets">
177
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.create_registry_persona_with_assets">[docs]</a>
178
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">&#39;/personas/registry/with-assets&#39;</span><span class="p">)</span>
179
+ <span class="k">def</span><span class="w"> </span><span class="nf">create_registry_persona_with_assets</span><span class="p">(</span><span class="n">persona</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">owner</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span>
180
+ <span class="n">faceref</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">),</span> <span class="n">avatar</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">)):</span>
181
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a registry persona with deduplicated asset storage&quot;&quot;&quot;</span>
182
+ <span class="k">try</span><span class="p">:</span>
183
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Received persona data (first 200 chars): </span><span class="si">{</span><span class="n">persona</span><span class="p">[:</span><span class="mi">200</span><span class="p">]</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
184
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Received owner: </span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
185
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Received faceref: </span><span class="si">{</span><span class="n">faceref</span><span class="o">.</span><span class="n">filename</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">faceref</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;None&#39;</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
186
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Received avatar: </span><span class="si">{</span><span class="n">avatar</span><span class="o">.</span><span class="n">filename</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">avatar</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;None&#39;</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
187
+
188
+ <span class="n">persona_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">persona</span><span class="p">)</span>
189
+ <span class="n">persona_name</span> <span class="o">=</span> <span class="n">persona_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
190
+
191
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">persona_name</span><span class="p">:</span>
192
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Persona name is required&#39;</span><span class="p">)</span>
193
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">owner</span><span class="p">:</span>
194
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Owner is required for registry personas&#39;</span><span class="p">)</span>
195
+
196
+ <span class="c1"># Store assets with deduplication</span>
197
+ <span class="n">asset_hashes</span> <span class="o">=</span> <span class="p">{}</span>
198
+
199
+ <span class="k">if</span> <span class="n">faceref</span><span class="p">:</span>
200
+ <span class="n">content</span> <span class="o">=</span> <span class="n">faceref</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
201
+ <span class="n">file_hash</span><span class="p">,</span> <span class="n">was_new</span> <span class="o">=</span> <span class="n">asset_manager</span><span class="o">.</span><span class="n">store_content</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">faceref</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;faceref&quot;</span><span class="p">)</span>
202
+ <span class="n">asset_hashes</span><span class="p">[</span><span class="s1">&#39;faceref&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_hash</span>
203
+
204
+ <span class="k">if</span> <span class="n">avatar</span><span class="p">:</span>
205
+ <span class="n">content</span> <span class="o">=</span> <span class="n">avatar</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
206
+ <span class="n">file_hash</span><span class="p">,</span> <span class="n">was_new</span> <span class="o">=</span> <span class="n">asset_manager</span><span class="o">.</span><span class="n">store_content</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">avatar</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;avatar&quot;</span><span class="p">)</span>
207
+ <span class="n">asset_hashes</span><span class="p">[</span><span class="s1">&#39;avatar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_hash</span>
208
+
209
+ <span class="c1"># Add asset references to persona data</span>
210
+ <span class="n">persona_data</span><span class="p">[</span><span class="s1">&#39;asset_hashes&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">asset_hashes</span>
211
+
212
+ <span class="c1"># For registry personas, update the name to include the owner namespace</span>
213
+ <span class="c1"># This ensures the chat UI can find the images at the correct path</span>
214
+ <span class="k">if</span> <span class="s1">&#39;name&#39;</span> <span class="ow">in</span> <span class="n">persona_data</span><span class="p">:</span>
215
+ <span class="n">persona_data</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">persona_name</span><span class="si">}</span><span class="s2">&quot;</span>
216
+
217
+ <span class="c1"># Create registry persona path first</span>
218
+ <span class="n">persona_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s1">&#39;registry&#39;</span> <span class="o">/</span> <span class="n">owner</span> <span class="o">/</span> <span class="n">persona_name</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
219
+ <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
220
+
221
+ <span class="c1"># ALSO copy assets to traditional locations for compatibility</span>
222
+ <span class="k">if</span> <span class="n">faceref</span><span class="p">:</span>
223
+ <span class="n">faceref_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;faceref.png&#39;</span>
224
+ <span class="n">faceref_path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
225
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">faceref_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
226
+ <span class="n">faceref</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># Reset file pointer</span>
227
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">faceref</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
228
+
229
+ <span class="k">if</span> <span class="n">avatar</span><span class="p">:</span>
230
+ <span class="n">avatar_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;avatar.png&#39;</span>
231
+ <span class="n">avatar_path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
232
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">avatar_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
233
+ <span class="n">avatar</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># Reset file pointer</span>
234
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">avatar</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
235
+
236
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
237
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">persona_data</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
238
+
239
+ <span class="k">return</span> <span class="p">{</span>
240
+ <span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">,</span>
241
+ <span class="s1">&#39;path&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;registry/</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">persona_name</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
242
+ <span class="s1">&#39;asset_hashes&#39;</span><span class="p">:</span> <span class="n">asset_hashes</span>
243
+ <span class="p">}</span>
244
+
245
+ <span class="k">except</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
246
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;JSON decode error: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
247
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid JSON received: </span><span class="si">{</span><span class="n">persona</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
248
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;Invalid JSON in persona data: </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="s1">&#39;</span><span class="p">)</span>
249
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
250
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error creating registry persona with assets: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
251
+ <span class="kn">import</span><span class="w"> </span><span class="nn">traceback</span>
252
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
253
+ <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="sa">f</span><span class="s1">&#39;Internal server 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="s1">&#39;</span><span class="p">)</span></div>
254
+
255
+
256
+ <div class="viewcode-block" id="serve_asset">
257
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.serve_asset">[docs]</a>
258
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;/assets/</span><span class="si">{asset_hash}</span><span class="s1">&#39;</span><span class="p">)</span>
259
+ <span class="k">def</span><span class="w"> </span><span class="nf">serve_asset</span><span class="p">(</span><span class="n">asset_hash</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
260
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Serve a deduplicated asset by hash&quot;&quot;&quot;</span>
261
+ <span class="k">try</span><span class="p">:</span>
262
+ <span class="n">asset_path</span> <span class="o">=</span> <span class="n">asset_manager</span><span class="o">.</span><span class="n">get_asset_path</span><span class="p">(</span><span class="n">asset_hash</span><span class="p">)</span>
263
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">asset_path</span><span class="p">:</span>
264
+ <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="s1">&#39;Asset not found&#39;</span><span class="p">)</span>
265
+
266
+ <span class="n">metadata</span> <span class="o">=</span> <span class="n">asset_manager</span><span class="o">.</span><span class="n">get_asset_metadata</span><span class="p">(</span><span class="n">asset_hash</span><span class="p">)</span>
267
+
268
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">asset_path</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
269
+ <span class="n">content</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
270
+
271
+ <span class="c1"># Determine content type based on metadata</span>
272
+ <span class="n">content_type</span> <span class="o">=</span> <span class="s2">&quot;image/png&quot;</span> <span class="k">if</span> <span class="n">metadata</span> <span class="ow">and</span> <span class="n">metadata</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">)</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;avatar&#39;</span><span class="p">,</span> <span class="s1">&#39;faceref&#39;</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;application/octet-stream&quot;</span>
273
+
274
+ <span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">,</span> <span class="n">media_type</span><span class="o">=</span><span class="n">content_type</span><span class="p">)</span>
275
+
276
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
277
+ <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="s1">&#39;Asset not found: </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="s1">&#39;</span><span class="p">)</span></div>
278
+
279
+
280
+ <div class="viewcode-block" id="create_persona">
281
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.create_persona">[docs]</a>
282
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">&#39;/personas/</span><span class="si">{scope}</span><span class="s1">&#39;</span><span class="p">)</span>
283
+ <span class="k">def</span><span class="w"> </span><span class="nf">create_persona</span><span class="p">(</span><span class="n">scope</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">persona</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">faceref</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">),</span> <span class="n">avatar</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">)):</span>
284
+ <span class="k">try</span><span class="p">:</span>
285
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;In create_persona&quot;</span><span class="p">)</span>
286
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;scope is &quot;</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span>
287
+ <span class="n">persona</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">persona</span><span class="p">)</span>
288
+
289
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;persona is &quot;</span><span class="p">,</span> <span class="n">persona</span><span class="p">)</span>
290
+
291
+ <span class="k">if</span> <span class="n">scope</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="s1">&#39;shared&#39;</span><span class="p">]:</span>
292
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Invalid scope&#39;</span><span class="p">)</span>
293
+ <span class="n">persona_name</span> <span class="o">=</span> <span class="n">persona</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
294
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">persona_name</span><span class="p">:</span>
295
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Persona name is required&#39;</span><span class="p">)</span>
296
+ <span class="n">persona_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="n">scope</span> <span class="o">/</span> <span class="n">persona_name</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
297
+ <span class="k">if</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
298
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Persona already exists&#39;</span><span class="p">)</span>
299
+ <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
300
+
301
+ <span class="n">target_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;static/personas&#39;</span> <span class="o">/</span> <span class="n">persona_name</span>
302
+
303
+ <span class="n">target_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
304
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[93m&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">target_dir</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[0m&#39;</span><span class="p">)</span>
305
+ <span class="k">if</span> <span class="n">faceref</span><span class="p">:</span>
306
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to save faceref&quot;</span><span class="p">)</span>
307
+ <span class="n">faceref_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;faceref.png&#39;</span>
308
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;faceref path is &quot;</span><span class="p">,</span> <span class="n">faceref_path</span><span class="p">)</span>
309
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">faceref_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
310
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;opened file for writing&quot;</span><span class="p">)</span>
311
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">faceref</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
312
+ <span class="c1"># Copy faceref to new location</span>
313
+ <span class="n">new_faceref_path</span> <span class="o">=</span> <span class="n">target_dir</span> <span class="o">/</span> <span class="s1">&#39;faceref.png&#39;</span>
314
+ <span class="n">shutil</span><span class="o">.</span><span class="n">copy2</span><span class="p">(</span><span class="n">faceref_path</span><span class="p">,</span> <span class="n">new_faceref_path</span><span class="p">)</span>
315
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;faceref&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">new_faceref_path</span><span class="p">)</span>
316
+
317
+ <span class="k">if</span> <span class="n">avatar</span><span class="p">:</span>
318
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to save avatar&quot;</span><span class="p">)</span>
319
+ <span class="n">avatar_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;avatar.png&#39;</span>
320
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">avatar_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
321
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;opened file for writing&quot;</span><span class="p">)</span>
322
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">avatar</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
323
+ <span class="c1"># Copy avatar to new location</span>
324
+ <span class="n">new_avatar_path</span> <span class="o">=</span> <span class="n">target_dir</span> <span class="o">/</span> <span class="s1">&#39;avatar.png&#39;</span>
325
+ <span class="n">shutil</span><span class="o">.</span><span class="n">copy2</span><span class="p">(</span><span class="n">avatar_path</span><span class="p">,</span> <span class="n">new_avatar_path</span><span class="p">)</span>
326
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;avatar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">new_avatar_path</span><span class="p">)</span>
327
+
328
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
329
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">persona</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
330
+ <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">}</span>
331
+
332
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
333
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error in create_persona&quot;</span><span class="p">)</span>
334
+ <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="s1">&#39;Internal server error &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
335
+
336
+
337
+ <div class="viewcode-block" id="update_persona">
338
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.admin.html#mindroot.coreplugins.admin.persona_router.update_persona">[docs]</a>
339
+ <span class="nd">@router</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s1">&#39;/personas/</span><span class="si">{scope}</span><span class="s1">/</span><span class="si">{name}</span><span class="s1">&#39;</span><span class="p">)</span>
340
+ <span class="k">def</span><span class="w"> </span><span class="nf">update_persona</span><span class="p">(</span><span class="n">scope</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span><span class="nb">str</span><span class="p">,</span> <span class="n">persona</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Form</span><span class="p">(</span><span class="o">...</span><span class="p">),</span> <span class="n">faceref</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">),</span> <span class="n">avatar</span><span class="p">:</span> <span class="n">UploadFile</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="kc">None</span><span class="p">)):</span>
341
+
342
+ <span class="k">try</span><span class="p">:</span>
343
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;In update_persona&quot;</span><span class="p">)</span>
344
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;scope is &quot;</span><span class="p">,</span> <span class="n">scope</span><span class="p">)</span>
345
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;name is &quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
346
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;BASE_DIR is &quot;</span><span class="p">,</span> <span class="n">BASE_DIR</span><span class="p">)</span>
347
+ <span class="n">persona</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">persona</span><span class="p">)</span>
348
+ <span class="n">persona_name</span> <span class="o">=</span> <span class="n">persona</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">)</span>
349
+
350
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;persona is &quot;</span><span class="p">,</span> <span class="n">persona</span><span class="p">)</span>
351
+
352
+ <span class="k">if</span> <span class="n">scope</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;local&#39;</span><span class="p">,</span> <span class="s1">&#39;shared&#39;</span><span class="p">]:</span>
353
+ <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">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s1">&#39;Invalid scope&#39;</span><span class="p">)</span>
354
+ <span class="n">persona_path</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="n">scope</span> <span class="o">/</span> <span class="n">name</span> <span class="o">/</span> <span class="s1">&#39;persona.json&#39;</span>
355
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
356
+ <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="s1">&#39;Persona not found&#39;</span><span class="p">)</span>
357
+ <span class="k">if</span> <span class="s1">&#39;moderated&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">persona</span><span class="p">:</span>
358
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;moderated&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
359
+
360
+ <span class="n">target_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;static/personas&#39;</span> <span class="o">/</span> <span class="n">persona_name</span>
361
+
362
+ <span class="n">target_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
363
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[93m&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">BASE_DIR</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[0m&#39;</span><span class="p">)</span>
364
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[93m&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">target_dir</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[0m&#39;</span><span class="p">)</span>
365
+
366
+ <span class="k">if</span> <span class="n">faceref</span><span class="p">:</span>
367
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to save faceref&quot;</span><span class="p">)</span>
368
+ <span class="n">faceref_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;faceref.png&#39;</span>
369
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;faceref path is &quot;</span><span class="p">,</span> <span class="n">faceref_path</span><span class="p">)</span>
370
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">faceref_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
371
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;opened file for writing&quot;</span><span class="p">)</span>
372
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">faceref</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
373
+ <span class="c1"># Copy faceref to new location</span>
374
+ <span class="n">new_faceref_path</span> <span class="o">=</span> <span class="n">target_dir</span> <span class="o">/</span> <span class="s1">&#39;faceref.png&#39;</span>
375
+ <span class="n">shutil</span><span class="o">.</span><span class="n">copy2</span><span class="p">(</span><span class="n">faceref_path</span><span class="p">,</span> <span class="n">new_faceref_path</span><span class="p">)</span>
376
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;faceref&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">new_faceref_path</span><span class="p">)</span>
377
+
378
+ <span class="k">if</span> <span class="n">avatar</span><span class="p">:</span>
379
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to save avatar&quot;</span><span class="p">)</span>
380
+ <span class="n">avatar_path</span> <span class="o">=</span> <span class="n">persona_path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s1">&#39;avatar.png&#39;</span>
381
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">avatar_path</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
382
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;opened file for writing&quot;</span><span class="p">)</span>
383
+ <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">avatar</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
384
+ <span class="c1"># Copy avatar to new location</span>
385
+ <span class="n">new_avatar_path</span> <span class="o">=</span> <span class="n">target_dir</span> <span class="o">/</span> <span class="s1">&#39;avatar.png&#39;</span>
386
+ <span class="n">shutil</span><span class="o">.</span><span class="n">copy2</span><span class="p">(</span><span class="n">avatar_path</span><span class="p">,</span> <span class="n">new_avatar_path</span><span class="p">)</span>
387
+ <span class="n">persona</span><span class="p">[</span><span class="s1">&#39;avatar&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">new_avatar_path</span><span class="p">)</span>
388
+
389
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_path</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
390
+ <span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">persona</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
391
+ <span class="k">return</span> <span class="p">{</span><span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="s1">&#39;success&#39;</span><span class="p">}</span>
392
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
393
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error in update_persona&quot;</span><span class="p">)</span>
394
+ <span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
395
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
396
+ <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="s1">&#39;Internal server error &#39;</span><span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
397
+
398
+
399
+ </pre></div>
400
+
401
+ </div>
402
+ </div>
403
+ <footer>
404
+
405
+ <hr/>
406
+
407
+ <div role="contentinfo">
408
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
409
+ </div>
410
+
411
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
412
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
413
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
414
+
415
+
416
+ </footer>
417
+ </div>
418
+ </div>
419
+ </section>
420
+ </div>
421
+ <script>
422
+ jQuery(function () {
423
+ SphinxRtdTheme.Navigation.enable(true);
424
+ });
425
+ </script>
426
+
427
+ </body>
428
+ </html>