mindroot 9.11.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 (415) hide show
  1. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  2. mindroot/docs/Makefile +20 -0
  3. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  4. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  5. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  6. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  7. mindroot/docs/_build/doctrees/index.doctree +0 -0
  8. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  9. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  10. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  13. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  44. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  45. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  46. mindroot/docs/_build/html/.buildinfo +4 -0
  47. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  48. mindroot/docs/_build/html/_images/envvar.png +0 -0
  49. mindroot/docs/_build/html/_images/files.png +0 -0
  50. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  51. mindroot/docs/_build/html/_images/mood.png +0 -0
  52. mindroot/docs/_build/html/_images/moon.png +0 -0
  53. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  54. mindroot/docs/_build/html/_images/restart.png +0 -0
  55. mindroot/docs/_build/html/_modules/index.html +425 -0
  56. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  57. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  152. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  153. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  182. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  183. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  184. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  185. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  186. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  188. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  189. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  190. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  191. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  192. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  193. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  194. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  195. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  196. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  197. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  198. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  199. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  226. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  227. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  228. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  229. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  230. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  231. mindroot/docs/_build/html/_static/basic.css +906 -0
  232. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  233. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  234. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  251. mindroot/docs/_build/html/_static/custom.css +19 -0
  252. mindroot/docs/_build/html/_static/debug.css +69 -0
  253. mindroot/docs/_build/html/_static/doctools.js +149 -0
  254. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  255. mindroot/docs/_build/html/_static/file.png +0 -0
  256. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  257. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  272. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  273. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  280. mindroot/docs/_build/html/_static/jquery.js +2 -0
  281. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  282. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  283. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  284. mindroot/docs/_build/html/_static/language_data.js +192 -0
  285. mindroot/docs/_build/html/_static/minus.png +0 -0
  286. mindroot/docs/_build/html/_static/plus.png +0 -0
  287. mindroot/docs/_build/html/_static/pygments.css +232 -0
  288. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  289. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  290. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  292. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  293. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  294. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  295. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  296. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  297. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  299. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  300. mindroot/docs/_build/html/developer_documentation.html +338 -0
  301. mindroot/docs/_build/html/genindex.html +4690 -0
  302. mindroot/docs/_build/html/getting_started.html +423 -0
  303. mindroot/docs/_build/html/index.html +357 -0
  304. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  305. mindroot/docs/_build/html/installation.html +330 -0
  306. mindroot/docs/_build/html/llm_api_key.html +337 -0
  307. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  308. mindroot/docs/_build/html/objects.inv +0 -0
  309. mindroot/docs/_build/html/programming_task.html +326 -0
  310. mindroot/docs/_build/html/py-modindex.html +1307 -0
  311. mindroot/docs/_build/html/search.html +307 -0
  312. mindroot/docs/_build/html/searchindex.js +1 -0
  313. mindroot/docs/_build/html/source/ahp.html +302 -0
  314. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  315. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  334. mindroot/docs/_build/html/source/mindroot.html +811 -0
  335. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  336. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  341. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  342. mindroot/docs/_build/html/source/modules.html +377 -0
  343. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  344. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  345. mindroot/docs/_build/html/user_documentation.html +333 -0
  346. mindroot/docs/_static/custom.css +19 -0
  347. mindroot/docs/chat_with_assistant.rst +14 -0
  348. mindroot/docs/conf.py +54 -0
  349. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  350. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  351. mindroot/docs/data/equivalent_flags.json +1 -0
  352. mindroot/docs/data/mcp/servers.json +9 -0
  353. mindroot/docs/data/models.json +57 -0
  354. mindroot/docs/data/plugin_manifest.json +95 -0
  355. mindroot/docs/data/preferred_models.json +12 -0
  356. mindroot/docs/data/providers.json +62 -0
  357. mindroot/docs/developer_documentation.rst +26 -0
  358. mindroot/docs/envvar.png +0 -0
  359. mindroot/docs/files.png +0 -0
  360. mindroot/docs/getting_started.rst +139 -0
  361. mindroot/docs/index.rst +38 -0
  362. mindroot/docs/install_plugins_with_tools.rst +25 -0
  363. mindroot/docs/installation.rst +21 -0
  364. mindroot/docs/installopenrouter.png +0 -0
  365. mindroot/docs/llm_api_key.rst +22 -0
  366. mindroot/docs/llm_plugin_installation.rst +27 -0
  367. mindroot/docs/make.bat +35 -0
  368. mindroot/docs/mood.png +0 -0
  369. mindroot/docs/moon.png +0 -0
  370. mindroot/docs/openrouter.png +0 -0
  371. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  372. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  373. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  374. mindroot/docs/programming_task.rst +10 -0
  375. mindroot/docs/restart.png +0 -0
  376. mindroot/docs/source/ahp.rst +7 -0
  377. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  378. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  379. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  380. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  381. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  382. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  383. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  384. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  385. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  386. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  387. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  388. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  390. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  391. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  392. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  393. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  394. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  395. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  396. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  397. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  398. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  399. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  400. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  401. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  402. mindroot/docs/source/mindroot.lib.rst +152 -0
  403. mindroot/docs/source/mindroot.registry.rst +29 -0
  404. mindroot/docs/source/mindroot.rst +54 -0
  405. mindroot/docs/source/modules.rst +7 -0
  406. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  407. mindroot/docs/starting_mindroot.rst +12 -0
  408. mindroot/docs/user_documentation.rst +16 -0
  409. mindroot/server.py +10 -1
  410. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  411. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +415 -8
  412. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  413. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  414. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  415. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,348 @@
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.l8n.utils &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.l8n.utils</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.l8n.utils</h1><div class="highlight"><pre>
69
+ <span></span><span class="c1"># need to import Path</span>
70
+ <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>
71
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.l8n_constants</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</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">re</span>
74
+ <span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
75
+
76
+ <span class="c1"># Set up logging for l8n warnings</span>
77
+ <span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;l8n&#39;</span><span class="p">)</span>
78
+ <span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">WARNING</span><span class="p">)</span>
79
+
80
+ <span class="c1"># Create console handler with formatting</span>
81
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">logger</span><span class="o">.</span><span class="n">handlers</span><span class="p">:</span>
82
+ <span class="n">console_handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
83
+ <span class="n">console_handler</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">WARNING</span><span class="p">)</span>
84
+ <span class="n">formatter</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\033</span><span class="s1">[91m[L8N WARNING]</span><span class="se">\033</span><span class="s1">[0m </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
85
+ <span class="n">console_handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">formatter</span><span class="p">)</span>
86
+ <span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">console_handler</span><span class="p">)</span>
87
+
88
+ <div class="viewcode-block" id="extract_plugin_root">
89
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.extract_plugin_root">[docs]</a>
90
+ <span class="k">def</span><span class="w"> </span><span class="nf">extract_plugin_root</span><span class="p">(</span><span class="n">absolute_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
91
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
92
+ <span class="sd"> Extract the plugin root from an absolute path.</span>
93
+ <span class="sd"> </span>
94
+ <span class="sd"> For core plugins: everything after &#39;coreplugins/&#39;</span>
95
+ <span class="sd"> For external plugins: everything after &#39;src/[plugin_name]/&#39;</span>
96
+ <span class="sd"> </span>
97
+ <span class="sd"> Examples:</span>
98
+ <span class="sd"> - /files/mindroot/src/mindroot/coreplugins/chat/templates/chat.jinja2 -&gt; chat/templates/chat.jinja2</span>
99
+ <span class="sd"> - /some/path/src/my_plugin/templates/page.jinja2 -&gt; my_plugin/templates/page.jinja2</span>
100
+ <span class="sd"> &quot;&quot;&quot;</span>
101
+ <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">absolute_path</span><span class="p">)</span>
102
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">parts</span>
103
+
104
+ <span class="c1"># Find coreplugins in the path</span>
105
+ <span class="k">if</span> <span class="s1">&#39;coreplugins&#39;</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
106
+ <span class="n">coreplugins_idx</span> <span class="o">=</span> <span class="n">parts</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;coreplugins&#39;</span><span class="p">)</span>
107
+ <span class="k">if</span> <span class="n">coreplugins_idx</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
108
+ <span class="k">return</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="n">coreplugins_idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:])</span>
109
+
110
+ <span class="c1"># Find src/[plugin_name] pattern for external plugins</span>
111
+ <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">part</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
112
+ <span class="k">if</span> <span class="n">part</span> <span class="o">==</span> <span class="s1">&#39;src&#39;</span> <span class="ow">and</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span>
113
+ <span class="c1"># Check if this looks like a plugin (has templates, static, etc.)</span>
114
+ <span class="n">potential_plugin</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
115
+ <span class="k">if</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">):</span> <span class="c1"># Has more path after src/plugin_name</span>
116
+ <span class="k">return</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:])</span>
117
+
118
+ <span class="c1"># Fallback: return the filename</span>
119
+ <span class="k">return</span> <span class="n">path</span><span class="o">.</span><span class="n">name</span></div>
120
+
121
+
122
+ <div class="viewcode-block" id="extract_translation_keys">
123
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.extract_translation_keys">[docs]</a>
124
+ <span class="k">def</span><span class="w"> </span><span class="nf">extract_translation_keys</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">set</span><span class="p">:</span>
125
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
126
+ <span class="sd"> Extract all __TRANSLATE_key__ placeholders from content.</span>
127
+ <span class="sd"> </span>
128
+ <span class="sd"> Args:</span>
129
+ <span class="sd"> content: Content to scan for translation keys</span>
130
+ <span class="sd"> </span>
131
+ <span class="sd"> Returns:</span>
132
+ <span class="sd"> Set of translation keys found in the content</span>
133
+ <span class="sd"> &quot;&quot;&quot;</span>
134
+ <span class="n">pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;__TRANSLATE_([a-z0-9_]+)__&#39;</span>
135
+ <span class="n">matches</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
136
+ <span class="k">return</span> <span class="nb">set</span><span class="p">(</span><span class="n">matches</span><span class="p">)</span></div>
137
+
138
+
139
+ <div class="viewcode-block" id="replace_placeholders">
140
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.replace_placeholders">[docs]</a>
141
+ <span class="k">def</span><span class="w"> </span><span class="nf">replace_placeholders</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">plugin_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
142
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
143
+ <span class="sd"> Replace __TRANSLATE_key__ placeholders with actual translations.</span>
144
+ <span class="sd"> </span>
145
+ <span class="sd"> This function now validates that ALL required translations are available</span>
146
+ <span class="sd"> for the specified language. If any translations are missing, it logs</span>
147
+ <span class="sd"> a strong warning and returns None to indicate fallback is needed.</span>
148
+ <span class="sd"> </span>
149
+ <span class="sd"> Args:</span>
150
+ <span class="sd"> content: Template content with placeholders</span>
151
+ <span class="sd"> language: Language code for translations</span>
152
+ <span class="sd"> plugin_path: Path to the localized file (used to determine which plugin&#39;s translations to use)</span>
153
+ <span class="sd"> </span>
154
+ <span class="sd"> Returns:</span>
155
+ <span class="sd"> Content with placeholders replaced by translations, or None if translations are incomplete</span>
156
+ <span class="sd"> &quot;&quot;&quot;</span>
157
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">plugin_path</span><span class="p">:</span>
158
+ <span class="c1"># No plugin path provided, return content unchanged</span>
159
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;No plugin path provided for translation replacement.&quot;</span><span class="p">)</span>
160
+ <span class="k">return</span> <span class="n">content</span>
161
+
162
+ <span class="k">try</span><span class="p">:</span>
163
+ <span class="c1"># Extract all translation keys from the content</span>
164
+ <span class="n">required_keys</span> <span class="o">=</span> <span class="n">extract_translation_keys</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
165
+
166
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">required_keys</span><span class="p">:</span>
167
+ <span class="c1"># No translation keys found, return content as-is</span>
168
+ <span class="k">return</span> <span class="n">content</span>
169
+
170
+ <span class="c1"># Extract plugin name from the localized file path</span>
171
+ <span class="c1"># Path format: .../localized_files/[coreplugins|external_plugins]/[plugin_name]/...</span>
172
+ <span class="n">path_parts</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">)</span><span class="o">.</span><span class="n">parts</span>
173
+
174
+ <span class="c1"># Find &#39;localized_files&#39; in the path</span>
175
+ <span class="k">if</span> <span class="s1">&#39;localized_files&#39;</span> <span class="ow">in</span> <span class="n">path_parts</span><span class="p">:</span>
176
+ <span class="n">idx</span> <span class="o">=</span> <span class="n">path_parts</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;localized_files&#39;</span><span class="p">)</span>
177
+ <span class="k">if</span> <span class="n">idx</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_parts</span><span class="p">):</span>
178
+ <span class="c1"># Get plugin name (should be at idx+2)</span>
179
+ <span class="n">plugin_type</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="c1"># &#39;coreplugins&#39; or &#39;external_plugins&#39;</span>
180
+ <span class="n">plugin_name</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span>
181
+
182
+ <span class="c1"># Load translations for this plugin</span>
183
+ <span class="n">translations_path</span> <span class="o">=</span> <span class="n">TRANSLATIONS_DIR</span> <span class="o">/</span> <span class="n">plugin_type</span> <span class="o">/</span> <span class="n">plugin_name</span> <span class="o">/</span> <span class="s2">&quot;translations.json&quot;</span>
184
+ <span class="n">plugin_translations</span> <span class="o">=</span> <span class="p">{}</span>
185
+ <span class="k">if</span> <span class="n">translations_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
186
+ <span class="k">try</span><span class="p">:</span>
187
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">translations_path</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
188
+ <span class="n">plugin_translations</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>
189
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
190
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not load translations from </span><span class="si">{</span><span class="n">translations_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
191
+ <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Fallback to original file</span>
192
+
193
+ <span class="k">if</span> <span class="n">language</span> <span class="ow">in</span> <span class="n">plugin_translations</span><span class="p">:</span>
194
+ <span class="n">translations</span> <span class="o">=</span> <span class="n">plugin_translations</span><span class="p">[</span><span class="n">language</span><span class="p">]</span>
195
+
196
+ <span class="c1"># Check if ALL required translations are available</span>
197
+ <span class="n">missing_keys</span> <span class="o">=</span> <span class="n">required_keys</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">translations</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
198
+
199
+ <span class="k">if</span> <span class="n">missing_keys</span><span class="p">:</span>
200
+ <span class="c1"># Some translations are missing - log strong warning and return None</span>
201
+ <span class="n">missing_list</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">missing_keys</span><span class="p">))</span>
202
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
203
+ <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
204
+ <span class="sa">f</span><span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">80</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
205
+ <span class="sa">f</span><span class="s2">&quot;MISSING TRANSLATIONS DETECTED!</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
206
+ <span class="sa">f</span><span class="s2">&quot;Plugin: </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
207
+ <span class="sa">f</span><span class="s2">&quot;Language: </span><span class="si">{</span><span class="n">language</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
208
+ <span class="sa">f</span><span class="s2">&quot;File: </span><span class="si">{</span><span class="n">plugin_path</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
209
+ <span class="sa">f</span><span class="s2">&quot;Missing keys: </span><span class="si">{</span><span class="n">missing_list</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
210
+ <span class="sa">f</span><span class="s2">&quot;Falling back to original file to avoid showing placeholders.</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
211
+ <span class="sa">f</span><span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">80</span>
212
+ <span class="p">)</span>
213
+ <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Signal that fallback is needed</span>
214
+
215
+ <span class="c1"># All translations are available - proceed with replacement</span>
216
+ <span class="k">def</span><span class="w"> </span><span class="nf">replace_match</span><span class="p">(</span><span class="n">match</span><span class="p">):</span>
217
+ <span class="n">key</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
218
+ <span class="k">return</span> <span class="n">translations</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span> <span class="c1"># This shouldn&#39;t happen now</span>
219
+
220
+ <span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;__TRANSLATE_([a-z0-9_]+)__&#39;</span><span class="p">,</span> <span class="n">replace_match</span><span class="p">,</span> <span class="n">content</span><span class="p">)</span>
221
+ <span class="k">else</span><span class="p">:</span>
222
+ <span class="c1"># No translations for this language</span>
223
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
224
+ <span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
225
+ <span class="sa">f</span><span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">80</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
226
+ <span class="sa">f</span><span class="s2">&quot;NO TRANSLATIONS FOR LANGUAGE!</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
227
+ <span class="sa">f</span><span class="s2">&quot;Plugin: </span><span class="si">{</span><span class="n">plugin_name</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
228
+ <span class="sa">f</span><span class="s2">&quot;Language: </span><span class="si">{</span><span class="n">language</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
229
+ <span class="sa">f</span><span class="s2">&quot;File: </span><span class="si">{</span><span class="n">plugin_path</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
230
+ <span class="sa">f</span><span class="s2">&quot;Required keys: </span><span class="si">{</span><span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">required_keys</span><span class="p">))</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
231
+ <span class="sa">f</span><span class="s2">&quot;Falling back to original file.</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">+</span>
232
+ <span class="sa">f</span><span class="s2">&quot;=&quot;</span><span class="o">*</span><span class="mi">80</span>
233
+ <span class="p">)</span>
234
+ <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Signal that fallback is needed</span>
235
+ <span class="k">else</span><span class="p">:</span>
236
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not extract plugin info from path: </span><span class="si">{</span><span class="n">plugin_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
237
+ <span class="k">return</span> <span class="kc">None</span>
238
+ <span class="k">else</span><span class="p">:</span>
239
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Path does not contain &#39;localized_files&#39;: </span><span class="si">{</span><span class="n">plugin_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
240
+ <span class="k">return</span> <span class="kc">None</span>
241
+
242
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
243
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error in replace_placeholders: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
244
+ <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Fallback to original file on any error</span></div>
245
+
246
+
247
+ <div class="viewcode-block" id="get_localized_file_path">
248
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.get_localized_file_path">[docs]</a>
249
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_localized_file_path</span><span class="p">(</span><span class="n">original_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Path</span><span class="p">:</span>
250
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
251
+ <span class="sd"> Convert an original file path to its localized version path.</span>
252
+ <span class="sd"> </span>
253
+ <span class="sd"> Examples:</span>
254
+ <span class="sd"> - chat/templates/chat.jinja2 -&gt; localized_files/coreplugins/chat/templates/chat.i18n.jinja2</span>
255
+ <span class="sd"> - my_plugin/templates/page.jinja2 -&gt; localized_files/external_plugins/my_plugin/templates/page.i18n.jinja2</span>
256
+ <span class="sd"> &quot;&quot;&quot;</span>
257
+ <span class="n">plugin_root</span> <span class="o">=</span> <span class="n">extract_plugin_root</span><span class="p">(</span><span class="n">original_path</span><span class="p">)</span>
258
+ <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">plugin_root</span><span class="p">)</span>
259
+
260
+ <span class="c1"># Determine if this is a core plugin or external plugin based on the absolute path</span>
261
+ <span class="k">if</span> <span class="s1">&#39;coreplugins&#39;</span> <span class="ow">in</span> <span class="n">original_path</span><span class="p">:</span>
262
+ <span class="n">base_dir</span> <span class="o">=</span> <span class="n">LOCALIZED_FILES_DIR</span> <span class="o">/</span> <span class="s2">&quot;coreplugins&quot;</span>
263
+ <span class="k">else</span><span class="p">:</span>
264
+ <span class="n">base_dir</span> <span class="o">=</span> <span class="n">LOCALIZED_FILES_DIR</span> <span class="o">/</span> <span class="s2">&quot;external_plugins&quot;</span>
265
+
266
+ <span class="c1"># Add .i18n before the file extension</span>
267
+ <span class="n">stem</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">stem</span>
268
+ <span class="n">suffix</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">suffix</span>
269
+ <span class="n">new_filename</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">stem</span><span class="si">}</span><span class="s2">.i18n</span><span class="si">{</span><span class="n">suffix</span><span class="si">}</span><span class="s2">&quot;</span>
270
+
271
+ <span class="n">localized_path</span> <span class="o">=</span> <span class="n">base_dir</span> <span class="o">/</span> <span class="n">path</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="n">new_filename</span>
272
+ <span class="k">return</span> <span class="n">localized_path</span></div>
273
+
274
+
275
+
276
+ <div class="viewcode-block" id="load_plugin_translations">
277
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.load_plugin_translations">[docs]</a>
278
+ <span class="k">def</span><span class="w"> </span><span class="nf">load_plugin_translations</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
279
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Load translations for a specific plugin from disk.&quot;&quot;&quot;</span>
280
+
281
+ <span class="n">translations_file</span> <span class="o">=</span> <span class="n">get_plugin_translations_path</span><span class="p">(</span><span class="n">plugin_path</span><span class="p">)</span>
282
+
283
+ <span class="k">if</span> <span class="n">translations_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
284
+ <span class="k">try</span><span class="p">:</span>
285
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">translations_file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
286
+ <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>
287
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
288
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Could not load translations from </span><span class="si">{</span><span class="n">translations_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
289
+ <span class="k">else</span><span class="p">:</span>
290
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Translations file does not exist at </span><span class="si">{</span><span class="n">translations_file</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
291
+ <span class="k">return</span> <span class="p">{}</span></div>
292
+
293
+
294
+ <div class="viewcode-block" id="get_plugin_translations_path">
295
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.utils.get_plugin_translations_path">[docs]</a>
296
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_plugin_translations_path</span><span class="p">(</span><span class="n">original_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Path</span><span class="p">:</span>
297
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
298
+ <span class="sd"> Get the path where translations should be stored for a given file.</span>
299
+ <span class="sd"> </span>
300
+ <span class="sd"> Example:</span>
301
+ <span class="sd"> /files/mindroot/src/mindroot/coreplugins/check_list/inject/admin.jinja2</span>
302
+ <span class="sd"> -&gt; translations/coreplugins/check_list/translations.json</span>
303
+ <span class="sd"> &quot;&quot;&quot;</span>
304
+ <span class="n">plugin_root</span> <span class="o">=</span> <span class="n">extract_plugin_root</span><span class="p">(</span><span class="n">original_path</span><span class="p">)</span>
305
+
306
+ <span class="c1"># Determine if this is a core plugin or external plugin based on the absolute path</span>
307
+ <span class="k">if</span> <span class="s1">&#39;coreplugins&#39;</span> <span class="ow">in</span> <span class="n">original_path</span><span class="p">:</span>
308
+ <span class="n">base_dir</span> <span class="o">=</span> <span class="n">TRANSLATIONS_DIR</span> <span class="o">/</span> <span class="s2">&quot;coreplugins&quot;</span>
309
+ <span class="k">else</span><span class="p">:</span>
310
+ <span class="n">base_dir</span> <span class="o">=</span> <span class="n">TRANSLATIONS_DIR</span> <span class="o">/</span> <span class="s2">&quot;external_plugins&quot;</span>
311
+
312
+ <span class="c1"># Get just the plugin name (first part of plugin_root)</span>
313
+ <span class="n">plugin_name</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">plugin_root</span><span class="p">)</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
314
+
315
+ <span class="k">return</span> <span class="n">base_dir</span> <span class="o">/</span> <span class="n">plugin_name</span> <span class="o">/</span> <span class="s2">&quot;translations.json&quot;</span></div>
316
+
317
+
318
+
319
+ </pre></div>
320
+
321
+ </div>
322
+ </div>
323
+ <footer>
324
+
325
+ <hr/>
326
+
327
+ <div role="contentinfo">
328
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
329
+ </div>
330
+
331
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
332
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
333
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
334
+
335
+
336
+ </footer>
337
+ </div>
338
+ </div>
339
+ </section>
340
+ </div>
341
+ <script>
342
+ jQuery(function () {
343
+ SphinxRtdTheme.Navigation.enable(true);
344
+ });
345
+ </script>
346
+
347
+ </body>
348
+ </html>