flowent 0.0.6 → 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
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://github.com/ImFeH2/flowent/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/flowent.svg?style=flat-square&label=License" alt="License" /></a>
9
9
  <a href="https://github.com/ImFeH2/flowent/actions/workflows/ci.yml"><img src="https://github.com/ImFeH2/flowent/workflows/CI/badge.svg" alt="CI" /></a>
10
10
  <a href="https://github.com/ImFeH2/flowent/actions/workflows/release.yml"><img src="https://github.com/ImFeH2/flowent/workflows/Release/badge.svg" alt="Release" /></a>
11
- <a href="https://github.com/ImFeH2/flowent/pkgs/container/flowent"><img src="https://github.com/ImFeH2/flowent/workflows/Publish%20Docker%20image/badge.svg" alt="Docker image" /></a>
11
+ <a href="https://github.com/ImFeH2/flowent/pkgs/container/flowent"><img src="https://github.com/ImFeH2/flowent/workflows/Docker/badge.svg" alt="Docker" /></a>
12
12
  </p>
13
13
 
14
14
  # Flowent
package/backend/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <a href="https://github.com/ImFeH2/flowent/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/flowent.svg?style=flat-square&label=License" alt="License" /></a>
9
9
  <a href="https://github.com/ImFeH2/flowent/actions/workflows/ci.yml"><img src="https://github.com/ImFeH2/flowent/workflows/CI/badge.svg" alt="CI" /></a>
10
10
  <a href="https://github.com/ImFeH2/flowent/actions/workflows/release.yml"><img src="https://github.com/ImFeH2/flowent/workflows/Release/badge.svg" alt="Release" /></a>
11
- <a href="https://github.com/ImFeH2/flowent/pkgs/container/flowent"><img src="https://github.com/ImFeH2/flowent/workflows/Publish%20Docker%20image/badge.svg" alt="Docker image" /></a>
11
+ <a href="https://github.com/ImFeH2/flowent/pkgs/container/flowent"><img src="https://github.com/ImFeH2/flowent/workflows/Docker/badge.svg" alt="Docker" /></a>
12
12
  </p>
13
13
 
14
14
  # Flowent
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "flowent"
3
- version = "0.0.6"
3
+ version = "0.0.7"
4
4
  description = "A workflow orchestration platform for multi-agent collaboration."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
+ import re
4
5
  import threading
5
6
  import time as _time
6
- import traceback
7
7
  import uuid as _uuid
8
8
  from collections.abc import Callable
9
9
  from dataclasses import dataclass, field
@@ -132,7 +132,91 @@ class ResolvedModelSource:
132
132
 
133
133
 
134
134
  def build_error_context(content: str) -> str:
135
- return f"<system>Previous runtime error:\n{content}</system>"
135
+ return (
136
+ f"<system>Previous runtime error:\n{normalize_error_context(content)}</system>"
137
+ )
138
+
139
+
140
+ _RAW_HTML_DOCUMENT_PATTERN = re.compile(
141
+ r"<!doctype\s+html|</?html\b|</?head\b|</?body\b|<title\b",
142
+ re.IGNORECASE,
143
+ )
144
+ _RAW_HTML_FRAGMENT_LINE_PATTERN = re.compile(
145
+ r"^\s*</?(?:div|span|pre|code|p|br|h[1-6]|script|style)\b",
146
+ re.IGNORECASE,
147
+ )
148
+ _ERROR_RESPONSE_TEXT_PATTERN = re.compile(
149
+ r"\b(?:bad gateway|gateway timeout|internal server error|service unavailable|"
150
+ r"not found|forbidden|unauthorized|upstream|exception|runtimeerror|error)\b",
151
+ re.IGNORECASE,
152
+ )
153
+ _TRACEBACK_PATTERN = re.compile(r"(^|\n)\s*traceback\b", re.IGNORECASE)
154
+
155
+
156
+ def contains_raw_error_response(content: str) -> bool:
157
+ if _RAW_HTML_DOCUMENT_PATTERN.search(content):
158
+ return True
159
+ if not _ERROR_RESPONSE_TEXT_PATTERN.search(content):
160
+ return False
161
+ return any(
162
+ _RAW_HTML_FRAGMENT_LINE_PATTERN.search(line) for line in content.splitlines()
163
+ )
164
+
165
+
166
+ def normalize_error_context(content: str) -> str:
167
+ normalized = content.strip()
168
+ if not normalized:
169
+ return "Runtime error"
170
+
171
+ if contains_raw_error_response(normalized):
172
+ return "Upstream returned an unexpected error response"
173
+
174
+ traceback_match = _TRACEBACK_PATTERN.search(normalized)
175
+ if traceback_match is None:
176
+ return normalized
177
+
178
+ prefix = normalized[: traceback_match.start()].strip()
179
+ if prefix:
180
+ return prefix
181
+
182
+ for line in reversed(normalized.splitlines()):
183
+ candidate = line.strip()
184
+ if not candidate:
185
+ continue
186
+ if candidate.lower().startswith("traceback"):
187
+ continue
188
+ if candidate.startswith(("File ", "^")):
189
+ continue
190
+ if candidate.startswith("The above exception") or candidate.startswith(
191
+ "During handling"
192
+ ):
193
+ continue
194
+ return candidate
195
+ return "Runtime error"
196
+
197
+
198
+ def normalize_compacted_execution_context(content: str) -> str:
199
+ normalized = content.strip()
200
+ if not normalized:
201
+ return ""
202
+ if contains_raw_error_response(normalized):
203
+ return "Previous compacted execution context contained an unexpected error response."
204
+
205
+ traceback_match = _TRACEBACK_PATTERN.search(normalized)
206
+ if traceback_match is None:
207
+ return normalized
208
+
209
+ prefix = normalized[: traceback_match.start()].strip()
210
+ if prefix:
211
+ return prefix
212
+ return normalize_error_context(normalized)
213
+
214
+
215
+ def build_runtime_error_summary(exc: Exception) -> str:
216
+ message = str(exc).strip()
217
+ if not message:
218
+ return type(exc).__name__
219
+ return f"{type(exc).__name__}: {message}"
136
220
 
137
221
 
138
222
  class Agent:
@@ -1139,11 +1223,9 @@ class Agent:
1139
1223
  self._interrupt_requested.clear()
1140
1224
  self.set_interrupt_callback(None)
1141
1225
  self._log.exception("Agent error")
1142
- tb_str = traceback.format_exc()
1143
- self._append_history(
1144
- ErrorEntry(content=f"{type(exc).__name__}: {exc}\n\n{tb_str}"),
1145
- )
1146
- self.set_state(AgentState.ERROR, f"{type(exc).__name__}: {exc}")
1226
+ error_summary = build_runtime_error_summary(exc)
1227
+ self._append_history(ErrorEntry(content=error_summary))
1228
+ self.set_state(AgentState.ERROR, error_summary)
1147
1229
  self._wait_for_input()
1148
1230
  if self._terminate.is_set():
1149
1231
  break
@@ -2050,7 +2132,8 @@ class Agent:
2050
2132
  if summary:
2051
2133
  messages.append(
2052
2134
  self._build_runtime_system_message(
2053
- f"Compacted execution context:\n{summary}"
2135
+ "Compacted execution context:\n"
2136
+ f"{normalize_compacted_execution_context(summary)}"
2054
2137
  )
2055
2138
  )
2056
2139
  messages.extend(self._build_history_messages(history_snapshot[history_cutoff:]))
@@ -51,7 +51,6 @@ from flowent.settings import (
51
51
  )
52
52
  from flowent.tools import (
53
53
  MINIMUM_TOOLS,
54
- is_assistant_only_mcp_tool_name,
55
54
  is_assistant_only_tool_name,
56
55
  )
57
56
  from flowent.workspace_store import workspace_store
@@ -117,10 +116,9 @@ def build_tools_for_role(
117
116
  for tool_name in [*MINIMUM_TOOLS, *included_tools, *(requested_tools or [])]:
118
117
  if tool_name in seen_tools:
119
118
  continue
120
- if not assistant_boundary and (
121
- is_assistant_only_tool_name(tool_name)
122
- or is_assistant_only_mcp_tool_name(tool_name)
123
- ):
119
+ if tool_name.startswith("mcp__"):
120
+ continue
121
+ if not assistant_boundary and is_assistant_only_tool_name(tool_name):
124
122
  continue
125
123
  if tool_name in excluded_tools and tool_name not in MINIMUM_TOOLS:
126
124
  continue
@@ -1081,111 +1079,6 @@ def create_tab(
1081
1079
  return tab
1082
1080
 
1083
1081
 
1084
- def duplicate_tab(
1085
- *,
1086
- tab_id: str,
1087
- ) -> tuple[Tab | None, str | None]:
1088
- source_tab = workspace_store.get_tab(tab_id)
1089
- if source_tab is None:
1090
- return None, f"Tab '{tab_id}' not found"
1091
-
1092
- _sync_tab_permissions_from_legacy_leader(source_tab)
1093
- duplicated_definition = WorkflowDefinition.from_mapping(
1094
- source_tab.definition.serialize()
1095
- )
1096
- id_map: dict[str, str] = {}
1097
- duplicated_nodes: list[WorkflowNodeDefinition] = []
1098
-
1099
- for node in duplicated_definition.nodes:
1100
- new_node_id = str(uuid.uuid4())
1101
- id_map[node.id] = new_node_id
1102
- duplicated_node = build_workflow_node_definition(
1103
- node_id=new_node_id,
1104
- node_kind=node.type,
1105
- config=node.config,
1106
- )
1107
- duplicated_nodes.append(duplicated_node)
1108
-
1109
- duplicated_edges = [
1110
- GraphEdge(
1111
- id=str(uuid.uuid4()),
1112
- from_node_id=id_map.get(edge.from_node_id, edge.from_node_id),
1113
- from_port_key=edge.from_port_key,
1114
- to_node_id=id_map.get(edge.to_node_id, edge.to_node_id),
1115
- to_port_key=edge.to_port_key,
1116
- kind=edge.kind,
1117
- )
1118
- for edge in duplicated_definition.edges
1119
- ]
1120
- duplicated_view_positions = {
1121
- id_map.get(node_id, node_id): position
1122
- for node_id, position in duplicated_definition.view.positions.items()
1123
- if id_map.get(node_id, node_id) in id_map.values()
1124
- }
1125
-
1126
- settings = settings_module.get_settings()
1127
- new_tab = Tab(
1128
- id=str(uuid.uuid4()),
1129
- title=f"{source_tab.title} Copy",
1130
- leader_id=str(uuid.uuid4()),
1131
- allow_network=source_tab.allow_network,
1132
- write_dirs=list(source_tab.write_dirs),
1133
- permissions_initialized=True,
1134
- definition=WorkflowDefinition(
1135
- version=duplicated_definition.version,
1136
- nodes=duplicated_nodes,
1137
- edges=duplicated_edges,
1138
- view=duplicated_definition.view.__class__(
1139
- positions=duplicated_view_positions
1140
- ),
1141
- ),
1142
- )
1143
- assert new_tab.leader_id is not None
1144
- workspace_store.upsert_tab(new_tab)
1145
- workspace_store.upsert_node_record(
1146
- _build_leader_record(
1147
- tab_id=new_tab.id,
1148
- leader_id=new_tab.leader_id,
1149
- settings=settings,
1150
- )
1151
- )
1152
-
1153
- for node in source_tab.definition.nodes:
1154
- if node.type != WorkflowNodeKind.AGENT:
1155
- continue
1156
- duplicated_node_id = id_map.get(node.id)
1157
- if duplicated_node_id is None:
1158
- continue
1159
- config, error = build_node_config(
1160
- role_name=str(node.config.get("role_name", "")),
1161
- tab_id=new_tab.id,
1162
- name=str(node.config["name"])
1163
- if isinstance(node.config.get("name"), str)
1164
- else None,
1165
- )
1166
- if error is not None or config is None:
1167
- return None, error or "Failed to duplicate workflow"
1168
- workspace_store.upsert_node_record(
1169
- GraphNodeRecord(
1170
- id=duplicated_node_id,
1171
- config=config,
1172
- state=AgentState.INITIALIZING,
1173
- position=duplicated_view_positions.get(duplicated_node_id),
1174
- )
1175
- )
1176
-
1177
- if registry.get_all():
1178
- _start_tab_runtime(new_tab.id)
1179
- event_bus.emit(
1180
- Event(
1181
- type=EventType.TAB_CREATED,
1182
- agent_id="assistant",
1183
- data=serialize_tab_summary(new_tab),
1184
- )
1185
- )
1186
- return new_tab, None
1187
-
1188
-
1189
1082
  def _is_path_within_boundary(path: str, boundary_dirs: list[str]) -> bool:
1190
1083
  resolved_path = resolve_path(path)
1191
1084
  return any(
@@ -67,10 +67,7 @@ def resolve_role_tool_config(
67
67
  included_tools: list[str] | None,
68
68
  excluded_tools: list[str] | None,
69
69
  ) -> tuple[list[str], list[str]]:
70
- from flowent.tools import (
71
- is_assistant_only_mcp_tool_name,
72
- is_assistant_only_tool_name,
73
- )
70
+ from flowent.tools import is_assistant_only_tool_name
74
71
 
75
72
  next_included = normalize_tool_names(
76
73
  included_tools
@@ -83,8 +80,8 @@ def resolve_role_tool_config(
83
80
  next_included = [
84
81
  tool_name
85
82
  for tool_name in next_included
86
- if not is_assistant_only_tool_name(tool_name)
87
- and not is_assistant_only_mcp_tool_name(tool_name)
83
+ if not tool_name.startswith("mcp__")
84
+ and not is_assistant_only_tool_name(tool_name)
88
85
  ]
89
86
  next_excluded = normalize_tool_names(
90
87
  excluded_tools
@@ -93,6 +90,12 @@ def resolve_role_tool_config(
93
90
  if current
94
91
  else []
95
92
  )
93
+ if excluded_tools is not None:
94
+ next_excluded = [
95
+ tool_name
96
+ for tool_name in next_excluded
97
+ if not tool_name.startswith("mcp__")
98
+ ]
96
99
  validate_role_tool_config(next_included, next_excluded)
97
100
  return next_included, next_excluded
98
101
 
@@ -3,7 +3,6 @@ from fastapi import APIRouter
3
3
  from flowent.routes.access import router as access_router
4
4
  from flowent.routes.assistant import router as assistant_router
5
5
  from flowent.routes.image_assets import router as image_assets_router
6
- from flowent.routes.mcp import router as mcp_router
7
6
  from flowent.routes.meta import router as meta_router
8
7
  from flowent.routes.nodes import router as nodes_router
9
8
  from flowent.routes.prompts import router as prompts_router
@@ -18,7 +17,6 @@ router.include_router(access_router)
18
17
  router.include_router(nodes_router)
19
18
  router.include_router(assistant_router)
20
19
  router.include_router(image_assets_router)
21
- router.include_router(mcp_router)
22
20
  router.include_router(roles_router)
23
21
  router.include_router(providers_router)
24
22
  router.include_router(prompts_router)
@@ -12,6 +12,7 @@ from flowent.assistant_commands import (
12
12
  )
13
13
  from flowent.image_assets import require_image_asset
14
14
  from flowent.models import (
15
+ AgentState,
15
16
  Message,
16
17
  content_parts_to_text,
17
18
  has_image_parts,
@@ -90,6 +91,8 @@ async def send_assistant_message(req: AssistantMessageRequest) -> dict:
90
91
  assistant = _get_assistant()
91
92
  if assistant is None:
92
93
  raise HTTPException(status_code=404, detail="Assistant not found")
94
+ if assistant.state == AgentState.TERMINATED:
95
+ raise HTTPException(status_code=409, detail="Assistant is no longer available")
93
96
 
94
97
  try:
95
98
  parts = _parse_request_parts(req)
@@ -344,7 +344,12 @@ async def clear_node_chat(node_id: str) -> dict:
344
344
  @router.post("/api/nodes/{node_id}/messages")
345
345
  async def dispatch_node_message(node_id: str, req: DispatchNodeMessageRequest) -> dict:
346
346
  from flowent.graph_service import dispatch_node_message
347
- from flowent.models import NodeType, content_parts_to_text, has_image_parts
347
+ from flowent.models import (
348
+ AgentState,
349
+ NodeType,
350
+ content_parts_to_text,
351
+ has_image_parts,
352
+ )
348
353
  from flowent.models import TextPart as ModelTextPart
349
354
 
350
355
  node = registry.get(node_id)
@@ -367,6 +372,11 @@ async def dispatch_node_message(node_id: str, req: DispatchNodeMessageRequest) -
367
372
  status_code=400,
368
373
  detail="Human input can only target Assistant or a Workflow Leader",
369
374
  )
375
+ if node.state == AgentState.TERMINATED:
376
+ raise HTTPException(
377
+ status_code=409,
378
+ detail="This workflow chat is no longer available",
379
+ )
370
380
 
371
381
  try:
372
382
  parts = _parse_dispatch_parts(req)