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,571 @@
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.chat.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
+ <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
43
+ <ul>
44
+ <li class="toctree-l1"><a class="reference internal" href="../../../../getting_started.html">Getting Started</a></li>
45
+ </ul>
46
+
47
+ </div>
48
+ </div>
49
+ </nav>
50
+
51
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
52
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
53
+ <a href="../../../../index.html">MindRoot</a>
54
+ </nav>
55
+
56
+ <div class="wy-nav-content">
57
+ <div class="rst-content">
58
+ <div role="navigation" aria-label="Page navigation">
59
+ <ul class="wy-breadcrumbs">
60
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
61
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
62
+ <li class="breadcrumb-item active">mindroot.coreplugins.chat.router</li>
63
+ <li class="wy-breadcrumbs-aside">
64
+ </li>
65
+ </ul>
66
+ <hr/>
67
+ </div>
68
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
69
+ <div itemprop="articleBody">
70
+
71
+ <h1>Source code for mindroot.coreplugins.chat.router</h1><div class="highlight"><pre>
72
+ <span></span><span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">APIRouter</span><span class="p">,</span> <span class="n">HTTPException</span><span class="p">,</span> <span class="n">Request</span><span class="p">,</span> <span class="n">Response</span><span class="p">,</span> <span class="n">Depends</span><span class="p">,</span> <span class="n">Query</span>
73
+ <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">HTMLResponse</span><span class="p">,</span> <span class="n">RedirectResponse</span><span class="p">,</span> <span class="n">JSONResponse</span>
74
+ <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">File</span><span class="p">,</span> <span class="n">UploadFile</span><span class="p">,</span> <span class="n">Form</span>
75
+ <span class="kn">from</span><span class="w"> </span><span class="nn">sse_starlette.sse</span><span class="w"> </span><span class="kn">import</span> <span class="n">EventSourceResponse</span>
76
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.models</span><span class="w"> </span><span class="kn">import</span> <span class="n">MessageParts</span>
77
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service</span><span class="p">,</span> <span class="n">service_manager</span>
78
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">init_chat_session</span><span class="p">,</span> <span class="n">send_message_to_agent</span><span class="p">,</span> <span class="n">subscribe_to_agent_messages</span><span class="p">,</span> <span class="n">get_chat_history</span><span class="p">,</span> <span class="n">run_task</span>
79
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.templates</span><span class="w"> </span><span class="kn">import</span> <span class="n">render</span>
80
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.auth.auth</span><span class="w"> </span><span class="kn">import</span> <span class="n">require_user</span>
81
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.plugins</span><span class="w"> </span><span class="kn">import</span> <span class="n">list_enabled</span>
82
+ <span class="kn">import</span><span class="w"> </span><span class="nn">nanoid</span>
83
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.commands</span><span class="w"> </span><span class="kn">import</span> <span class="o">*</span>
84
+ <span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
85
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.chatcontext</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_context</span><span class="p">,</span> <span class="n">ChatContext</span>
86
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span>
87
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.services</span><span class="w"> </span><span class="kn">import</span> <span class="n">service</span><span class="p">,</span> <span class="n">service_manager</span>
88
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.providers.commands</span><span class="w"> </span><span class="kn">import</span> <span class="n">command_manager</span>
89
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.utils.debug</span><span class="w"> </span><span class="kn">import</span> <span class="n">debug_box</span>
90
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.session_files</span><span class="w"> </span><span class="kn">import</span> <span class="n">load_session_data</span><span class="p">,</span> <span class="n">save_session_data</span>
91
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
92
+ <span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
93
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.chatcontext</span><span class="w"> </span><span class="kn">import</span> <span class="n">ChatContext</span>
94
+ <span class="kn">import</span><span class="w"> </span><span class="nn">shutil</span>
95
+ <span class="kn">from</span><span class="w"> </span><span class="nn">pydantic</span><span class="w"> </span><span class="kn">import</span> <span class="n">BaseModel</span>
96
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.auth.api_key</span><span class="w"> </span><span class="kn">import</span> <span class="n">verify_api_key</span>
97
+
98
+ <span class="n">router</span> <span class="o">=</span> <span class="n">APIRouter</span><span class="p">()</span>
99
+
100
+ <span class="c1"># Global dictionary to store tasks</span>
101
+ <span class="n">tasks</span> <span class="o">=</span> <span class="p">{}</span>
102
+
103
+ <div class="viewcode-block" id="cancel_chat">
104
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.cancel_chat">[docs]</a>
105
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/</span><span class="si">{task_id}</span><span class="s2">/cancel&quot;</span><span class="p">)</span>
106
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">cancel_chat</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">task_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
107
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;cancel_chat&quot;</span><span class="p">)</span>
108
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Trying to cancel task&quot;</span><span class="p">,</span> <span class="n">task_id</span><span class="p">)</span>
109
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
110
+ <span class="n">context</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_context</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
111
+ <span class="n">debug_box</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
112
+ <span class="n">context</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;finished_conversation&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
113
+ <span class="c1">#if task_id in tasks:</span>
114
+ <span class="c1"># task = tasks[task_id]</span>
115
+ <span class="c1"># await asyncio.sleep(0.75)</span>
116
+ <span class="c1"># task.cancel()</span>
117
+ <span class="c1"># del tasks[task_id]</span>
118
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Task cancelled successfully&quot;</span><span class="p">}</span></div>
119
+
120
+ <span class="c1">#else:</span>
121
+ <span class="c1"># raise HTTPException(status_code=404, detail=&quot;Task not found&quot;)</span>
122
+
123
+ <div class="viewcode-block" id="context1">
124
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.context1">[docs]</a>
125
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/context1/</span><span class="si">{log_id}</span><span class="s2">&quot;</span><span class="p">)</span>
126
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">context1</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
127
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
128
+ <span class="n">context</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_context</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
129
+ <span class="nb">print</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
130
+ <span class="k">return</span> <span class="s2">&quot;ok&quot;</span></div>
131
+
132
+
133
+
134
+ <span class="c1"># need to serve persona images from ./personas/local/[persona_path]/avatar.png</span>
135
+ <div class="viewcode-block" id="get_persona_avatar">
136
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.get_persona_avatar">[docs]</a>
137
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/personas/{persona_path:path}/avatar.png&quot;</span><span class="p">)</span>
138
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_persona_avatar</span><span class="p">(</span><span class="n">persona_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
139
+ <span class="c1"># Check if this is a registry persona with deduplicated assets</span>
140
+ <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="s2">&quot;registry/&quot;</span><span class="p">):</span>
141
+ <span class="n">persona_json_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/persona.json&quot;</span>
142
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">persona_json_path</span><span class="p">):</span>
143
+ <span class="k">try</span><span class="p">:</span>
144
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_json_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
145
+ <span class="n">persona_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
146
+
147
+ <span class="c1"># Check if persona has asset hashes (deduplicated storage)</span>
148
+ <span class="n">asset_hashes</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="s2">&quot;asset_hashes&quot;</span><span class="p">,</span> <span class="p">{})</span>
149
+ <span class="k">if</span> <span class="s2">&quot;avatar&quot;</span> <span class="ow">in</span> <span class="n">asset_hashes</span><span class="p">:</span>
150
+ <span class="c1"># Redirect to deduplicated asset endpoint</span>
151
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/assets/</span><span class="si">{</span><span class="n">asset_hashes</span><span class="p">[</span><span class="s1">&#39;avatar&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
152
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
153
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error checking for deduplicated assets: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
154
+
155
+ <span class="c1"># Handle registry personas: registry/owner/name</span>
156
+ <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>
157
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/avatar.png&quot;</span>
158
+ <span class="k">else</span><span class="p">:</span>
159
+ <span class="c1"># Legacy support: check local first, then shared</span>
160
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/local/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/avatar.png&quot;</span>
161
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
162
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/registry/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/avatar.png&quot;</span>
163
+
164
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
165
+ <span class="n">resolved</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
166
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="s2">&quot;File not found: &quot;</span> <span class="o">+</span> <span class="n">resolved</span><span class="p">}</span>
167
+
168
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
169
+ <span class="n">image_bytes</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
170
+
171
+ <span class="k">return</span> <span class="n">Response</span><span class="p">(</span>
172
+ <span class="n">content</span><span class="o">=</span><span class="n">image_bytes</span><span class="p">,</span>
173
+ <span class="n">media_type</span><span class="o">=</span><span class="s2">&quot;image/png&quot;</span><span class="p">,</span>
174
+ <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
175
+ <span class="s2">&quot;Cache-Control&quot;</span><span class="p">:</span> <span class="s2">&quot;max-age=3600&quot;</span><span class="p">,</span>
176
+ <span class="s2">&quot;Content-Disposition&quot;</span><span class="p">:</span> <span class="s2">&quot;inline; filename=avatar.png&quot;</span>
177
+ <span class="p">}</span>
178
+ <span class="p">)</span></div>
179
+
180
+
181
+ <div class="viewcode-block" id="get_persona_faceref">
182
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.get_persona_faceref">[docs]</a>
183
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/personas/{persona_path:path}/faceref.png&quot;</span><span class="p">)</span>
184
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_persona_faceref</span><span class="p">(</span><span class="n">persona_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
185
+ <span class="c1"># Check if this is a registry persona with deduplicated assets</span>
186
+ <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="s2">&quot;registry/&quot;</span><span class="p">):</span>
187
+ <span class="n">persona_json_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/persona.json&quot;</span>
188
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">persona_json_path</span><span class="p">):</span>
189
+ <span class="k">try</span><span class="p">:</span>
190
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">persona_json_path</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
191
+ <span class="n">persona_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
192
+
193
+ <span class="c1"># Check if persona has asset hashes (deduplicated storage)</span>
194
+ <span class="n">asset_hashes</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="s2">&quot;asset_hashes&quot;</span><span class="p">,</span> <span class="p">{})</span>
195
+ <span class="k">if</span> <span class="s2">&quot;faceref&quot;</span> <span class="ow">in</span> <span class="n">asset_hashes</span><span class="p">:</span>
196
+ <span class="c1"># Redirect to deduplicated asset endpoint</span>
197
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/assets/</span><span class="si">{</span><span class="n">asset_hashes</span><span class="p">[</span><span class="s1">&#39;faceref&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
198
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
199
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error checking for deduplicated assets: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
200
+
201
+ <span class="c1"># Handle registry personas: registry/owner/name</span>
202
+ <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>
203
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/faceref.png&quot;</span>
204
+ <span class="k">else</span><span class="p">:</span>
205
+ <span class="c1"># Legacy support: check local first, then shared</span>
206
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/local/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/faceref.png&quot;</span>
207
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
208
+ <span class="n">file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;personas/registry/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/faceref.png&quot;</span>
209
+
210
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
211
+ <span class="c1"># Fallback to avatar if faceref doesn&#39;t exist</span>
212
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/chat/personas/</span><span class="si">{</span><span class="n">persona_path</span><span class="si">}</span><span class="s2">/avatar.png&quot;</span><span class="p">)</span>
213
+
214
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
215
+ <span class="n">image_bytes</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
216
+
217
+ <span class="k">return</span> <span class="n">Response</span><span class="p">(</span>
218
+ <span class="n">content</span><span class="o">=</span><span class="n">image_bytes</span><span class="p">,</span>
219
+ <span class="n">media_type</span><span class="o">=</span><span class="s2">&quot;image/png&quot;</span><span class="p">,</span>
220
+ <span class="n">headers</span><span class="o">=</span><span class="p">{</span>
221
+ <span class="s2">&quot;Cache-Control&quot;</span><span class="p">:</span> <span class="s2">&quot;max-age=3600&quot;</span><span class="p">,</span>
222
+ <span class="s2">&quot;Content-Disposition&quot;</span><span class="p">:</span> <span class="s2">&quot;inline; filename=faceref.png&quot;</span>
223
+ <span class="p">}</span>
224
+ <span class="p">)</span></div>
225
+
226
+
227
+ <div class="viewcode-block" id="chat_events">
228
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.chat_events">[docs]</a>
229
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/events&quot;</span><span class="p">)</span>
230
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">chat_events</span><span class="p">(</span><span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
231
+ <span class="k">return</span> <span class="n">EventSourceResponse</span><span class="p">(</span><span class="k">await</span> <span class="n">subscribe_to_agent_messages</span><span class="p">(</span><span class="n">log_id</span><span class="p">))</span></div>
232
+
233
+
234
+
235
+ <div class="viewcode-block" id="send_message">
236
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.send_message">[docs]</a>
237
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/send&quot;</span><span class="p">)</span>
238
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">send_message</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">message_parts</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">MessageParts</span><span class="p">]</span> <span class="p">):</span>
239
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span>
240
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;send_message&quot;</span><span class="p">)</span>
241
+
242
+ <span class="n">context</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_context</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">)</span>
243
+ <span class="n">debug_box</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">context</span><span class="p">))</span>
244
+ <span class="c1">#context = ChatContext(command_manager, service_manager, user=user.user)</span>
245
+ <span class="n">task</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span><span class="n">send_message_to_agent</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="n">message_parts</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">user</span><span class="p">))</span>
246
+ <span class="c1">#task = asyncio.create_task(send_message_to_agent(log_id, message_parts, user=user))</span>
247
+
248
+ <span class="n">task_id</span> <span class="o">=</span> <span class="n">nanoid</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
249
+
250
+ <span class="n">tasks</span><span class="p">[</span><span class="n">task_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">task</span>
251
+
252
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;task_id&quot;</span><span class="p">:</span> <span class="n">task_id</span><span class="p">}</span></div>
253
+
254
+
255
+ <div class="viewcode-block" id="get_chat_html">
256
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.get_chat_html">[docs]</a>
257
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/agent/</span><span class="si">{agent_name}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">response_class</span><span class="o">=</span><span class="n">HTMLResponse</span><span class="p">)</span>
258
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_chat_html</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">api_key</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Query</span><span class="p">(</span><span class="kc">None</span><span class="p">),</span> <span class="n">embed</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">Query</span><span class="p">(</span><span class="kc">False</span><span class="p">)):</span>
259
+ <span class="c1"># Handle API key authentication if provided</span>
260
+ <span class="k">if</span> <span class="n">api_key</span><span class="p">:</span>
261
+ <span class="k">try</span><span class="p">:</span>
262
+ <span class="n">user_data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">verify_api_key</span><span class="p">(</span><span class="n">api_key</span><span class="p">)</span>
263
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">user_data</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">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Invalid API key&quot;</span><span class="p">)</span>
265
+ <span class="c1"># Create a mock user object for API key users</span>
266
+ <span class="k">class</span><span class="w"> </span><span class="nc">MockUser</span><span class="p">:</span>
267
+ <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">):</span>
268
+ <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
269
+ <span class="n">user</span> <span class="o">=</span> <span class="n">MockUser</span><span class="p">(</span><span class="n">user_data</span><span class="p">[</span><span class="s1">&#39;username&#39;</span><span class="p">])</span>
270
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
271
+ <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">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="s2">&quot;Invalid API key&quot;</span><span class="p">)</span>
272
+ <span class="k">else</span><span class="p">:</span>
273
+ <span class="c1"># Use regular authentication</span>
274
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="p">,</span> <span class="s2">&quot;user&quot;</span><span class="p">):</span>
275
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
276
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span>
277
+
278
+ <span class="n">log_id</span> <span class="o">=</span> <span class="n">nanoid</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
279
+ <span class="n">plugins</span> <span class="o">=</span> <span class="n">list_enabled</span><span class="p">()</span>
280
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Init chat with user&quot;</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
281
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Init chat with </span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
282
+ <span class="k">await</span> <span class="n">init_chat_session</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">,</span> <span class="n">log_id</span><span class="p">)</span>
283
+
284
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="p">,</span> <span class="s2">&quot;access_token&quot;</span><span class="p">):</span>
285
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;Access token found in request state, saving to session file&quot;</span><span class="p">)</span>
286
+ <span class="n">access_token</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">access_token</span>
287
+ <span class="k">await</span> <span class="n">save_session_data</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="s2">&quot;access_token&quot;</span><span class="p">,</span> <span class="n">access_token</span><span class="p">)</span>
288
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;..&quot;</span><span class="p">)</span>
289
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;Access token saved to session file&quot;</span><span class="p">)</span>
290
+ <span class="k">else</span><span class="p">:</span>
291
+ <span class="n">debug_box</span><span class="p">(</span><span class="s2">&quot;No access token found in request state&quot;</span><span class="p">)</span>
292
+
293
+ <span class="c1"># If embed mode is requested, redirect to embed session</span>
294
+ <span class="k">if</span> <span class="n">embed</span><span class="p">:</span>
295
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/session/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">?embed=true&quot;</span><span class="p">)</span>
296
+
297
+ <span class="c1"># Regular redirect</span>
298
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;/session/</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
299
+
300
+
301
+ <div class="viewcode-block" id="make_session">
302
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.make_session">[docs]</a>
303
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/makesession/</span><span class="si">{agent_name}</span><span class="s2">&quot;</span><span class="p">)</span>
304
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">make_session</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
305
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
306
+ <span class="sd"> Create a new chat session for the specified agent.</span>
307
+ <span class="sd"> Returns a redirect to the chat session page.</span>
308
+ <span class="sd"> &quot;&quot;&quot;</span>
309
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="p">,</span> <span class="s2">&quot;user&quot;</span><span class="p">):</span>
310
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
311
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span>
312
+ <span class="n">log_id</span> <span class="o">=</span> <span class="n">nanoid</span><span class="o">.</span><span class="n">generate</span><span class="p">()</span>
313
+
314
+ <span class="k">await</span> <span class="n">init_chat_session</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">,</span> <span class="n">log_id</span><span class="p">)</span>
315
+ <span class="k">return</span> <span class="n">JSONResponse</span><span class="p">({</span> <span class="s2">&quot;log_id&quot;</span><span class="p">:</span> <span class="n">log_id</span> <span class="p">})</span></div>
316
+
317
+
318
+ <div class="viewcode-block" id="chat_history">
319
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.chat_history">[docs]</a>
320
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/history/</span><span class="si">{agent_name}</span><span class="s2">/</span><span class="si">{log_id}</span><span class="s2">&quot;</span><span class="p">)</span>
321
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">chat_history</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
322
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
323
+ <span class="n">history</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_chat_history</span><span class="p">(</span><span class="n">agent_name</span><span class="p">,</span> <span class="n">log_id</span><span class="p">,</span> <span class="n">user</span><span class="p">)</span>
324
+ <span class="k">if</span> <span class="n">history</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">history</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
325
+ <span class="k">try</span><span class="p">:</span>
326
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;trying to load from system session&quot;</span><span class="p">)</span>
327
+ <span class="n">history</span> <span class="o">=</span> <span class="k">await</span> <span class="n">get_chat_history</span><span class="p">(</span><span class="n">agent_name</span><span class="p">,</span> <span class="n">log_id</span><span class="p">,</span> <span class="s2">&quot;system&quot;</span><span class="p">)</span>
328
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
329
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error loading from system session:&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
330
+ <span class="n">history</span> <span class="o">=</span> <span class="p">[]</span>
331
+ <span class="k">pass</span>
332
+ <span class="k">return</span> <span class="n">history</span></div>
333
+
334
+
335
+ <div class="viewcode-block" id="chat_session">
336
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.chat_session">[docs]</a>
337
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/session/</span><span class="si">{agent_name}</span><span class="s2">/</span><span class="si">{log_id}</span><span class="s2">&quot;</span><span class="p">)</span>
338
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">chat_session</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">embed</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">Query</span><span class="p">(</span><span class="kc">False</span><span class="p">)):</span>
339
+ <span class="c1"># Check authentication (API key or regular user)</span>
340
+ <span class="n">plugins</span> <span class="o">=</span> <span class="n">list_enabled</span><span class="p">()</span>
341
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="p">,</span> <span class="s2">&quot;user&quot;</span><span class="p">):</span>
342
+ <span class="k">return</span> <span class="n">RedirectResponse</span><span class="p">(</span><span class="s2">&quot;/login&quot;</span><span class="p">)</span>
343
+
344
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span>
345
+ <span class="n">agent</span> <span class="o">=</span> <span class="k">await</span> <span class="n">service_manager</span><span class="o">.</span><span class="n">get_agent_data</span><span class="p">(</span><span class="n">agent_name</span><span class="p">)</span>
346
+ <span class="n">persona</span> <span class="o">=</span> <span class="n">agent</span><span class="p">[</span><span class="s1">&#39;persona&#39;</span><span class="p">][</span><span class="s1">&#39;name&#39;</span><span class="p">]</span>
347
+ <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>
348
+ <span class="n">auth_token</span> <span class="o">=</span> <span class="kc">None</span>
349
+ <span class="k">try</span><span class="p">:</span>
350
+ <span class="n">auth_token</span> <span class="o">=</span> <span class="k">await</span> <span class="n">load_session_data</span><span class="p">(</span><span class="n">log_id</span><span class="p">,</span> <span class="s2">&quot;access_token&quot;</span><span class="p">)</span>
351
+ <span class="k">except</span><span class="p">:</span>
352
+ <span class="k">pass</span>
353
+ <span class="n">chat_data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;log_id&quot;</span><span class="p">:</span> <span class="n">log_id</span><span class="p">,</span> <span class="s2">&quot;agent_name&quot;</span><span class="p">:</span> <span class="n">agent_name</span><span class="p">,</span> <span class="s2">&quot;user&quot;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span> <span class="s2">&quot;persona&quot;</span><span class="p">:</span> <span class="n">persona</span> <span class="p">}</span>
354
+
355
+ <span class="k">if</span> <span class="n">auth_token</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
356
+ <span class="n">chat_data</span><span class="p">[</span><span class="s2">&quot;access_token&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">auth_token</span>
357
+
358
+ <span class="c1"># Add embed mode flag</span>
359
+ <span class="k">if</span> <span class="n">embed</span><span class="p">:</span>
360
+ <span class="n">chat_data</span><span class="p">[</span><span class="s2">&quot;embed_mode&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
361
+
362
+ <span class="n">html</span> <span class="o">=</span> <span class="k">await</span> <span class="n">render</span><span class="p">(</span><span class="s1">&#39;chat&#39;</span><span class="p">,</span> <span class="n">chat_data</span><span class="p">)</span>
363
+ <span class="k">return</span> <span class="n">HTMLResponse</span><span class="p">(</span><span class="n">html</span><span class="p">)</span>
364
+
365
+ <span class="c1"># use starlette staticfiles to mount ./imgs</span>
366
+ <span class="n">app</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="s2">&quot;/published&quot;</span><span class="p">,</span> <span class="n">StaticFiles</span><span class="p">(</span><span class="n">directory</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">published_dir</span><span class="p">)),</span> <span class="n">name</span><span class="o">=</span><span class="s2">&quot;published_indices&quot;</span><span class="p">)</span></div>
367
+
368
+
369
+ <div class="viewcode-block" id="TaskRequest">
370
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.TaskRequest">[docs]</a>
371
+ <span class="k">class</span><span class="w"> </span><span class="nc">TaskRequest</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
372
+ <span class="n">instructions</span><span class="p">:</span> <span class="nb">str</span></div>
373
+
374
+
375
+ <div class="viewcode-block" id="run_task_route">
376
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.run_task_route">[docs]</a>
377
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/task/</span><span class="si">{agent_name}</span><span class="s2">&quot;</span><span class="p">)</span>
378
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">run_task_route</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">task_request</span><span class="p">:</span> <span class="n">TaskRequest</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
379
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
380
+ <span class="sd"> Run a task for an agent with the given instructions.</span>
381
+ <span class="sd"> This endpoint allows programmatic interaction with agents without a full chat session.</span>
382
+ <span class="sd"> </span>
383
+ <span class="sd"> Parameters:</span>
384
+ <span class="sd"> - agent_name: The name of the agent to run the task</span>
385
+ <span class="sd"> - instructions: The instructions/prompt to send to the agent</span>
386
+ <span class="sd"> </span>
387
+ <span class="sd"> Returns:</span>
388
+ <span class="sd"> - JSON with results and log_id for tracking</span>
389
+ <span class="sd"> &quot;&quot;&quot;</span>
390
+
391
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
392
+
393
+ <span class="n">instructions</span> <span class="o">=</span> <span class="kc">None</span>
394
+ <span class="k">if</span> <span class="n">task_request</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
395
+ <span class="n">instructions</span> <span class="o">=</span> <span class="n">task_request</span><span class="o">.</span><span class="n">instructions</span>
396
+
397
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">instructions</span><span class="p">:</span>
398
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;error&quot;</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;No instructions provided&quot;</span><span class="p">}</span>
399
+
400
+ <span class="n">task_result</span><span class="p">,</span> <span class="n">full_results</span><span class="p">,</span> <span class="n">log_id</span> <span class="o">=</span> <span class="k">await</span> <span class="n">run_task</span><span class="p">(</span><span class="n">instructions</span><span class="o">=</span><span class="n">instructions</span><span class="p">,</span> <span class="n">agent_name</span><span class="o">=</span><span class="n">agent_name</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">user</span><span class="p">)</span>
401
+ <span class="nb">print</span><span class="p">(</span><span class="n">task_result</span><span class="p">)</span>
402
+ <span class="nb">print</span><span class="p">(</span><span class="n">full_results</span><span class="p">)</span>
403
+ <span class="nb">print</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
404
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="n">task_result</span><span class="p">,</span> <span class="s2">&quot;full_results&quot;</span><span class="p">:</span> <span class="n">full_results</span><span class="p">,</span> <span class="s2">&quot;log_id&quot;</span><span class="p">:</span> <span class="n">log_id</span><span class="p">}</span></div>
405
+
406
+
407
+
408
+ <div class="viewcode-block" id="upload_file">
409
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.upload_file">[docs]</a>
410
+ <span class="nd">@router</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/upload&quot;</span><span class="p">)</span>
411
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">upload_file</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">file</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="o">...</span><span class="p">)):</span>
412
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
413
+ <span class="sd"> Upload a file and store it in a user-specific directory.</span>
414
+ <span class="sd"> Returns the file path that can be used in messages.</span>
415
+ <span class="sd"> &quot;&quot;&quot;</span>
416
+ <span class="n">user</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">user</span><span class="o">.</span><span class="n">username</span>
417
+
418
+ <span class="c1"># Create user uploads directory if it doesn&#39;t exist</span>
419
+ <span class="n">user_upload_dir</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;data/users/</span><span class="si">{</span><span class="n">user</span><span class="si">}</span><span class="s2">/uploads/</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span>
420
+ <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">user_upload_dir</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
421
+
422
+ <span class="c1"># Generate a safe filename to prevent path traversal</span>
423
+ <span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
424
+ <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">user_upload_dir</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span>
425
+
426
+ <span class="c1"># Save the file</span>
427
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">buffer</span><span class="p">:</span>
428
+ <span class="n">shutil</span><span class="o">.</span><span class="n">copyfileobj</span><span class="p">(</span><span class="n">file</span><span class="o">.</span><span class="n">file</span><span class="p">,</span> <span class="n">buffer</span><span class="p">)</span>
429
+
430
+ <span class="c1"># Return the file information</span>
431
+ <span class="k">return</span> <span class="p">{</span>
432
+ <span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span>
433
+ <span class="s2">&quot;filename&quot;</span><span class="p">:</span> <span class="n">filename</span><span class="p">,</span>
434
+ <span class="s2">&quot;path&quot;</span><span class="p">:</span> <span class="n">file_path</span><span class="p">,</span>
435
+ <span class="s2">&quot;mime_type&quot;</span><span class="p">:</span> <span class="n">file</span><span class="o">.</span><span class="n">content_type</span>
436
+ <span class="p">}</span></div>
437
+
438
+
439
+
440
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.chatlog</span><span class="w"> </span><span class="kn">import</span> <span class="n">count_tokens_for_log_id</span>
441
+
442
+ <div class="viewcode-block" id="get_token_count">
443
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.get_token_count">[docs]</a>
444
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/tokens&quot;</span><span class="p">)</span>
445
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_token_count</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
446
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
447
+ <span class="sd"> Get token counts for a chat log identified by log_id, including any delegated tasks.</span>
448
+ <span class="sd"> </span>
449
+ <span class="sd"> Parameters:</span>
450
+ <span class="sd"> - log_id: The log ID to count tokens for</span>
451
+ <span class="sd"> </span>
452
+ <span class="sd"> Returns:</span>
453
+ <span class="sd"> - JSON with token counts or error message if log not found</span>
454
+ <span class="sd"> &quot;&quot;&quot;</span>
455
+ <span class="n">token_counts</span> <span class="o">=</span> <span class="k">await</span> <span class="n">count_tokens_for_log_id</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
456
+
457
+ <span class="k">if</span> <span class="n">token_counts</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
458
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;error&quot;</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Chat log with ID </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">}</span>
459
+
460
+
461
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;token_counts&quot;</span><span class="p">:</span> <span class="n">token_counts</span><span class="p">}</span></div>
462
+
463
+
464
+ <div class="viewcode-block" id="delete_chat_session">
465
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.delete_chat_session">[docs]</a>
466
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/del_session/</span><span class="si">{log_id}</span><span class="s2">&quot;</span><span class="p">)</span>
467
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">delete_chat_session</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">Depends</span><span class="p">(</span><span class="n">require_user</span><span class="p">)):</span>
468
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
469
+ <span class="sd"> Delete a chat session by log_id, including chat logs, context files, and all child sessions.</span>
470
+ <span class="sd"> </span>
471
+ <span class="sd"> Parameters:</span>
472
+ <span class="sd"> - log_id: The log ID of the session to delete</span>
473
+ <span class="sd"> </span>
474
+ <span class="sd"> Returns:</span>
475
+ <span class="sd"> - JSON with success status and message</span>
476
+ <span class="sd"> &quot;&quot;&quot;</span>
477
+ <span class="k">try</span><span class="p">:</span>
478
+ <span class="c1"># Try to determine the agent name from the context file first</span>
479
+ <span class="n">agent_name</span> <span class="o">=</span> <span class="s2">&quot;unknown&quot;</span>
480
+ <span class="n">context_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;CHATCONTEXT_DIR&#39;</span><span class="p">,</span> <span class="s1">&#39;data/context&#39;</span><span class="p">)</span>
481
+ <span class="n">context_file_path</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">context_dir</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2">/context_</span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">.json&quot;</span>
482
+
483
+ <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">context_file_path</span><span class="p">):</span>
484
+ <span class="k">try</span><span class="p">:</span>
485
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">context_file_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>
486
+ <span class="n">context_data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
487
+ <span class="n">agent_name</span> <span class="o">=</span> <span class="n">context_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;agent_name&#39;</span><span class="p">,</span> <span class="s1">&#39;unknown&#39;</span><span class="p">)</span>
488
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found agent name &#39;</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">&#39; from context file for log_id </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
489
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
490
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error reading context file </span><span class="si">{</span><span class="n">context_file_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>
491
+
492
+ <span class="c1"># If we still don&#39;t have the agent name, try to find the chatlog file</span>
493
+ <span class="k">if</span> <span class="n">agent_name</span> <span class="o">==</span> <span class="s2">&quot;unknown&quot;</span><span class="p">:</span>
494
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.chatlog</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_chatlog_file</span>
495
+ <span class="n">chatlog_path</span> <span class="o">=</span> <span class="n">find_chatlog_file</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
496
+ <span class="k">if</span> <span class="n">chatlog_path</span><span class="p">:</span>
497
+ <span class="c1"># Extract agent from path: data/chat/{user}/{agent}/chatlog_{log_id}.json</span>
498
+ <span class="n">path_parts</span> <span class="o">=</span> <span class="n">chatlog_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">sep</span><span class="p">)</span>
499
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">path_parts</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>
500
+ <span class="n">agent_name</span> <span class="o">=</span> <span class="n">path_parts</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># Agent is the second-to-last part</span>
501
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found agent name &#39;</span><span class="si">{</span><span class="n">agent_name</span><span class="si">}</span><span class="s2">&#39; from chatlog file path for log_id </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
502
+
503
+ <span class="k">await</span> <span class="n">ChatContext</span><span class="o">.</span><span class="n">delete_session_by_id</span><span class="p">(</span><span class="n">log_id</span><span class="o">=</span><span class="n">log_id</span><span class="p">,</span> <span class="n">user</span><span class="o">=</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">agent</span><span class="o">=</span><span class="n">agent_name</span><span class="p">,</span> <span class="n">cascade</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
504
+
505
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Chat session </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2"> deleted successfully&quot;</span><span class="p">}</span>
506
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
507
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error deleting chat session </span><span class="si">{</span><span class="n">log_id</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>
508
+ <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="s2">&quot;Error deleting chat session: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
509
+
510
+
511
+
512
+ <div class="viewcode-block" id="get_token_count_alt">
513
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.chat.html#mindroot.coreplugins.chat.router.get_token_count_alt">[docs]</a>
514
+ <span class="nd">@router</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;/chat/</span><span class="si">{log_id}</span><span class="s2">/tokens&quot;</span><span class="p">)</span>
515
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_token_count_alt</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">log_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
516
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
517
+ <span class="sd"> Alternative token count endpoint using token_counter module.</span>
518
+ <span class="sd"> </span>
519
+ <span class="sd"> Parameters:</span>
520
+ <span class="sd"> - log_id: The log ID to count tokens for</span>
521
+ <span class="sd"> </span>
522
+ <span class="sd"> Returns:</span>
523
+ <span class="sd"> - JSON with token counts or error message if log not found</span>
524
+ <span class="sd"> &quot;&quot;&quot;</span>
525
+ <span class="kn">from</span><span class="w"> </span><span class="nn">lib.token_counter</span><span class="w"> </span><span class="kn">import</span> <span class="n">count_tokens_for_log_id</span>
526
+
527
+ <span class="n">token_counts</span> <span class="o">=</span> <span class="k">await</span> <span class="n">count_tokens_for_log_id</span><span class="p">(</span><span class="n">log_id</span><span class="p">)</span>
528
+
529
+ <span class="k">if</span> <span class="n">token_counts</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
530
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;error&quot;</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&quot;Chat log with ID </span><span class="si">{</span><span class="n">log_id</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">}</span>
531
+
532
+
533
+ <span class="k">return</span> <span class="p">{</span><span class="s2">&quot;status&quot;</span><span class="p">:</span> <span class="s2">&quot;ok&quot;</span><span class="p">,</span> <span class="s2">&quot;token_counts&quot;</span><span class="p">:</span> <span class="n">token_counts</span><span class="p">}</span></div>
534
+
535
+
536
+ <span class="c1"># Include widget routes</span>
537
+ <span class="k">try</span><span class="p">:</span>
538
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.widget_routes</span><span class="w"> </span><span class="kn">import</span> <span class="n">router</span> <span class="k">as</span> <span class="n">widget_router</span>
539
+ <span class="n">router</span><span class="o">.</span><span class="n">include_router</span><span class="p">(</span><span class="n">widget_router</span><span class="p">)</span>
540
+ <span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
541
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Warning: Could not load widget routes: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
542
+ </pre></div>
543
+
544
+ </div>
545
+ </div>
546
+ <footer>
547
+
548
+ <hr/>
549
+
550
+ <div role="contentinfo">
551
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
552
+ </div>
553
+
554
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
555
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
556
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
557
+
558
+
559
+ </footer>
560
+ </div>
561
+ </div>
562
+ </section>
563
+ </div>
564
+ <script>
565
+ jQuery(function () {
566
+ SphinxRtdTheme.Navigation.enable(true);
567
+ });
568
+ </script>
569
+
570
+ </body>
571
+ </html>