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.
- package/README.md +1 -1
- package/backend/README.md +1 -1
- package/backend/pyproject.toml +1 -1
- package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/_version.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/access.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/assistant_commands.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/cli.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/config.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/events.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/graph_runtime.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/graph_service.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/image_assets.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/logging.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/main.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/model_metadata.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/network.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/observability_service.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/registry.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/role_management.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/runtime.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/security.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/settings.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/settings_management.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/state_db.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/workspace_store.cpython-313.pyc +0 -0
- package/backend/src/flowent/agent.py +91 -8
- package/backend/src/flowent/channels/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/channels/__pycache__/telegram.cpython-313.pyc +0 -0
- package/backend/src/flowent/graph_service.py +3 -110
- package/backend/src/flowent/models/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/agent.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/base.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/blueprint.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/content.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/delta.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/event.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/graph.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/history.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/llm.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/message.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/tab.cpython-313.pyc +0 -0
- package/backend/src/flowent/models/__pycache__/todo.cpython-313.pyc +0 -0
- package/backend/src/flowent/prompts/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/prompts/__pycache__/common.cpython-313.pyc +0 -0
- package/backend/src/flowent/prompts/__pycache__/steward.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/anthropic.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/base_url.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/configuration.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/content.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/errors.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/gateway.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/headers.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/management.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/openai.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/openai_responses.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/registry.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/sse.cpython-313.pyc +0 -0
- package/backend/src/flowent/providers/__pycache__/thinking.cpython-313.pyc +0 -0
- package/backend/src/flowent/role_management.py +9 -6
- package/backend/src/flowent/routes/__init__.py +0 -2
- package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/assistant.py +3 -0
- package/backend/src/flowent/routes/nodes.py +11 -1
- package/backend/src/flowent/routes/settings.py +169 -118
- package/backend/src/flowent/routes/tabs.py +0 -12
- package/backend/src/flowent/runtime.py +0 -5
- package/backend/src/flowent/security.py +1 -21
- package/backend/src/flowent/settings.py +15 -421
- package/backend/src/flowent/settings_management.py +260 -164
- package/backend/src/flowent/state_db.py +2 -14
- package/backend/src/flowent/static/assets/AssistantPage-BW7XAd9I.js +1 -0
- package/backend/src/flowent/static/assets/ChannelsPage-tCJHgt6m.js +1 -0
- package/backend/src/flowent/static/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
- package/backend/src/flowent/static/assets/PromptsPage-C3Sxn2D7.js +1 -0
- package/backend/src/flowent/static/assets/ProvidersPage-BfmdXmNt.js +3 -0
- package/backend/src/flowent/static/assets/RolesPage-DET8wO4r.js +1 -0
- package/backend/src/flowent/static/assets/SettingsPage-D-g3deMm.js +3 -0
- package/backend/src/flowent/static/assets/ToolsPage-CDmtE2g4.js +1 -0
- package/backend/src/flowent/static/assets/WorkspacePage-AZsJ0sD0.js +3 -0
- package/backend/src/flowent/static/assets/WorkspacePanels-CteCjolX.js +1 -0
- package/backend/src/flowent/static/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
- package/backend/src/flowent/static/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
- package/backend/src/flowent/static/assets/index--o_0fv0N.css +1 -0
- package/backend/src/flowent/static/assets/index-C9HuekJm.js +10 -0
- package/backend/src/flowent/static/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
- package/backend/src/flowent/static/assets/providerTypes-DT3Ahwl_.js +1 -0
- package/backend/src/flowent/static/assets/roles-CuRT_chR.js +1 -0
- package/{dist/frontend/assets/select-D9SwnlXF.js → backend/src/flowent/static/assets/select-DCfeNu-F.js} +1 -1
- package/backend/src/flowent/static/assets/surface-pWwG5ogx.js +1 -0
- package/backend/src/flowent/static/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
- package/backend/src/flowent/static/assets/useAppRoute-FgSHBKhV.js +1 -0
- package/backend/src/flowent/static/index.html +3 -3
- package/backend/src/flowent/tools/__init__.py +2 -101
- package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/list_roles.py +2 -9
- package/backend/src/flowent/tools/manage_settings.py +134 -172
- package/backend/tests/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/test_assistant_api.py +68 -0
- package/backend/tests/integration/api/test_meta_api.py +0 -1
- package/backend/tests/integration/api/test_nodes_api.py +73 -8
- package/backend/tests/integration/api/test_tabs_api.py +0 -114
- package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/test_agent_public_api.py +0 -15
- package/backend/tests/unit/agent/test_agent_runtime.py +148 -2
- package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/prompts/__pycache__/test_prompts.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_anthropic_provider.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_errors.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_extract_delta_parts.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_openai_provider.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_openai_responses.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_provider_gateway.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/providers/__pycache__/test_think_tag_parser.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/test_prompts_routes.py +0 -22
- package/backend/tests/unit/routes/test_roles_routes.py +6 -2
- package/backend/tests/unit/routes/test_settings_routes.py +0 -19
- package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/security/__pycache__/test_security.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/settings/__pycache__/test_settings_roles.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/settings/test_settings_roles.py +3 -51
- package/backend/tests/unit/test_cli.py +0 -22
- package/backend/tests/unit/test_state_sqlite_storage.py +27 -99
- package/backend/tests/unit/test_workspace_store.py +0 -3
- package/backend/tests/unit/tools/__pycache__/test_connect_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_create_agent_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_delete_tab_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_edit_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_exec_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_fetch_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_manage_prompts_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_manage_providers_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_manage_roles_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_manage_settings_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_read_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_set_permissions_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_todo_tool.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/__pycache__/test_tool_registry.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/tools/test_create_agent_tool.py +0 -32
- package/backend/tests/unit/tools/test_manage_prompts_tool.py +5 -30
- package/backend/tests/unit/tools/test_tool_registry.py +45 -40
- package/backend/uv.lock +1 -1
- package/dist/frontend/assets/AssistantPage-BW7XAd9I.js +1 -0
- package/dist/frontend/assets/ChannelsPage-tCJHgt6m.js +1 -0
- package/dist/frontend/assets/{PageScaffold-DteOA8V7.js → PageScaffold-f6g2l7XN.js} +1 -1
- package/dist/frontend/assets/PromptsPage-C3Sxn2D7.js +1 -0
- package/dist/frontend/assets/ProvidersPage-BfmdXmNt.js +3 -0
- package/dist/frontend/assets/RolesPage-DET8wO4r.js +1 -0
- package/dist/frontend/assets/SettingsPage-D-g3deMm.js +3 -0
- package/dist/frontend/assets/ToolsPage-CDmtE2g4.js +1 -0
- package/dist/frontend/assets/WorkspacePage-AZsJ0sD0.js +3 -0
- package/dist/frontend/assets/WorkspacePanels-CteCjolX.js +1 -0
- package/dist/frontend/assets/{alert-dialog-DIBUCmqM.js → alert-dialog-Duorp_S-.js} +1 -1
- package/dist/frontend/assets/{dialog-BOvHIBrg.js → dialog-C3ixjGjN.js} +1 -1
- package/dist/frontend/assets/index--o_0fv0N.css +1 -0
- package/dist/frontend/assets/index-C9HuekJm.js +10 -0
- package/dist/frontend/assets/{modelParams-DcEhGnu0.js → modelParams-DmnF2hwR.js} +1 -1
- package/dist/frontend/assets/providerTypes-DT3Ahwl_.js +1 -0
- package/dist/frontend/assets/roles-CuRT_chR.js +1 -0
- package/{backend/src/flowent/static/assets/select-D9SwnlXF.js → dist/frontend/assets/select-DCfeNu-F.js} +1 -1
- package/dist/frontend/assets/surface-pWwG5ogx.js +1 -0
- package/dist/frontend/assets/{ui-vendor-UazN8rcv.js → ui-vendor-C5pJa8N7.js} +15 -15
- package/dist/frontend/assets/useAppRoute-FgSHBKhV.js +1 -0
- package/dist/frontend/index.html +3 -3
- package/package.json +1 -1
- package/backend/src/flowent/__pycache__/mcp_service.cpython-313.pyc +0 -0
- package/backend/src/flowent/mcp_service.py +0 -1918
- package/backend/src/flowent/routes/__pycache__/mcp.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/mcp.py +0 -125
- package/backend/src/flowent/static/assets/AssistantPage-VBohhz4d.js +0 -1
- package/backend/src/flowent/static/assets/ChannelsPage-CIydPZA_.js +0 -1
- package/backend/src/flowent/static/assets/McpPage-CHPm2TPY.js +0 -7
- package/backend/src/flowent/static/assets/PromptsPage-CSmJ3sZg.js +0 -1
- package/backend/src/flowent/static/assets/ProvidersPage-sl2jeG4e.js +0 -3
- package/backend/src/flowent/static/assets/RolesPage-DCe7W6Km.js +0 -1
- package/backend/src/flowent/static/assets/SettingsPage-Bix9e63E.js +0 -3
- package/backend/src/flowent/static/assets/ToolsPage-favNkj5C.js +0 -1
- package/backend/src/flowent/static/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
- package/backend/src/flowent/static/assets/WorkspacePage-KuaDjt_D.js +0 -3
- package/backend/src/flowent/static/assets/WorkspacePanels-BZxBw8M5.js +0 -1
- package/backend/src/flowent/static/assets/datetime-eJqd0V2S.js +0 -1
- package/backend/src/flowent/static/assets/index-Biio-CoI.js +0 -10
- package/backend/src/flowent/static/assets/index-CmQvO7sl.css +0 -1
- package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +0 -1
- package/backend/src/flowent/static/assets/surface-Bzr1FRG4.js +0 -1
- package/backend/src/flowent/static/assets/triState-DgLlKdRR.js +0 -1
- package/backend/src/flowent/tools/__pycache__/mcp.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/mcp.py +0 -199
- package/backend/tests/integration/api/__pycache__/test_mcp_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/test_mcp_api.py +0 -116
- package/dist/frontend/assets/AssistantPage-VBohhz4d.js +0 -1
- package/dist/frontend/assets/ChannelsPage-CIydPZA_.js +0 -1
- package/dist/frontend/assets/McpPage-CHPm2TPY.js +0 -7
- package/dist/frontend/assets/PromptsPage-CSmJ3sZg.js +0 -1
- package/dist/frontend/assets/ProvidersPage-sl2jeG4e.js +0 -3
- package/dist/frontend/assets/RolesPage-DCe7W6Km.js +0 -1
- package/dist/frontend/assets/SettingsPage-Bix9e63E.js +0 -3
- package/dist/frontend/assets/ToolsPage-favNkj5C.js +0 -1
- package/dist/frontend/assets/WorkspaceCommandDialog-DRS6wiD6.js +0 -1
- package/dist/frontend/assets/WorkspacePage-KuaDjt_D.js +0 -3
- package/dist/frontend/assets/WorkspacePanels-BZxBw8M5.js +0 -1
- package/dist/frontend/assets/datetime-eJqd0V2S.js +0 -1
- package/dist/frontend/assets/index-Biio-CoI.js +0 -10
- package/dist/frontend/assets/index-CmQvO7sl.css +0 -1
- package/dist/frontend/assets/roles-BbIEIMeG.js +0 -1
- package/dist/frontend/assets/surface-Bzr1FRG4.js +0 -1
- 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/
|
|
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/
|
|
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/pyproject.toml
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
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
|
-
|
|
1143
|
-
self._append_history(
|
|
1144
|
-
|
|
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
|
-
|
|
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:]))
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
121
|
-
|
|
122
|
-
|
|
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(
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
87
|
-
and not
|
|
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)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
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)
|