flowent 0.0.5 → 0.0.7

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.
Files changed (265) hide show
  1. package/README.md +1 -1
  2. package/backend/README.md +1 -1
  3. package/backend/pyproject.toml +1 -1
  4. package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
  5. package/backend/src/flowent/__pycache__/_version.cpython-313.pyc +0 -0
  6. package/backend/src/flowent/__pycache__/access.cpython-313.pyc +0 -0
  7. package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
  8. package/backend/src/flowent/__pycache__/assistant_commands.cpython-313.pyc +0 -0
  9. package/backend/src/flowent/__pycache__/cli.cpython-313.pyc +0 -0
  10. package/backend/src/flowent/__pycache__/config.cpython-313.pyc +0 -0
  11. package/backend/src/flowent/__pycache__/events.cpython-313.pyc +0 -0
  12. package/backend/src/flowent/__pycache__/graph_runtime.cpython-313.pyc +0 -0
  13. package/backend/src/flowent/__pycache__/graph_service.cpython-313.pyc +0 -0
  14. package/backend/src/flowent/__pycache__/image_assets.cpython-313.pyc +0 -0
  15. package/backend/src/flowent/__pycache__/logging.cpython-313.pyc +0 -0
  16. package/backend/src/flowent/__pycache__/main.cpython-313.pyc +0 -0
  17. package/backend/src/flowent/__pycache__/model_metadata.cpython-313.pyc +0 -0
  18. package/backend/src/flowent/__pycache__/network.cpython-313.pyc +0 -0
  19. package/backend/src/flowent/__pycache__/observability_service.cpython-313.pyc +0 -0
  20. package/backend/src/flowent/__pycache__/registry.cpython-313.pyc +0 -0
  21. package/backend/src/flowent/__pycache__/role_management.cpython-313.pyc +0 -0
  22. package/backend/src/flowent/__pycache__/runtime.cpython-313.pyc +0 -0
  23. package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
  24. package/backend/src/flowent/__pycache__/security.cpython-313.pyc +0 -0
  25. package/backend/src/flowent/__pycache__/settings.cpython-313.pyc +0 -0
  26. package/backend/src/flowent/__pycache__/settings_management.cpython-313.pyc +0 -0
  27. package/backend/src/flowent/__pycache__/state_db.cpython-313.pyc +0 -0
  28. package/backend/src/flowent/__pycache__/workspace_store.cpython-313.pyc +0 -0
  29. package/backend/src/flowent/agent.py +91 -8
  30. package/backend/src/flowent/channels/__pycache__/__init__.cpython-313.pyc +0 -0
  31. package/backend/src/flowent/channels/__pycache__/telegram.cpython-313.pyc +0 -0
  32. package/backend/src/flowent/graph_service.py +3 -110
  33. package/backend/src/flowent/models/__pycache__/__init__.cpython-313.pyc +0 -0
  34. package/backend/src/flowent/models/__pycache__/agent.cpython-313.pyc +0 -0
  35. package/backend/src/flowent/models/__pycache__/base.cpython-313.pyc +0 -0
  36. package/backend/src/flowent/models/__pycache__/blueprint.cpython-313.pyc +0 -0
  37. package/backend/src/flowent/models/__pycache__/content.cpython-313.pyc +0 -0
  38. package/backend/src/flowent/models/__pycache__/delta.cpython-313.pyc +0 -0
  39. package/backend/src/flowent/models/__pycache__/event.cpython-313.pyc +0 -0
  40. package/backend/src/flowent/models/__pycache__/graph.cpython-313.pyc +0 -0
  41. package/backend/src/flowent/models/__pycache__/history.cpython-313.pyc +0 -0
  42. package/backend/src/flowent/models/__pycache__/llm.cpython-313.pyc +0 -0
  43. package/backend/src/flowent/models/__pycache__/message.cpython-313.pyc +0 -0
  44. package/backend/src/flowent/models/__pycache__/tab.cpython-313.pyc +0 -0
  45. package/backend/src/flowent/models/__pycache__/todo.cpython-313.pyc +0 -0
  46. package/backend/src/flowent/prompts/__pycache__/__init__.cpython-313.pyc +0 -0
  47. package/backend/src/flowent/prompts/__pycache__/common.cpython-313.pyc +0 -0
  48. package/backend/src/flowent/prompts/__pycache__/steward.cpython-313.pyc +0 -0
  49. package/backend/src/flowent/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  50. package/backend/src/flowent/providers/__pycache__/anthropic.cpython-313.pyc +0 -0
  51. package/backend/src/flowent/providers/__pycache__/base_url.cpython-313.pyc +0 -0
  52. package/backend/src/flowent/providers/__pycache__/configuration.cpython-313.pyc +0 -0
  53. package/backend/src/flowent/providers/__pycache__/content.cpython-313.pyc +0 -0
  54. package/backend/src/flowent/providers/__pycache__/errors.cpython-313.pyc +0 -0
  55. package/backend/src/flowent/providers/__pycache__/gateway.cpython-313.pyc +0 -0
  56. package/backend/src/flowent/providers/__pycache__/headers.cpython-313.pyc +0 -0
  57. package/backend/src/flowent/providers/__pycache__/management.cpython-313.pyc +0 -0
  58. package/backend/src/flowent/providers/__pycache__/openai.cpython-313.pyc +0 -0
  59. package/backend/src/flowent/providers/__pycache__/openai_responses.cpython-313.pyc +0 -0
  60. package/backend/src/flowent/providers/__pycache__/registry.cpython-313.pyc +0 -0
  61. package/backend/src/flowent/providers/__pycache__/sse.cpython-313.pyc +0 -0
  62. package/backend/src/flowent/providers/__pycache__/thinking.cpython-313.pyc +0 -0
  63. package/backend/src/flowent/role_management.py +9 -6
  64. package/backend/src/flowent/routes/__init__.py +0 -2
  65. package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
  66. package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
  67. package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
  68. package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
  69. package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
  70. package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
  71. package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
  72. package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
  73. package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
  74. package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
  75. package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
  76. package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
  77. package/backend/src/flowent/routes/assistant.py +3 -0
  78. package/backend/src/flowent/routes/nodes.py +11 -1
  79. package/backend/src/flowent/routes/settings.py +169 -118
  80. package/backend/src/flowent/routes/tabs.py +0 -12
  81. package/backend/src/flowent/runtime.py +0 -5
  82. package/backend/src/flowent/security.py +1 -21
  83. package/backend/src/flowent/settings.py +15 -421
  84. package/backend/src/flowent/settings_management.py +260 -164
  85. package/backend/src/flowent/state_db.py +2 -14
  86. package/backend/src/flowent/static/assets/AssistantPage-BW7XAd9I.js +1 -0
  87. package/backend/src/flowent/static/assets/ChannelsPage-tCJHgt6m.js +1 -0
  88. package/backend/src/flowent/static/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
  89. package/backend/src/flowent/static/assets/PromptsPage-C3Sxn2D7.js +1 -0
  90. package/backend/src/flowent/static/assets/ProvidersPage-BfmdXmNt.js +3 -0
  91. package/backend/src/flowent/static/assets/RolesPage-DET8wO4r.js +1 -0
  92. package/backend/src/flowent/static/assets/SettingsPage-D-g3deMm.js +3 -0
  93. package/backend/src/flowent/static/assets/ToolsPage-CDmtE2g4.js +1 -0
  94. package/backend/src/flowent/static/assets/WorkspacePage-AZsJ0sD0.js +3 -0
  95. package/backend/src/flowent/static/assets/WorkspacePanels-CteCjolX.js +1 -0
  96. package/backend/src/flowent/static/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
  97. package/backend/src/flowent/static/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
  98. package/backend/src/flowent/static/assets/index--o_0fv0N.css +1 -0
  99. package/backend/src/flowent/static/assets/index-C9HuekJm.js +10 -0
  100. package/backend/src/flowent/static/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
  101. package/backend/src/flowent/static/assets/providerTypes-DT3Ahwl_.js +1 -0
  102. package/backend/src/flowent/static/assets/roles-CuRT_chR.js +1 -0
  103. package/{dist/frontend/assets/select-D9SwnlXF.js → backend/src/flowent/static/assets/select-DCfeNu-F.js} +1 -1
  104. package/backend/src/flowent/static/assets/surface-pWwG5ogx.js +1 -0
  105. package/backend/src/flowent/static/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
  106. package/backend/src/flowent/static/assets/useAppRoute-FgSHBKhV.js +1 -0
  107. package/backend/src/flowent/static/index.html +3 -3
  108. package/backend/src/flowent/tools/__init__.py +2 -101
  109. package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  110. package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
  111. package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
  112. package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
  113. package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
  114. package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
  115. package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
  116. package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
  117. package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
  118. package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
  119. package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
  120. package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
  121. package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
  122. package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
  123. package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
  124. package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
  125. package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
  126. package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
  127. package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
  128. package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
  129. package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
  130. package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
  131. package/backend/src/flowent/tools/list_roles.py +2 -9
  132. package/backend/src/flowent/tools/manage_settings.py +134 -172
  133. package/backend/tests/__pycache__/__init__.cpython-313.pyc +0 -0
  134. package/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  135. package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
  136. package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
  137. package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
  138. package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
  139. package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
  140. package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
  141. package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
  142. package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
  143. package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
  144. package/backend/tests/integration/api/test_assistant_api.py +68 -0
  145. package/backend/tests/integration/api/test_meta_api.py +0 -1
  146. package/backend/tests/integration/api/test_nodes_api.py +73 -8
  147. package/backend/tests/integration/api/test_tabs_api.py +0 -114
  148. package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
  149. package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
  150. package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  151. package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
  152. package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
  153. package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
  154. package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
  155. package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  156. package/backend/tests/unit/agent/test_agent_public_api.py +0 -15
  157. package/backend/tests/unit/agent/test_agent_runtime.py +148 -2
  158. package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
  159. package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
  160. package/backend/tests/unit/prompts/__pycache__/test_prompts.cpython-313-pytest-9.0.3.pyc +0 -0
  161. package/backend/tests/unit/providers/__pycache__/test_anthropic_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  162. package/backend/tests/unit/providers/__pycache__/test_errors.cpython-313-pytest-9.0.3.pyc +0 -0
  163. package/backend/tests/unit/providers/__pycache__/test_extract_delta_parts.cpython-313-pytest-9.0.3.pyc +0 -0
  164. package/backend/tests/unit/providers/__pycache__/test_openai_provider.cpython-313-pytest-9.0.3.pyc +0 -0
  165. package/backend/tests/unit/providers/__pycache__/test_openai_responses.cpython-313-pytest-9.0.3.pyc +0 -0
  166. package/backend/tests/unit/providers/__pycache__/test_provider_gateway.cpython-313-pytest-9.0.3.pyc +0 -0
  167. package/backend/tests/unit/providers/__pycache__/test_think_tag_parser.cpython-313-pytest-9.0.3.pyc +0 -0
  168. package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  169. package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
  170. package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  171. package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
  172. package/backend/tests/unit/routes/test_prompts_routes.py +0 -22
  173. package/backend/tests/unit/routes/test_roles_routes.py +6 -2
  174. package/backend/tests/unit/routes/test_settings_routes.py +0 -19
  175. package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
  176. package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
  177. package/backend/tests/unit/security/__pycache__/test_security.cpython-313-pytest-9.0.3.pyc +0 -0
  178. package/backend/tests/unit/settings/__pycache__/test_settings_roles.cpython-313-pytest-9.0.3.pyc +0 -0
  179. package/backend/tests/unit/settings/test_settings_roles.py +3 -51
  180. package/backend/tests/unit/test_cli.py +0 -22
  181. package/backend/tests/unit/test_state_sqlite_storage.py +27 -99
  182. package/backend/tests/unit/test_workspace_store.py +0 -3
  183. package/backend/tests/unit/tools/__pycache__/test_connect_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  184. package/backend/tests/unit/tools/__pycache__/test_create_agent_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  185. package/backend/tests/unit/tools/__pycache__/test_delete_tab_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  186. package/backend/tests/unit/tools/__pycache__/test_edit_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  187. package/backend/tests/unit/tools/__pycache__/test_exec_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  188. package/backend/tests/unit/tools/__pycache__/test_fetch_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  189. package/backend/tests/unit/tools/__pycache__/test_manage_prompts_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  190. package/backend/tests/unit/tools/__pycache__/test_manage_providers_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  191. package/backend/tests/unit/tools/__pycache__/test_manage_roles_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  192. package/backend/tests/unit/tools/__pycache__/test_manage_settings_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  193. package/backend/tests/unit/tools/__pycache__/test_read_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  194. package/backend/tests/unit/tools/__pycache__/test_set_permissions_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  195. package/backend/tests/unit/tools/__pycache__/test_todo_tool.cpython-313-pytest-9.0.3.pyc +0 -0
  196. package/backend/tests/unit/tools/__pycache__/test_tool_registry.cpython-313-pytest-9.0.3.pyc +0 -0
  197. package/backend/tests/unit/tools/test_create_agent_tool.py +0 -32
  198. package/backend/tests/unit/tools/test_manage_prompts_tool.py +5 -30
  199. package/backend/tests/unit/tools/test_tool_registry.py +45 -40
  200. package/backend/uv.lock +1 -1
  201. package/dist/frontend/assets/AssistantPage-BW7XAd9I.js +1 -0
  202. package/dist/frontend/assets/ChannelsPage-tCJHgt6m.js +1 -0
  203. package/dist/frontend/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
  204. package/dist/frontend/assets/PromptsPage-C3Sxn2D7.js +1 -0
  205. package/dist/frontend/assets/ProvidersPage-BfmdXmNt.js +3 -0
  206. package/dist/frontend/assets/RolesPage-DET8wO4r.js +1 -0
  207. package/dist/frontend/assets/SettingsPage-D-g3deMm.js +3 -0
  208. package/dist/frontend/assets/ToolsPage-CDmtE2g4.js +1 -0
  209. package/dist/frontend/assets/WorkspacePage-AZsJ0sD0.js +3 -0
  210. package/dist/frontend/assets/WorkspacePanels-CteCjolX.js +1 -0
  211. package/dist/frontend/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
  212. package/dist/frontend/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
  213. package/dist/frontend/assets/index--o_0fv0N.css +1 -0
  214. package/dist/frontend/assets/index-C9HuekJm.js +10 -0
  215. package/dist/frontend/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
  216. package/dist/frontend/assets/providerTypes-DT3Ahwl_.js +1 -0
  217. package/dist/frontend/assets/roles-CuRT_chR.js +1 -0
  218. package/{backend/src/flowent/static/assets/select-D9SwnlXF.js → dist/frontend/assets/select-DCfeNu-F.js} +1 -1
  219. package/dist/frontend/assets/surface-pWwG5ogx.js +1 -0
  220. package/dist/frontend/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
  221. package/dist/frontend/assets/useAppRoute-FgSHBKhV.js +1 -0
  222. package/dist/frontend/index.html +3 -3
  223. package/package.json +1 -1
  224. package/backend/src/flowent/__pycache__/mcp_service.cpython-313.pyc +0 -0
  225. package/backend/src/flowent/mcp_service.py +0 -1918
  226. package/backend/src/flowent/routes/__pycache__/mcp.cpython-313.pyc +0 -0
  227. package/backend/src/flowent/routes/mcp.py +0 -125
  228. package/backend/src/flowent/static/assets/AssistantPage-VBohhz4d.js +0 -1
  229. package/backend/src/flowent/static/assets/ChannelsPage-CIydPZA_.js +0 -1
  230. package/backend/src/flowent/static/assets/McpPage-CHPm2TPY.js +0 -7
  231. package/backend/src/flowent/static/assets/PromptsPage-CSmJ3sZg.js +0 -1
  232. package/backend/src/flowent/static/assets/ProvidersPage-sl2jeG4e.js +0 -3
  233. package/backend/src/flowent/static/assets/RolesPage-DCe7W6Km.js +0 -1
  234. package/backend/src/flowent/static/assets/SettingsPage-Bix9e63E.js +0 -3
  235. package/backend/src/flowent/static/assets/ToolsPage-favNkj5C.js +0 -1
  236. package/backend/src/flowent/static/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  237. package/backend/src/flowent/static/assets/WorkspacePage-KuaDjt_D.js +0 -3
  238. package/backend/src/flowent/static/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  239. package/backend/src/flowent/static/assets/datetime-eJqd0V2S.js +0 -1
  240. package/backend/src/flowent/static/assets/index-Biio-CoI.js +0 -10
  241. package/backend/src/flowent/static/assets/index-CmQvO7sl.css +0 -1
  242. package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +0 -1
  243. package/backend/src/flowent/static/assets/surface-Bzr1FRG4.js +0 -1
  244. package/backend/src/flowent/static/assets/triState-DgLlKdRR.js +0 -1
  245. package/backend/src/flowent/tools/__pycache__/mcp.cpython-313.pyc +0 -0
  246. package/backend/src/flowent/tools/mcp.py +0 -199
  247. package/backend/tests/integration/api/__pycache__/test_mcp_api.cpython-313-pytest-9.0.3.pyc +0 -0
  248. package/backend/tests/integration/api/test_mcp_api.py +0 -116
  249. package/dist/frontend/assets/AssistantPage-VBohhz4d.js +0 -1
  250. package/dist/frontend/assets/ChannelsPage-CIydPZA_.js +0 -1
  251. package/dist/frontend/assets/McpPage-CHPm2TPY.js +0 -7
  252. package/dist/frontend/assets/PromptsPage-CSmJ3sZg.js +0 -1
  253. package/dist/frontend/assets/ProvidersPage-sl2jeG4e.js +0 -3
  254. package/dist/frontend/assets/RolesPage-DCe7W6Km.js +0 -1
  255. package/dist/frontend/assets/SettingsPage-Bix9e63E.js +0 -3
  256. package/dist/frontend/assets/ToolsPage-favNkj5C.js +0 -1
  257. package/dist/frontend/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
  258. package/dist/frontend/assets/WorkspacePage-KuaDjt_D.js +0 -3
  259. package/dist/frontend/assets/WorkspacePanels-BZxBw8M5.js +0 -1
  260. package/dist/frontend/assets/datetime-eJqd0V2S.js +0 -1
  261. package/dist/frontend/assets/index-Biio-CoI.js +0 -10
  262. package/dist/frontend/assets/index-CmQvO7sl.css +0 -1
  263. package/dist/frontend/assets/roles-BbIEIMeG.js +0 -1
  264. package/dist/frontend/assets/surface-Bzr1FRG4.js +0 -1
  265. package/dist/frontend/assets/triState-DgLlKdRR.js +0 -1
@@ -151,7 +151,6 @@ MODEL_REASONING_EFFORT_OPTIONS = frozenset({"none", "low", "medium", "high", "xh
151
151
  MODEL_VERBOSITY_OPTIONS = frozenset({"low", "medium", "high"})
152
152
  MODEL_RETRY_POLICY_OPTIONS = frozenset({"no_retry", "limited", "unlimited"})
153
153
  PROVIDER_MODEL_SOURCE_OPTIONS = frozenset({"discovered", "manual"})
154
- MCP_TRANSPORT_OPTIONS = frozenset({"stdio", "streamable_http"})
155
154
  REMOVED_TOOL_NAMES = frozenset({"exit", "list_connections"})
156
155
  RENAMED_TOOL_NAMES = {
157
156
  "create_tab": "create_workflow",
@@ -166,8 +165,6 @@ DEFAULT_LLM_RETRY_MAX_DELAY_SECONDS = 8.0
166
165
  DEFAULT_LLM_RETRY_BACKOFF_CAP_RETRIES = 5
167
166
  DEFAULT_LLM_AUTO_COMPACT_TOKEN_LIMIT: int | None = None
168
167
  DEFAULT_ASSISTANT_ALLOW_NETWORK = True
169
- DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC = 10
170
- DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC = 30
171
168
 
172
169
 
173
170
  def build_default_app_data_dir() -> str:
@@ -266,14 +263,6 @@ def _normalize_assistant_write_dir(
266
263
  return str(resolve_path(raw_write_dir, base_dir=base_dir, strict=False))
267
264
 
268
265
 
269
- def _normalize_mcp_server_cwd(
270
- raw_cwd: str,
271
- *,
272
- base_dir: str | Path | None = None,
273
- ) -> str:
274
- return str(resolve_path(raw_cwd, base_dir=base_dir, strict=False))
275
-
276
-
277
266
  def build_working_dir(
278
267
  raw_working_dir: object,
279
268
  *,
@@ -309,30 +298,6 @@ class RoleConfig:
309
298
  excluded_tools: list[str] = field(default_factory=list)
310
299
 
311
300
 
312
- @dataclass
313
- class MCPServerConfig:
314
- name: str
315
- transport: str
316
- enabled: bool = True
317
- required: bool = False
318
- startup_timeout_sec: int = DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC
319
- tool_timeout_sec: int = DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC
320
- enabled_tools: list[str] = field(default_factory=list)
321
- disabled_tools: list[str] = field(default_factory=list)
322
- scopes: list[str] = field(default_factory=list)
323
- oauth_resource: str = ""
324
- launcher: str = ""
325
- command: str = ""
326
- args: list[str] = field(default_factory=list)
327
- env: dict[str, str] = field(default_factory=dict)
328
- env_vars: list[str] = field(default_factory=list)
329
- cwd: str = ""
330
- url: str = ""
331
- bearer_token_env_var: str = ""
332
- http_headers: dict[str, str] = field(default_factory=dict)
333
- env_http_headers: list[str] = field(default_factory=list)
334
-
335
-
336
301
  @dataclass
337
302
  class ModelSettings:
338
303
  active_provider_id: str = ""
@@ -401,7 +366,6 @@ class Settings:
401
366
  custom_post_prompt: str = ""
402
367
  providers: list[ProviderConfig] = field(default_factory=list)
403
368
  roles: list[RoleConfig] = field(default_factory=list)
404
- mcp_servers: list[MCPServerConfig] = field(default_factory=list)
405
369
 
406
370
 
407
371
  _cached_settings: Settings | None = None
@@ -672,27 +636,6 @@ def build_assistant_write_dirs(
672
636
  return normalized
673
637
 
674
638
 
675
- def build_mcp_server_mounts(
676
- raw_server_names: object,
677
- *,
678
- field_name: str,
679
- ) -> list[str]:
680
- if not isinstance(raw_server_names, list):
681
- raise ValueError(f"{field_name} must be an array of strings")
682
-
683
- normalized: list[str] = []
684
- seen: set[str] = set()
685
- for raw_item in raw_server_names:
686
- if not isinstance(raw_item, str):
687
- raise ValueError(f"{field_name} must be an array of strings")
688
- name = raw_item.strip()
689
- if not name or name in seen:
690
- continue
691
- normalized.append(name)
692
- seen.add(name)
693
- return normalized
694
-
695
-
696
639
  def build_model_retry_policy(
697
640
  raw_retry_policy: object,
698
641
  *,
@@ -775,79 +718,6 @@ def build_model_timeout_ms(
775
718
  return raw_timeout_ms
776
719
 
777
720
 
778
- def build_mcp_transport(
779
- raw_transport: object,
780
- *,
781
- field_name: str = "transport",
782
- ) -> str:
783
- if not isinstance(raw_transport, str):
784
- raise ValueError(f"{field_name} must be a string")
785
- transport = raw_transport.strip().lower()
786
- if transport not in MCP_TRANSPORT_OPTIONS:
787
- raise ValueError(
788
- f"{field_name} must be one of: " + ", ".join(sorted(MCP_TRANSPORT_OPTIONS))
789
- )
790
- return transport
791
-
792
-
793
- def build_mcp_timeout_seconds(
794
- raw_timeout_seconds: object,
795
- *,
796
- field_name: str,
797
- ) -> int:
798
- if isinstance(raw_timeout_seconds, bool) or not isinstance(
799
- raw_timeout_seconds, int
800
- ):
801
- raise ValueError(f"{field_name} must be an integer")
802
- if raw_timeout_seconds <= 0:
803
- raise ValueError(f"{field_name} must be greater than 0")
804
- return raw_timeout_seconds
805
-
806
-
807
- def build_mcp_string_list(
808
- raw_items: object,
809
- *,
810
- field_name: str,
811
- ) -> list[str]:
812
- if not isinstance(raw_items, list):
813
- raise ValueError(f"{field_name} must be an array of strings")
814
- normalized: list[str] = []
815
- seen: set[str] = set()
816
- for raw_item in raw_items:
817
- if not isinstance(raw_item, str):
818
- raise ValueError(f"{field_name} must be an array of strings")
819
- item = raw_item.strip()
820
- if not item or item in seen:
821
- continue
822
- normalized.append(item)
823
- seen.add(item)
824
- return normalized
825
-
826
-
827
- def build_mcp_env_var_names(
828
- raw_items: object,
829
- *,
830
- field_name: str,
831
- ) -> list[str]:
832
- return build_mcp_string_list(raw_items, field_name=field_name)
833
-
834
-
835
- def build_mcp_cwd(
836
- raw_cwd: object,
837
- *,
838
- field_name: str,
839
- base_dir: str | Path | None = None,
840
- ) -> str:
841
- if raw_cwd is None:
842
- return ""
843
- if not isinstance(raw_cwd, str):
844
- raise ValueError(f"{field_name} must be a string")
845
- cwd = raw_cwd.strip()
846
- if not cwd:
847
- return ""
848
- return _normalize_mcp_server_cwd(cwd, base_dir=base_dir)
849
-
850
-
851
721
  def build_provider_headers(
852
722
  raw_headers: object,
853
723
  *,
@@ -1012,31 +882,6 @@ def serialize_provider(provider: ProviderConfig) -> dict[str, object]:
1012
882
  }
1013
883
 
1014
884
 
1015
- def serialize_mcp_server(server: MCPServerConfig) -> dict[str, object]:
1016
- return {
1017
- "name": server.name,
1018
- "transport": server.transport,
1019
- "enabled": server.enabled,
1020
- "required": server.required,
1021
- "startup_timeout_sec": server.startup_timeout_sec,
1022
- "tool_timeout_sec": server.tool_timeout_sec,
1023
- "enabled_tools": list(server.enabled_tools),
1024
- "disabled_tools": list(server.disabled_tools),
1025
- "scopes": list(server.scopes),
1026
- "oauth_resource": server.oauth_resource,
1027
- "launcher": server.launcher,
1028
- "command": server.command,
1029
- "args": list(server.args),
1030
- "env": dict(server.env),
1031
- "env_vars": list(server.env_vars),
1032
- "cwd": server.cwd,
1033
- "url": server.url,
1034
- "bearer_token_env_var": server.bearer_token_env_var,
1035
- "http_headers": dict(server.http_headers),
1036
- "env_http_headers": list(server.env_http_headers),
1037
- }
1038
-
1039
-
1040
885
  def serialize_role(role: RoleConfig) -> dict[str, object]:
1041
886
  return {
1042
887
  "name": role.name,
@@ -1105,9 +950,6 @@ def serialize_settings(
1105
950
  and settings.access.code_salt.strip()
1106
951
  )
1107
952
  }
1108
- data["mcp_servers"] = [
1109
- serialize_mcp_server(server) for server in settings.mcp_servers
1110
- ]
1111
953
  return data
1112
954
 
1113
955
 
@@ -1398,247 +1240,6 @@ def _normalize_required_string(raw_value: object) -> tuple[str, bool]:
1398
1240
  return stripped, stripped != raw_value
1399
1241
 
1400
1242
 
1401
- def _normalize_mcp_mount_list(raw_values: object) -> tuple[list[str], bool]:
1402
- if raw_values is None:
1403
- return [], False
1404
- if not isinstance(raw_values, list):
1405
- return [], True
1406
- normalized: list[str] = []
1407
- seen: set[str] = set()
1408
- migrated = False
1409
- for raw_value in raw_values:
1410
- if not isinstance(raw_value, str):
1411
- migrated = True
1412
- continue
1413
- value = raw_value.strip()
1414
- if not value:
1415
- migrated = True
1416
- continue
1417
- if value in seen:
1418
- migrated = True
1419
- continue
1420
- if value != raw_value:
1421
- migrated = True
1422
- normalized.append(value)
1423
- seen.add(value)
1424
- return normalized, migrated
1425
-
1426
-
1427
- def _normalize_mcp_bool(raw_value: object, *, default: bool) -> tuple[bool, bool]:
1428
- if raw_value is None:
1429
- return default, True
1430
- if not isinstance(raw_value, bool):
1431
- return default, True
1432
- return raw_value, False
1433
-
1434
-
1435
- def _normalize_mcp_timeout(
1436
- raw_value: object,
1437
- *,
1438
- default: int,
1439
- ) -> tuple[int, bool]:
1440
- if raw_value is None:
1441
- return default, True
1442
- try:
1443
- return build_mcp_timeout_seconds(raw_value, field_name="timeout"), False
1444
- except ValueError:
1445
- return default, True
1446
-
1447
-
1448
- def _normalize_mcp_headers(raw_headers: object) -> tuple[dict[str, str], bool]:
1449
- if raw_headers is None:
1450
- return {}, False
1451
- try:
1452
- return build_provider_headers(raw_headers, field_name="headers"), False
1453
- except ValueError:
1454
- return {}, True
1455
-
1456
-
1457
- def _build_mcp_server_config(
1458
- raw_server: object,
1459
- *,
1460
- base_dir: str | Path | None = None,
1461
- ) -> tuple[MCPServerConfig | None, bool]:
1462
- if not isinstance(raw_server, dict):
1463
- return None, True
1464
-
1465
- raw_name = raw_server.get("name", raw_server.get("server_name"))
1466
- if not isinstance(raw_name, str) or not raw_name.strip():
1467
- return None, True
1468
- name = raw_name.strip()
1469
- migrated = name != raw_name or "server_name" in raw_server
1470
-
1471
- raw_transport = raw_server.get("transport", "stdio")
1472
- try:
1473
- transport = build_mcp_transport(raw_transport)
1474
- except ValueError:
1475
- transport = "stdio"
1476
- migrated = True
1477
-
1478
- enabled, enabled_migrated = _normalize_mcp_bool(
1479
- raw_server.get("enabled"),
1480
- default=True,
1481
- )
1482
- required, required_migrated = _normalize_mcp_bool(
1483
- raw_server.get("required"),
1484
- default=False,
1485
- )
1486
- startup_timeout_sec, startup_timeout_migrated = _normalize_mcp_timeout(
1487
- raw_server.get("startup_timeout_sec"),
1488
- default=DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC,
1489
- )
1490
- tool_timeout_sec, tool_timeout_migrated = _normalize_mcp_timeout(
1491
- raw_server.get("tool_timeout_sec"),
1492
- default=DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC,
1493
- )
1494
- enabled_tools, enabled_tools_migrated = _normalize_mcp_mount_list(
1495
- raw_server.get("enabled_tools")
1496
- )
1497
- disabled_tools, disabled_tools_migrated = _normalize_mcp_mount_list(
1498
- raw_server.get("disabled_tools")
1499
- )
1500
- scopes, scopes_migrated = _normalize_mcp_mount_list(raw_server.get("scopes"))
1501
- env_vars, env_vars_migrated = _normalize_mcp_mount_list(raw_server.get("env_vars"))
1502
- env_http_headers, env_http_headers_migrated = _normalize_mcp_mount_list(
1503
- raw_server.get("env_http_headers")
1504
- )
1505
- env, env_migrated = _normalize_mcp_headers(raw_server.get("env"))
1506
- http_headers, http_headers_migrated = _normalize_mcp_headers(
1507
- raw_server.get("http_headers")
1508
- )
1509
-
1510
- raw_args = raw_server.get("args")
1511
- if raw_args is None:
1512
- args: list[str] = []
1513
- args_migrated = False
1514
- else:
1515
- args, args_migrated = _normalize_mcp_mount_list(raw_args)
1516
-
1517
- raw_oauth_resource = raw_server.get("oauth_resource")
1518
- oauth_resource = (
1519
- raw_oauth_resource.strip() if isinstance(raw_oauth_resource, str) else ""
1520
- )
1521
- raw_launcher = raw_server.get("launcher")
1522
- launcher = raw_launcher.strip() if isinstance(raw_launcher, str) else ""
1523
- if isinstance(raw_launcher, str) and launcher != raw_launcher:
1524
- migrated = True
1525
- if raw_launcher not in {None, ""} and not isinstance(raw_launcher, str):
1526
- migrated = True
1527
- raw_command = raw_server.get("command")
1528
- command = raw_command.strip() if isinstance(raw_command, str) else ""
1529
- cwd_raw = raw_server.get("cwd")
1530
- cwd = ""
1531
- if isinstance(cwd_raw, str) and cwd_raw.strip():
1532
- cwd = _normalize_mcp_server_cwd(cwd_raw.strip(), base_dir=base_dir)
1533
- migrated = migrated or cwd != cwd_raw
1534
- elif cwd_raw not in {None, ""}:
1535
- migrated = True
1536
- raw_url = raw_server.get("url")
1537
- url = raw_url.strip() if isinstance(raw_url, str) else ""
1538
- raw_bearer_token_env_var = raw_server.get("bearer_token_env_var")
1539
- bearer_token_env_var = (
1540
- raw_bearer_token_env_var.strip()
1541
- if isinstance(raw_bearer_token_env_var, str)
1542
- else ""
1543
- )
1544
-
1545
- if transport == "stdio":
1546
- if (
1547
- scopes
1548
- or oauth_resource
1549
- or url
1550
- or bearer_token_env_var
1551
- or http_headers
1552
- or env_http_headers
1553
- ):
1554
- migrated = True
1555
- scopes = []
1556
- oauth_resource = ""
1557
- url = ""
1558
- bearer_token_env_var = ""
1559
- http_headers = {}
1560
- env_http_headers = []
1561
- else:
1562
- if command or args or env or env_vars or cwd:
1563
- migrated = True
1564
- command = ""
1565
- args = []
1566
- env = {}
1567
- env_vars = []
1568
- cwd = ""
1569
-
1570
- migrated = (
1571
- migrated
1572
- or enabled_migrated
1573
- or required_migrated
1574
- or startup_timeout_migrated
1575
- or tool_timeout_migrated
1576
- or enabled_tools_migrated
1577
- or disabled_tools_migrated
1578
- or scopes_migrated
1579
- or args_migrated
1580
- or env_migrated
1581
- or env_vars_migrated
1582
- or http_headers_migrated
1583
- or env_http_headers_migrated
1584
- )
1585
-
1586
- return (
1587
- MCPServerConfig(
1588
- name=name,
1589
- transport=transport,
1590
- enabled=enabled,
1591
- required=required,
1592
- startup_timeout_sec=startup_timeout_sec,
1593
- tool_timeout_sec=tool_timeout_sec,
1594
- enabled_tools=enabled_tools,
1595
- disabled_tools=disabled_tools,
1596
- scopes=scopes,
1597
- oauth_resource=oauth_resource,
1598
- launcher=launcher,
1599
- command=command,
1600
- args=args,
1601
- env=env,
1602
- env_vars=env_vars,
1603
- cwd=cwd,
1604
- url=url,
1605
- bearer_token_env_var=bearer_token_env_var,
1606
- http_headers=http_headers,
1607
- env_http_headers=env_http_headers,
1608
- ),
1609
- migrated,
1610
- )
1611
-
1612
-
1613
- def _normalize_mcp_servers(
1614
- raw_servers: object,
1615
- *,
1616
- base_dir: str | Path | None = None,
1617
- ) -> tuple[list[MCPServerConfig], bool]:
1618
- if raw_servers is None:
1619
- return [], False
1620
- if not isinstance(raw_servers, list):
1621
- return [], True
1622
-
1623
- normalized: list[MCPServerConfig] = []
1624
- seen: set[str] = set()
1625
- migrated = False
1626
- for raw_server in raw_servers:
1627
- server, server_migrated = _build_mcp_server_config(
1628
- raw_server,
1629
- base_dir=base_dir,
1630
- )
1631
- migrated = migrated or server_migrated
1632
- if server is None:
1633
- continue
1634
- if server.name in seen:
1635
- migrated = True
1636
- continue
1637
- seen.add(server.name)
1638
- normalized.append(server)
1639
- return normalized, migrated
1640
-
1641
-
1642
1243
  def _build_pending_chat(raw_chat: object) -> tuple[TelegramPendingChat | None, bool]:
1643
1244
  if not isinstance(raw_chat, dict):
1644
1245
  return None, True
@@ -2173,18 +1774,24 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
2173
1774
  included_tools = normalize_tool_names(
2174
1775
  [name for name in included_tools_raw if isinstance(name, str)]
2175
1776
  )
2176
- from flowent.tools import (
2177
- is_assistant_only_mcp_tool_name,
2178
- is_assistant_only_tool_name,
2179
- )
1777
+ from flowent.tools import is_assistant_only_tool_name
2180
1778
 
2181
1779
  filtered_included_tools = [
2182
1780
  tool_name
2183
1781
  for tool_name in included_tools
2184
- if not is_assistant_only_tool_name(tool_name)
2185
- and not is_assistant_only_mcp_tool_name(tool_name)
1782
+ if not tool_name.startswith("mcp__")
1783
+ and not is_assistant_only_tool_name(tool_name)
2186
1784
  ]
2187
1785
  migrated = migrated or filtered_included_tools != included_tools
1786
+ excluded_tools = normalize_tool_names(
1787
+ [name for name in excluded_tools_raw if isinstance(name, str)]
1788
+ )
1789
+ filtered_excluded_tools = [
1790
+ tool_name
1791
+ for tool_name in excluded_tools
1792
+ if not tool_name.startswith("mcp__")
1793
+ ]
1794
+ migrated = migrated or filtered_excluded_tools != excluded_tools
2188
1795
 
2189
1796
  roles.append(
2190
1797
  RoleConfig(
@@ -2194,17 +1801,12 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
2194
1801
  model=role_model,
2195
1802
  model_params=role_model_params,
2196
1803
  included_tools=filtered_included_tools,
2197
- excluded_tools=normalize_tool_names(
2198
- [name for name in excluded_tools_raw if isinstance(name, str)]
2199
- ),
1804
+ excluded_tools=filtered_excluded_tools,
2200
1805
  )
2201
1806
  )
2202
1807
 
2203
- mcp_servers, mcp_servers_migrated = _normalize_mcp_servers(
2204
- data.get("mcp_servers"),
2205
- base_dir=working_dir,
2206
- )
2207
- migrated = migrated or mcp_servers_migrated
1808
+ if "mcp_servers" in data:
1809
+ migrated = True
2208
1810
 
2209
1811
  return (
2210
1812
  Settings(
@@ -2220,7 +1822,6 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
2220
1822
  custom_post_prompt=custom_post_prompt,
2221
1823
  providers=providers,
2222
1824
  roles=roles,
2223
- mcp_servers=mcp_servers,
2224
1825
  ),
2225
1826
  migrated,
2226
1827
  )
@@ -2364,13 +1965,6 @@ def find_role(settings: Settings, role_name: str) -> RoleConfig | None:
2364
1965
  return None
2365
1966
 
2366
1967
 
2367
- def find_mcp_server(settings: Settings, server_name: str) -> MCPServerConfig | None:
2368
- for server in settings.mcp_servers:
2369
- if server.name == server_name:
2370
- return server
2371
- return None
2372
-
2373
-
2374
1968
  def clear_provider_references(settings: Settings, provider_id: str) -> bool:
2375
1969
  changed = False
2376
1970