flowent 0.0.4 → 0.0.6
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 +74 -0
- package/backend/pyproject.toml +2 -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__/mcp_service.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__/{stats_service.cpython-313.pyc → 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 +364 -52
- package/backend/src/flowent/assistant_commands.py +31 -22
- 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/channels/telegram.py +4 -4
- package/backend/src/flowent/graph_service.py +1307 -145
- package/backend/src/flowent/mcp_service.py +21 -7
- package/backend/src/flowent/model_metadata.py +4 -0
- package/backend/src/flowent/models/__init__.py +6 -2
- 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/models/agent.py +1 -0
- package/backend/src/flowent/models/graph.py +44 -9
- package/backend/src/flowent/models/history.py +73 -15
- package/backend/src/flowent/models/llm.py +1 -0
- package/backend/src/flowent/models/message.py +6 -0
- package/backend/src/flowent/models/tab.py +38 -1
- package/backend/src/flowent/{stats_service.py → observability_service.py} +4 -4
- 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/prompts/common.py +2 -2
- package/backend/src/flowent/prompts/steward.py +2 -2
- 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/providers/configuration.py +7 -0
- package/backend/src/flowent/role_management.py +12 -0
- 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__/mcp.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 +4 -4
- package/backend/src/flowent/routes/nodes.py +54 -6
- package/backend/src/flowent/routes/providers_route.py +1 -0
- package/backend/src/flowent/routes/roles.py +1 -1
- package/backend/src/flowent/routes/settings.py +4 -0
- package/backend/src/flowent/routes/tabs.py +29 -11
- package/backend/src/flowent/runtime.py +7 -30
- package/backend/src/flowent/security.py +23 -8
- package/backend/src/flowent/settings.py +56 -5
- package/backend/src/flowent/settings_management.py +12 -0
- package/backend/src/flowent/static/assets/AssistantPage-VBohhz4d.js +1 -0
- package/backend/src/flowent/static/assets/ChannelsPage-CIydPZA_.js +1 -0
- package/backend/src/flowent/static/assets/McpPage-CHPm2TPY.js +7 -0
- package/backend/src/flowent/static/assets/PageScaffold-DteOA8V7.js +1 -0
- package/backend/src/flowent/static/assets/PromptsPage-CSmJ3sZg.js +1 -0
- package/backend/src/flowent/static/assets/ProvidersPage-sl2jeG4e.js +3 -0
- package/backend/src/flowent/static/assets/RolesPage-DCe7W6Km.js +1 -0
- package/backend/src/flowent/static/assets/SettingsPage-Bix9e63E.js +3 -0
- package/backend/src/flowent/static/assets/ToolsPage-favNkj5C.js +1 -0
- package/backend/src/flowent/static/assets/WorkspaceCommandDialog-DRS6wiD6.js +1 -0
- package/backend/src/flowent/static/assets/WorkspacePage-KuaDjt_D.js +3 -0
- package/backend/src/flowent/static/assets/WorkspacePanels-BZxBw8M5.js +1 -0
- package/backend/src/flowent/static/assets/alert-dialog-DIBUCmqM.js +1 -0
- package/backend/src/flowent/static/assets/{dialog-BeGSweF6.js → dialog-BOvHIBrg.js} +1 -1
- package/backend/src/flowent/static/assets/index-Biio-CoI.js +10 -0
- package/backend/src/flowent/static/assets/index-CmQvO7sl.css +1 -0
- package/backend/src/flowent/static/assets/modelParams-DcEhGnu0.js +1 -0
- package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +1 -0
- package/backend/src/flowent/static/assets/select-D9SwnlXF.js +1 -0
- package/backend/src/flowent/static/assets/surface-Bzr1FRG4.js +1 -0
- package/backend/src/flowent/static/assets/{ui-vendor-Dg9NNnWX.js → ui-vendor-UazN8rcv.js} +15 -15
- package/backend/src/flowent/static/index.html +3 -4
- package/backend/src/flowent/tools/__init__.py +76 -2
- 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__/mcp.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/connect.py +10 -66
- package/backend/src/flowent/tools/contacts.py +1 -1
- package/backend/src/flowent/tools/create_agent.py +9 -88
- package/backend/src/flowent/tools/create_tab.py +7 -5
- package/backend/src/flowent/tools/exec.py +3 -2
- package/backend/src/flowent/tools/list_roles.py +29 -4
- package/backend/src/flowent/tools/list_tabs.py +4 -0
- package/backend/src/flowent/tools/list_tools.py +5 -1
- package/backend/src/flowent/tools/manage_settings.py +18 -0
- package/backend/src/flowent/tools/send.py +21 -3
- package/backend/src/flowent/tools/set_permissions.py +21 -6
- 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_mcp_api.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 +1 -1
- package/backend/tests/integration/api/test_nodes_api.py +257 -21
- package/backend/tests/integration/api/test_roles_api.py +3 -2
- package/backend/tests/integration/api/test_tabs_api.py +312 -11
- 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 +162 -71
- package/backend/tests/unit/agent/test_agent_runtime.py +285 -69
- 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/prompts/test_prompts.py +3 -2
- 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_providers_route.py +2 -0
- package/backend/tests/unit/routes/test_roles_routes.py +109 -0
- package/backend/tests/unit/routes/test_settings_routes.py +4 -0
- package/backend/tests/unit/runtime/__pycache__/test_bootstrap_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/runtime/test_bootstrap_runtime.py +8 -18
- 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/security/test_security.py +16 -2
- 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 +40 -0
- package/backend/tests/unit/test_state_sqlite_storage.py +67 -1
- 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_connect_tool.py +2 -3
- package/backend/tests/unit/tools/test_create_agent_tool.py +9 -97
- package/backend/tests/unit/tools/test_delete_tab_tool.py +33 -0
- package/backend/tests/unit/tools/test_manage_providers_tool.py +2 -0
- package/backend/tests/unit/tools/test_manage_settings_tool.py +3 -0
- package/backend/tests/unit/tools/test_set_permissions_tool.py +216 -12
- package/backend/tests/unit/tools/test_tool_registry.py +103 -0
- package/backend/uv.lock +1 -1
- package/dist/frontend/assets/AssistantPage-VBohhz4d.js +1 -0
- package/dist/frontend/assets/ChannelsPage-CIydPZA_.js +1 -0
- package/dist/frontend/assets/McpPage-CHPm2TPY.js +7 -0
- package/dist/frontend/assets/PageScaffold-DteOA8V7.js +1 -0
- package/dist/frontend/assets/PromptsPage-CSmJ3sZg.js +1 -0
- package/dist/frontend/assets/ProvidersPage-sl2jeG4e.js +3 -0
- package/dist/frontend/assets/RolesPage-DCe7W6Km.js +1 -0
- package/dist/frontend/assets/SettingsPage-Bix9e63E.js +3 -0
- package/dist/frontend/assets/ToolsPage-favNkj5C.js +1 -0
- package/dist/frontend/assets/WorkspaceCommandDialog-DRS6wiD6.js +1 -0
- package/dist/frontend/assets/WorkspacePage-KuaDjt_D.js +3 -0
- package/dist/frontend/assets/WorkspacePanels-BZxBw8M5.js +1 -0
- package/dist/frontend/assets/alert-dialog-DIBUCmqM.js +1 -0
- package/dist/frontend/assets/{dialog-BeGSweF6.js → dialog-BOvHIBrg.js} +1 -1
- package/dist/frontend/assets/index-Biio-CoI.js +10 -0
- package/dist/frontend/assets/index-CmQvO7sl.css +1 -0
- package/dist/frontend/assets/modelParams-DcEhGnu0.js +1 -0
- package/dist/frontend/assets/roles-BbIEIMeG.js +1 -0
- package/dist/frontend/assets/select-D9SwnlXF.js +1 -0
- package/dist/frontend/assets/surface-Bzr1FRG4.js +1 -0
- package/dist/frontend/assets/{ui-vendor-Dg9NNnWX.js → ui-vendor-UazN8rcv.js} +15 -15
- package/dist/frontend/index.html +3 -4
- package/package.json +3 -3
- package/backend/src/flowent/routes/__pycache__/stats.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/stats.py +0 -229
- package/backend/src/flowent/static/assets/AssistantPage-B3Xc08AS.js +0 -1
- package/backend/src/flowent/static/assets/ChannelsPage-ByLd28xk.js +0 -1
- package/backend/src/flowent/static/assets/HomePage-C0hAx9_l.js +0 -3
- package/backend/src/flowent/static/assets/McpPage-DkrYLvBv.js +0 -7
- package/backend/src/flowent/static/assets/PageScaffold-D4jO9ooX.js +0 -1
- package/backend/src/flowent/static/assets/PromptsPage-DWA7rRJd.js +0 -1
- package/backend/src/flowent/static/assets/ProvidersPage-PUWT8seJ.js +0 -3
- package/backend/src/flowent/static/assets/RolesPage-CqcclGRw.js +0 -1
- package/backend/src/flowent/static/assets/SettingsPage-8tS2cJgX.js +0 -3
- package/backend/src/flowent/static/assets/StatsPage-BX9khYzu.js +0 -1
- package/backend/src/flowent/static/assets/ToolsPage-9Tl9FdeD.js +0 -1
- package/backend/src/flowent/static/assets/WorkspaceCommandDialog-CCXxjDL8.js +0 -1
- package/backend/src/flowent/static/assets/WorkspacePanels-aMdJ7ZH7.js +0 -1
- package/backend/src/flowent/static/assets/alert-dialog-kFYVQ7oX.js +0 -1
- package/backend/src/flowent/static/assets/badge-74-3jsCg.js +0 -1
- package/backend/src/flowent/static/assets/constants-XUzFf6i1.js +0 -1
- package/backend/src/flowent/static/assets/index-BHC1Vhy8.css +0 -1
- package/backend/src/flowent/static/assets/index-CL1ALZ3r.js +0 -10
- package/backend/src/flowent/static/assets/modelParams-CaHd0903.js +0 -1
- package/backend/src/flowent/static/assets/roles-2OLDeTc5.js +0 -1
- package/backend/src/flowent/static/assets/select-DL_LPeDj.js +0 -1
- package/backend/src/flowent/static/assets/shared-CMxbpLeQ.js +0 -1
- package/backend/tests/unit/routes/__pycache__/test_stats_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/test_stats_routes.py +0 -149
- package/dist/frontend/assets/AssistantPage-B3Xc08AS.js +0 -1
- package/dist/frontend/assets/ChannelsPage-ByLd28xk.js +0 -1
- package/dist/frontend/assets/HomePage-C0hAx9_l.js +0 -3
- package/dist/frontend/assets/McpPage-DkrYLvBv.js +0 -7
- package/dist/frontend/assets/PageScaffold-D4jO9ooX.js +0 -1
- package/dist/frontend/assets/PromptsPage-DWA7rRJd.js +0 -1
- package/dist/frontend/assets/ProvidersPage-PUWT8seJ.js +0 -3
- package/dist/frontend/assets/RolesPage-CqcclGRw.js +0 -1
- package/dist/frontend/assets/SettingsPage-8tS2cJgX.js +0 -3
- package/dist/frontend/assets/StatsPage-BX9khYzu.js +0 -1
- package/dist/frontend/assets/ToolsPage-9Tl9FdeD.js +0 -1
- package/dist/frontend/assets/WorkspaceCommandDialog-CCXxjDL8.js +0 -1
- package/dist/frontend/assets/WorkspacePanels-aMdJ7ZH7.js +0 -1
- package/dist/frontend/assets/alert-dialog-kFYVQ7oX.js +0 -1
- package/dist/frontend/assets/badge-74-3jsCg.js +0 -1
- package/dist/frontend/assets/constants-XUzFf6i1.js +0 -1
- package/dist/frontend/assets/index-BHC1Vhy8.css +0 -1
- package/dist/frontend/assets/index-CL1ALZ3r.js +0 -10
- package/dist/frontend/assets/modelParams-CaHd0903.js +0 -1
- package/dist/frontend/assets/roles-2OLDeTc5.js +0 -1
- package/dist/frontend/assets/select-DL_LPeDj.js +0 -1
- package/dist/frontend/assets/shared-CMxbpLeQ.js +0 -1
- /package/backend/src/flowent/static/assets/{datetime-m6_O_Ci9.js → datetime-eJqd0V2S.js} +0 -0
- /package/backend/src/flowent/static/assets/{markdown-vendor-DVdy_w12.js → markdown-vendor-C9RtvaJh.js} +0 -0
- /package/backend/src/flowent/static/assets/{triState-DEr3NkXV.js → triState-DgLlKdRR.js} +0 -0
- /package/dist/frontend/assets/{datetime-m6_O_Ci9.js → datetime-eJqd0V2S.js} +0 -0
- /package/dist/frontend/assets/{markdown-vendor-DVdy_w12.js → markdown-vendor-C9RtvaJh.js} +0 -0
- /package/dist/frontend/assets/{triState-DEr3NkXV.js → triState-DgLlKdRR.js} +0 -0
|
@@ -2,15 +2,20 @@ import json
|
|
|
2
2
|
import threading
|
|
3
3
|
|
|
4
4
|
from flowent.agent import Agent
|
|
5
|
+
from flowent.graph_service import build_workflow_node_definition, create_edge
|
|
5
6
|
from flowent.models import (
|
|
6
7
|
AgentState,
|
|
7
8
|
Message,
|
|
8
9
|
NodeConfig,
|
|
9
10
|
NodeType,
|
|
11
|
+
PortDirection,
|
|
12
|
+
PortType,
|
|
10
13
|
ReceivedMessage,
|
|
11
|
-
StateEntry,
|
|
12
14
|
Tab,
|
|
13
15
|
TodoItem,
|
|
16
|
+
WorkflowDefinition,
|
|
17
|
+
WorkflowNodeKind,
|
|
18
|
+
WorkflowPort,
|
|
14
19
|
)
|
|
15
20
|
from flowent.registry import registry
|
|
16
21
|
from flowent.settings import RoleConfig, Settings
|
|
@@ -179,26 +184,14 @@ def test_request_interrupt_ignores_idle_agent():
|
|
|
179
184
|
assert not agent._interrupt_requested.is_set()
|
|
180
185
|
|
|
181
186
|
|
|
182
|
-
def
|
|
187
|
+
def test_state_changes_update_current_state_without_history_entries():
|
|
183
188
|
agent = Agent(NodeConfig(node_type=NodeType.AGENT), uuid="agent-a")
|
|
184
189
|
|
|
185
190
|
agent.set_state(AgentState.RUNNING, "processing")
|
|
186
191
|
agent.set_state(AgentState.IDLE, "completed")
|
|
187
192
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
]
|
|
191
|
-
|
|
192
|
-
assert [entry.state for entry in state_entries] == [
|
|
193
|
-
"initializing",
|
|
194
|
-
"running",
|
|
195
|
-
"idle",
|
|
196
|
-
]
|
|
197
|
-
assert [entry.reason for entry in state_entries] == [
|
|
198
|
-
"created",
|
|
199
|
-
"processing",
|
|
200
|
-
"completed",
|
|
201
|
-
]
|
|
193
|
+
assert agent.state == AgentState.IDLE
|
|
194
|
+
assert agent.get_history_snapshot() == []
|
|
202
195
|
|
|
203
196
|
|
|
204
197
|
def test_contacts_tool_uses_agent_public_api(monkeypatch):
|
|
@@ -223,10 +216,28 @@ def test_contacts_tool_uses_agent_public_api(monkeypatch):
|
|
|
223
216
|
assert result == {"contacts": expected}
|
|
224
217
|
|
|
225
218
|
|
|
226
|
-
def
|
|
219
|
+
def test_agent_get_contacts_info_is_empty_without_output_paths():
|
|
227
220
|
registry.reset()
|
|
228
221
|
workspace_store.reset_cache()
|
|
229
|
-
workspace_store.upsert_tab(
|
|
222
|
+
workspace_store.upsert_tab(
|
|
223
|
+
Tab(
|
|
224
|
+
id="tab-1",
|
|
225
|
+
title="Task",
|
|
226
|
+
leader_id="leader-a",
|
|
227
|
+
definition=WorkflowDefinition(
|
|
228
|
+
nodes=[
|
|
229
|
+
build_workflow_node_definition(
|
|
230
|
+
node_id="agent-a",
|
|
231
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
232
|
+
),
|
|
233
|
+
build_workflow_node_definition(
|
|
234
|
+
node_id="agent-b",
|
|
235
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
236
|
+
),
|
|
237
|
+
]
|
|
238
|
+
),
|
|
239
|
+
)
|
|
240
|
+
)
|
|
230
241
|
leader = Agent(
|
|
231
242
|
NodeConfig(
|
|
232
243
|
node_type=NodeType.AGENT,
|
|
@@ -260,25 +271,50 @@ def test_agent_get_contacts_info_keeps_only_leader_for_regular_agents():
|
|
|
260
271
|
agent.add_connection(peer.uuid)
|
|
261
272
|
|
|
262
273
|
try:
|
|
263
|
-
assert agent.get_contacts_info() == [
|
|
264
|
-
{
|
|
265
|
-
"id": "leader-a",
|
|
266
|
-
"node_type": "agent",
|
|
267
|
-
"role_name": "Conductor",
|
|
268
|
-
"name": "Leader",
|
|
269
|
-
"state": "initializing",
|
|
270
|
-
"is_leader": True,
|
|
271
|
-
},
|
|
272
|
-
]
|
|
274
|
+
assert agent.get_contacts_info() == []
|
|
273
275
|
finally:
|
|
274
276
|
registry.reset()
|
|
275
277
|
workspace_store.reset_cache()
|
|
276
278
|
|
|
277
279
|
|
|
278
|
-
def
|
|
280
|
+
def test_agent_get_contacts_info_lists_output_port_paths():
|
|
279
281
|
registry.reset()
|
|
280
282
|
workspace_store.reset_cache()
|
|
281
|
-
workspace_store.upsert_tab(
|
|
283
|
+
workspace_store.upsert_tab(
|
|
284
|
+
Tab(
|
|
285
|
+
id="tab-1",
|
|
286
|
+
title="Task",
|
|
287
|
+
leader_id="leader-a",
|
|
288
|
+
definition=WorkflowDefinition(
|
|
289
|
+
nodes=[
|
|
290
|
+
build_workflow_node_definition(
|
|
291
|
+
node_id="agent-a",
|
|
292
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
293
|
+
),
|
|
294
|
+
build_workflow_node_definition(
|
|
295
|
+
node_id="agent-b",
|
|
296
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
297
|
+
config={"role_name": "Reviewer", "name": "Reviewer"},
|
|
298
|
+
),
|
|
299
|
+
build_workflow_node_definition(
|
|
300
|
+
node_id="code-a",
|
|
301
|
+
node_kind=WorkflowNodeKind.CODE,
|
|
302
|
+
config={
|
|
303
|
+
"inputs": [
|
|
304
|
+
{
|
|
305
|
+
"key": "payload",
|
|
306
|
+
"direction": "in",
|
|
307
|
+
"type": "json",
|
|
308
|
+
"required": True,
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
"outputs": [],
|
|
312
|
+
},
|
|
313
|
+
),
|
|
314
|
+
]
|
|
315
|
+
),
|
|
316
|
+
)
|
|
317
|
+
)
|
|
282
318
|
leader = Agent(
|
|
283
319
|
NodeConfig(
|
|
284
320
|
node_type=NodeType.AGENT,
|
|
@@ -292,25 +328,74 @@ def test_agent_get_contacts_info_keeps_leader_stable_when_explicitly_connected()
|
|
|
292
328
|
NodeConfig(node_type=NodeType.AGENT, tab_id="tab-1"),
|
|
293
329
|
uuid="agent-a",
|
|
294
330
|
)
|
|
295
|
-
|
|
296
|
-
NodeConfig(
|
|
297
|
-
|
|
331
|
+
peer = Agent(
|
|
332
|
+
NodeConfig(
|
|
333
|
+
node_type=NodeType.AGENT,
|
|
334
|
+
role_name="Reviewer",
|
|
335
|
+
name="Reviewer",
|
|
336
|
+
tab_id="tab-1",
|
|
337
|
+
),
|
|
338
|
+
uuid="agent-b",
|
|
298
339
|
)
|
|
299
340
|
registry.register(leader)
|
|
300
341
|
registry.register(agent)
|
|
301
|
-
registry.register(
|
|
302
|
-
|
|
342
|
+
registry.register(peer)
|
|
343
|
+
tab = workspace_store.get_tab("tab-1")
|
|
344
|
+
assert tab is not None
|
|
345
|
+
source = tab.definition.get_node("agent-a")
|
|
346
|
+
assert source is not None
|
|
347
|
+
source.outputs.append(
|
|
348
|
+
WorkflowPort(
|
|
349
|
+
key="json",
|
|
350
|
+
direction=PortDirection.OUTPUT,
|
|
351
|
+
type=PortType.JSON,
|
|
352
|
+
multiple=True,
|
|
353
|
+
)
|
|
354
|
+
)
|
|
355
|
+
workspace_store.upsert_tab(tab)
|
|
356
|
+
peer_edge, error = create_edge(
|
|
357
|
+
tab_id="tab-1",
|
|
358
|
+
from_node_id="agent-a",
|
|
359
|
+
to_node_id="agent-b",
|
|
360
|
+
)
|
|
361
|
+
assert error is None and peer_edge is not None
|
|
362
|
+
code_edge, error = create_edge(
|
|
363
|
+
tab_id="tab-1",
|
|
364
|
+
from_node_id="agent-a",
|
|
365
|
+
from_port_key="json",
|
|
366
|
+
to_node_id="code-a",
|
|
367
|
+
to_port_key="payload",
|
|
368
|
+
)
|
|
369
|
+
assert error is None and code_edge is not None
|
|
303
370
|
|
|
304
371
|
try:
|
|
305
372
|
assert agent.get_contacts_info() == [
|
|
306
373
|
{
|
|
307
|
-
"id": "
|
|
374
|
+
"id": "agent-b",
|
|
375
|
+
"target_id": "agent-b",
|
|
308
376
|
"node_type": "agent",
|
|
309
|
-
"role_name": "
|
|
310
|
-
"name": "
|
|
377
|
+
"role_name": "Reviewer",
|
|
378
|
+
"name": "Reviewer",
|
|
311
379
|
"state": "initializing",
|
|
312
|
-
"is_leader":
|
|
313
|
-
|
|
380
|
+
"is_leader": False,
|
|
381
|
+
"from_output_port_key": "out",
|
|
382
|
+
"to_input_port_key": "in",
|
|
383
|
+
"port_type": "parts",
|
|
384
|
+
"edge_id": peer_edge.id,
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"id": "code-a",
|
|
388
|
+
"target_id": "code-a",
|
|
389
|
+
"node_type": "code",
|
|
390
|
+
"role_name": None,
|
|
391
|
+
"name": None,
|
|
392
|
+
"state": None,
|
|
393
|
+
"is_leader": False,
|
|
394
|
+
"from_output_port_key": "json",
|
|
395
|
+
"to_input_port_key": "payload",
|
|
396
|
+
"port_type": "json",
|
|
397
|
+
"edge_id": code_edge.id,
|
|
398
|
+
},
|
|
314
399
|
]
|
|
315
400
|
finally:
|
|
316
401
|
registry.reset()
|
|
@@ -354,16 +439,43 @@ def test_agent_get_contacts_info_ignores_peer_only_connections():
|
|
|
354
439
|
peer.add_connection(agent.uuid)
|
|
355
440
|
|
|
356
441
|
try:
|
|
357
|
-
assert agent.get_contacts_info() == [
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
442
|
+
assert agent.get_contacts_info() == []
|
|
443
|
+
finally:
|
|
444
|
+
registry.reset()
|
|
445
|
+
workspace_store.reset_cache()
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
def test_workflow_node_ref_resolves_unique_agent_role_name():
|
|
449
|
+
from flowent.graph_service import resolve_workflow_node_ref
|
|
450
|
+
|
|
451
|
+
registry.reset()
|
|
452
|
+
workspace_store.reset_cache()
|
|
453
|
+
workspace_store.upsert_tab(
|
|
454
|
+
Tab(
|
|
455
|
+
id="tab-1",
|
|
456
|
+
title="Task",
|
|
457
|
+
leader_id="leader-a",
|
|
458
|
+
definition=WorkflowDefinition(
|
|
459
|
+
nodes=[
|
|
460
|
+
build_workflow_node_definition(
|
|
461
|
+
node_id="agent-a",
|
|
462
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
463
|
+
config={"role_name": "Reviewer"},
|
|
464
|
+
),
|
|
465
|
+
build_workflow_node_definition(
|
|
466
|
+
node_id="agent-b",
|
|
467
|
+
node_kind=WorkflowNodeKind.AGENT,
|
|
468
|
+
config={"role_name": "Writer"},
|
|
469
|
+
),
|
|
470
|
+
]
|
|
471
|
+
),
|
|
472
|
+
)
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
try:
|
|
476
|
+
assert (
|
|
477
|
+
resolve_workflow_node_ref(tab_id="tab-1", node_ref="Reviewer") == "agent-a"
|
|
478
|
+
)
|
|
367
479
|
finally:
|
|
368
480
|
registry.reset()
|
|
369
481
|
workspace_store.reset_cache()
|
|
@@ -553,19 +665,12 @@ def test_list_roles_tool_returns_registered_roles(monkeypatch):
|
|
|
553
665
|
"exec",
|
|
554
666
|
],
|
|
555
667
|
"optional_tools": [
|
|
556
|
-
"create_workflow",
|
|
557
|
-
"delete_workflow",
|
|
558
668
|
"set_permissions",
|
|
559
669
|
"create_agent",
|
|
560
670
|
"connect",
|
|
561
|
-
"manage_providers",
|
|
562
|
-
"manage_roles",
|
|
563
|
-
"manage_settings",
|
|
564
|
-
"manage_prompts",
|
|
565
671
|
"edit",
|
|
566
672
|
"fetch",
|
|
567
673
|
"list_roles",
|
|
568
|
-
"list_workflows",
|
|
569
674
|
"list_tools",
|
|
570
675
|
"list_mcp_resources",
|
|
571
676
|
"list_mcp_resource_templates",
|
|
@@ -586,20 +691,13 @@ def test_list_roles_tool_returns_registered_roles(monkeypatch):
|
|
|
586
691
|
"send",
|
|
587
692
|
],
|
|
588
693
|
"optional_tools": [
|
|
589
|
-
"create_workflow",
|
|
590
|
-
"delete_workflow",
|
|
591
694
|
"set_permissions",
|
|
592
695
|
"create_agent",
|
|
593
696
|
"connect",
|
|
594
|
-
"manage_providers",
|
|
595
|
-
"manage_roles",
|
|
596
|
-
"manage_settings",
|
|
597
|
-
"manage_prompts",
|
|
598
697
|
"read",
|
|
599
698
|
"edit",
|
|
600
699
|
"exec",
|
|
601
700
|
"list_roles",
|
|
602
|
-
"list_workflows",
|
|
603
701
|
"list_tools",
|
|
604
702
|
"list_mcp_resources",
|
|
605
703
|
"list_mcp_resource_templates",
|
|
@@ -632,17 +730,10 @@ def test_list_tools_tool_returns_registered_tool_names_and_descriptions():
|
|
|
632
730
|
"edit",
|
|
633
731
|
"exec",
|
|
634
732
|
"fetch",
|
|
635
|
-
"create_workflow",
|
|
636
|
-
"delete_workflow",
|
|
637
733
|
"set_permissions",
|
|
638
734
|
"create_agent",
|
|
639
735
|
"connect",
|
|
640
|
-
"manage_providers",
|
|
641
|
-
"manage_roles",
|
|
642
|
-
"manage_settings",
|
|
643
|
-
"manage_prompts",
|
|
644
736
|
"list_roles",
|
|
645
|
-
"list_workflows",
|
|
646
737
|
"list_tools",
|
|
647
738
|
"list_mcp_resources",
|
|
648
739
|
"list_mcp_resource_templates",
|