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
|
@@ -151,7 +151,6 @@ MODEL_REASONING_EFFORT_OPTIONS = frozenset({"none", "low", "medium", "high", "xh
|
|
|
151
151
|
MODEL_VERBOSITY_OPTIONS = frozenset({"low", "medium", "high"})
|
|
152
152
|
MODEL_RETRY_POLICY_OPTIONS = frozenset({"no_retry", "limited", "unlimited"})
|
|
153
153
|
PROVIDER_MODEL_SOURCE_OPTIONS = frozenset({"discovered", "manual"})
|
|
154
|
-
MCP_TRANSPORT_OPTIONS = frozenset({"stdio", "streamable_http"})
|
|
155
154
|
REMOVED_TOOL_NAMES = frozenset({"exit", "list_connections"})
|
|
156
155
|
RENAMED_TOOL_NAMES = {
|
|
157
156
|
"create_tab": "create_workflow",
|
|
@@ -166,8 +165,6 @@ DEFAULT_LLM_RETRY_MAX_DELAY_SECONDS = 8.0
|
|
|
166
165
|
DEFAULT_LLM_RETRY_BACKOFF_CAP_RETRIES = 5
|
|
167
166
|
DEFAULT_LLM_AUTO_COMPACT_TOKEN_LIMIT: int | None = None
|
|
168
167
|
DEFAULT_ASSISTANT_ALLOW_NETWORK = True
|
|
169
|
-
DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC = 10
|
|
170
|
-
DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC = 30
|
|
171
168
|
|
|
172
169
|
|
|
173
170
|
def build_default_app_data_dir() -> str:
|
|
@@ -266,14 +263,6 @@ def _normalize_assistant_write_dir(
|
|
|
266
263
|
return str(resolve_path(raw_write_dir, base_dir=base_dir, strict=False))
|
|
267
264
|
|
|
268
265
|
|
|
269
|
-
def _normalize_mcp_server_cwd(
|
|
270
|
-
raw_cwd: str,
|
|
271
|
-
*,
|
|
272
|
-
base_dir: str | Path | None = None,
|
|
273
|
-
) -> str:
|
|
274
|
-
return str(resolve_path(raw_cwd, base_dir=base_dir, strict=False))
|
|
275
|
-
|
|
276
|
-
|
|
277
266
|
def build_working_dir(
|
|
278
267
|
raw_working_dir: object,
|
|
279
268
|
*,
|
|
@@ -309,30 +298,6 @@ class RoleConfig:
|
|
|
309
298
|
excluded_tools: list[str] = field(default_factory=list)
|
|
310
299
|
|
|
311
300
|
|
|
312
|
-
@dataclass
|
|
313
|
-
class MCPServerConfig:
|
|
314
|
-
name: str
|
|
315
|
-
transport: str
|
|
316
|
-
enabled: bool = True
|
|
317
|
-
required: bool = False
|
|
318
|
-
startup_timeout_sec: int = DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC
|
|
319
|
-
tool_timeout_sec: int = DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC
|
|
320
|
-
enabled_tools: list[str] = field(default_factory=list)
|
|
321
|
-
disabled_tools: list[str] = field(default_factory=list)
|
|
322
|
-
scopes: list[str] = field(default_factory=list)
|
|
323
|
-
oauth_resource: str = ""
|
|
324
|
-
launcher: str = ""
|
|
325
|
-
command: str = ""
|
|
326
|
-
args: list[str] = field(default_factory=list)
|
|
327
|
-
env: dict[str, str] = field(default_factory=dict)
|
|
328
|
-
env_vars: list[str] = field(default_factory=list)
|
|
329
|
-
cwd: str = ""
|
|
330
|
-
url: str = ""
|
|
331
|
-
bearer_token_env_var: str = ""
|
|
332
|
-
http_headers: dict[str, str] = field(default_factory=dict)
|
|
333
|
-
env_http_headers: list[str] = field(default_factory=list)
|
|
334
|
-
|
|
335
|
-
|
|
336
301
|
@dataclass
|
|
337
302
|
class ModelSettings:
|
|
338
303
|
active_provider_id: str = ""
|
|
@@ -401,7 +366,6 @@ class Settings:
|
|
|
401
366
|
custom_post_prompt: str = ""
|
|
402
367
|
providers: list[ProviderConfig] = field(default_factory=list)
|
|
403
368
|
roles: list[RoleConfig] = field(default_factory=list)
|
|
404
|
-
mcp_servers: list[MCPServerConfig] = field(default_factory=list)
|
|
405
369
|
|
|
406
370
|
|
|
407
371
|
_cached_settings: Settings | None = None
|
|
@@ -672,27 +636,6 @@ def build_assistant_write_dirs(
|
|
|
672
636
|
return normalized
|
|
673
637
|
|
|
674
638
|
|
|
675
|
-
def build_mcp_server_mounts(
|
|
676
|
-
raw_server_names: object,
|
|
677
|
-
*,
|
|
678
|
-
field_name: str,
|
|
679
|
-
) -> list[str]:
|
|
680
|
-
if not isinstance(raw_server_names, list):
|
|
681
|
-
raise ValueError(f"{field_name} must be an array of strings")
|
|
682
|
-
|
|
683
|
-
normalized: list[str] = []
|
|
684
|
-
seen: set[str] = set()
|
|
685
|
-
for raw_item in raw_server_names:
|
|
686
|
-
if not isinstance(raw_item, str):
|
|
687
|
-
raise ValueError(f"{field_name} must be an array of strings")
|
|
688
|
-
name = raw_item.strip()
|
|
689
|
-
if not name or name in seen:
|
|
690
|
-
continue
|
|
691
|
-
normalized.append(name)
|
|
692
|
-
seen.add(name)
|
|
693
|
-
return normalized
|
|
694
|
-
|
|
695
|
-
|
|
696
639
|
def build_model_retry_policy(
|
|
697
640
|
raw_retry_policy: object,
|
|
698
641
|
*,
|
|
@@ -775,79 +718,6 @@ def build_model_timeout_ms(
|
|
|
775
718
|
return raw_timeout_ms
|
|
776
719
|
|
|
777
720
|
|
|
778
|
-
def build_mcp_transport(
|
|
779
|
-
raw_transport: object,
|
|
780
|
-
*,
|
|
781
|
-
field_name: str = "transport",
|
|
782
|
-
) -> str:
|
|
783
|
-
if not isinstance(raw_transport, str):
|
|
784
|
-
raise ValueError(f"{field_name} must be a string")
|
|
785
|
-
transport = raw_transport.strip().lower()
|
|
786
|
-
if transport not in MCP_TRANSPORT_OPTIONS:
|
|
787
|
-
raise ValueError(
|
|
788
|
-
f"{field_name} must be one of: " + ", ".join(sorted(MCP_TRANSPORT_OPTIONS))
|
|
789
|
-
)
|
|
790
|
-
return transport
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
def build_mcp_timeout_seconds(
|
|
794
|
-
raw_timeout_seconds: object,
|
|
795
|
-
*,
|
|
796
|
-
field_name: str,
|
|
797
|
-
) -> int:
|
|
798
|
-
if isinstance(raw_timeout_seconds, bool) or not isinstance(
|
|
799
|
-
raw_timeout_seconds, int
|
|
800
|
-
):
|
|
801
|
-
raise ValueError(f"{field_name} must be an integer")
|
|
802
|
-
if raw_timeout_seconds <= 0:
|
|
803
|
-
raise ValueError(f"{field_name} must be greater than 0")
|
|
804
|
-
return raw_timeout_seconds
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
def build_mcp_string_list(
|
|
808
|
-
raw_items: object,
|
|
809
|
-
*,
|
|
810
|
-
field_name: str,
|
|
811
|
-
) -> list[str]:
|
|
812
|
-
if not isinstance(raw_items, list):
|
|
813
|
-
raise ValueError(f"{field_name} must be an array of strings")
|
|
814
|
-
normalized: list[str] = []
|
|
815
|
-
seen: set[str] = set()
|
|
816
|
-
for raw_item in raw_items:
|
|
817
|
-
if not isinstance(raw_item, str):
|
|
818
|
-
raise ValueError(f"{field_name} must be an array of strings")
|
|
819
|
-
item = raw_item.strip()
|
|
820
|
-
if not item or item in seen:
|
|
821
|
-
continue
|
|
822
|
-
normalized.append(item)
|
|
823
|
-
seen.add(item)
|
|
824
|
-
return normalized
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
def build_mcp_env_var_names(
|
|
828
|
-
raw_items: object,
|
|
829
|
-
*,
|
|
830
|
-
field_name: str,
|
|
831
|
-
) -> list[str]:
|
|
832
|
-
return build_mcp_string_list(raw_items, field_name=field_name)
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
def build_mcp_cwd(
|
|
836
|
-
raw_cwd: object,
|
|
837
|
-
*,
|
|
838
|
-
field_name: str,
|
|
839
|
-
base_dir: str | Path | None = None,
|
|
840
|
-
) -> str:
|
|
841
|
-
if raw_cwd is None:
|
|
842
|
-
return ""
|
|
843
|
-
if not isinstance(raw_cwd, str):
|
|
844
|
-
raise ValueError(f"{field_name} must be a string")
|
|
845
|
-
cwd = raw_cwd.strip()
|
|
846
|
-
if not cwd:
|
|
847
|
-
return ""
|
|
848
|
-
return _normalize_mcp_server_cwd(cwd, base_dir=base_dir)
|
|
849
|
-
|
|
850
|
-
|
|
851
721
|
def build_provider_headers(
|
|
852
722
|
raw_headers: object,
|
|
853
723
|
*,
|
|
@@ -1012,31 +882,6 @@ def serialize_provider(provider: ProviderConfig) -> dict[str, object]:
|
|
|
1012
882
|
}
|
|
1013
883
|
|
|
1014
884
|
|
|
1015
|
-
def serialize_mcp_server(server: MCPServerConfig) -> dict[str, object]:
|
|
1016
|
-
return {
|
|
1017
|
-
"name": server.name,
|
|
1018
|
-
"transport": server.transport,
|
|
1019
|
-
"enabled": server.enabled,
|
|
1020
|
-
"required": server.required,
|
|
1021
|
-
"startup_timeout_sec": server.startup_timeout_sec,
|
|
1022
|
-
"tool_timeout_sec": server.tool_timeout_sec,
|
|
1023
|
-
"enabled_tools": list(server.enabled_tools),
|
|
1024
|
-
"disabled_tools": list(server.disabled_tools),
|
|
1025
|
-
"scopes": list(server.scopes),
|
|
1026
|
-
"oauth_resource": server.oauth_resource,
|
|
1027
|
-
"launcher": server.launcher,
|
|
1028
|
-
"command": server.command,
|
|
1029
|
-
"args": list(server.args),
|
|
1030
|
-
"env": dict(server.env),
|
|
1031
|
-
"env_vars": list(server.env_vars),
|
|
1032
|
-
"cwd": server.cwd,
|
|
1033
|
-
"url": server.url,
|
|
1034
|
-
"bearer_token_env_var": server.bearer_token_env_var,
|
|
1035
|
-
"http_headers": dict(server.http_headers),
|
|
1036
|
-
"env_http_headers": list(server.env_http_headers),
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
885
|
def serialize_role(role: RoleConfig) -> dict[str, object]:
|
|
1041
886
|
return {
|
|
1042
887
|
"name": role.name,
|
|
@@ -1105,9 +950,6 @@ def serialize_settings(
|
|
|
1105
950
|
and settings.access.code_salt.strip()
|
|
1106
951
|
)
|
|
1107
952
|
}
|
|
1108
|
-
data["mcp_servers"] = [
|
|
1109
|
-
serialize_mcp_server(server) for server in settings.mcp_servers
|
|
1110
|
-
]
|
|
1111
953
|
return data
|
|
1112
954
|
|
|
1113
955
|
|
|
@@ -1398,247 +1240,6 @@ def _normalize_required_string(raw_value: object) -> tuple[str, bool]:
|
|
|
1398
1240
|
return stripped, stripped != raw_value
|
|
1399
1241
|
|
|
1400
1242
|
|
|
1401
|
-
def _normalize_mcp_mount_list(raw_values: object) -> tuple[list[str], bool]:
|
|
1402
|
-
if raw_values is None:
|
|
1403
|
-
return [], False
|
|
1404
|
-
if not isinstance(raw_values, list):
|
|
1405
|
-
return [], True
|
|
1406
|
-
normalized: list[str] = []
|
|
1407
|
-
seen: set[str] = set()
|
|
1408
|
-
migrated = False
|
|
1409
|
-
for raw_value in raw_values:
|
|
1410
|
-
if not isinstance(raw_value, str):
|
|
1411
|
-
migrated = True
|
|
1412
|
-
continue
|
|
1413
|
-
value = raw_value.strip()
|
|
1414
|
-
if not value:
|
|
1415
|
-
migrated = True
|
|
1416
|
-
continue
|
|
1417
|
-
if value in seen:
|
|
1418
|
-
migrated = True
|
|
1419
|
-
continue
|
|
1420
|
-
if value != raw_value:
|
|
1421
|
-
migrated = True
|
|
1422
|
-
normalized.append(value)
|
|
1423
|
-
seen.add(value)
|
|
1424
|
-
return normalized, migrated
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
def _normalize_mcp_bool(raw_value: object, *, default: bool) -> tuple[bool, bool]:
|
|
1428
|
-
if raw_value is None:
|
|
1429
|
-
return default, True
|
|
1430
|
-
if not isinstance(raw_value, bool):
|
|
1431
|
-
return default, True
|
|
1432
|
-
return raw_value, False
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
def _normalize_mcp_timeout(
|
|
1436
|
-
raw_value: object,
|
|
1437
|
-
*,
|
|
1438
|
-
default: int,
|
|
1439
|
-
) -> tuple[int, bool]:
|
|
1440
|
-
if raw_value is None:
|
|
1441
|
-
return default, True
|
|
1442
|
-
try:
|
|
1443
|
-
return build_mcp_timeout_seconds(raw_value, field_name="timeout"), False
|
|
1444
|
-
except ValueError:
|
|
1445
|
-
return default, True
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
def _normalize_mcp_headers(raw_headers: object) -> tuple[dict[str, str], bool]:
|
|
1449
|
-
if raw_headers is None:
|
|
1450
|
-
return {}, False
|
|
1451
|
-
try:
|
|
1452
|
-
return build_provider_headers(raw_headers, field_name="headers"), False
|
|
1453
|
-
except ValueError:
|
|
1454
|
-
return {}, True
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
def _build_mcp_server_config(
|
|
1458
|
-
raw_server: object,
|
|
1459
|
-
*,
|
|
1460
|
-
base_dir: str | Path | None = None,
|
|
1461
|
-
) -> tuple[MCPServerConfig | None, bool]:
|
|
1462
|
-
if not isinstance(raw_server, dict):
|
|
1463
|
-
return None, True
|
|
1464
|
-
|
|
1465
|
-
raw_name = raw_server.get("name", raw_server.get("server_name"))
|
|
1466
|
-
if not isinstance(raw_name, str) or not raw_name.strip():
|
|
1467
|
-
return None, True
|
|
1468
|
-
name = raw_name.strip()
|
|
1469
|
-
migrated = name != raw_name or "server_name" in raw_server
|
|
1470
|
-
|
|
1471
|
-
raw_transport = raw_server.get("transport", "stdio")
|
|
1472
|
-
try:
|
|
1473
|
-
transport = build_mcp_transport(raw_transport)
|
|
1474
|
-
except ValueError:
|
|
1475
|
-
transport = "stdio"
|
|
1476
|
-
migrated = True
|
|
1477
|
-
|
|
1478
|
-
enabled, enabled_migrated = _normalize_mcp_bool(
|
|
1479
|
-
raw_server.get("enabled"),
|
|
1480
|
-
default=True,
|
|
1481
|
-
)
|
|
1482
|
-
required, required_migrated = _normalize_mcp_bool(
|
|
1483
|
-
raw_server.get("required"),
|
|
1484
|
-
default=False,
|
|
1485
|
-
)
|
|
1486
|
-
startup_timeout_sec, startup_timeout_migrated = _normalize_mcp_timeout(
|
|
1487
|
-
raw_server.get("startup_timeout_sec"),
|
|
1488
|
-
default=DEFAULT_MCP_SERVER_STARTUP_TIMEOUT_SEC,
|
|
1489
|
-
)
|
|
1490
|
-
tool_timeout_sec, tool_timeout_migrated = _normalize_mcp_timeout(
|
|
1491
|
-
raw_server.get("tool_timeout_sec"),
|
|
1492
|
-
default=DEFAULT_MCP_SERVER_TOOL_TIMEOUT_SEC,
|
|
1493
|
-
)
|
|
1494
|
-
enabled_tools, enabled_tools_migrated = _normalize_mcp_mount_list(
|
|
1495
|
-
raw_server.get("enabled_tools")
|
|
1496
|
-
)
|
|
1497
|
-
disabled_tools, disabled_tools_migrated = _normalize_mcp_mount_list(
|
|
1498
|
-
raw_server.get("disabled_tools")
|
|
1499
|
-
)
|
|
1500
|
-
scopes, scopes_migrated = _normalize_mcp_mount_list(raw_server.get("scopes"))
|
|
1501
|
-
env_vars, env_vars_migrated = _normalize_mcp_mount_list(raw_server.get("env_vars"))
|
|
1502
|
-
env_http_headers, env_http_headers_migrated = _normalize_mcp_mount_list(
|
|
1503
|
-
raw_server.get("env_http_headers")
|
|
1504
|
-
)
|
|
1505
|
-
env, env_migrated = _normalize_mcp_headers(raw_server.get("env"))
|
|
1506
|
-
http_headers, http_headers_migrated = _normalize_mcp_headers(
|
|
1507
|
-
raw_server.get("http_headers")
|
|
1508
|
-
)
|
|
1509
|
-
|
|
1510
|
-
raw_args = raw_server.get("args")
|
|
1511
|
-
if raw_args is None:
|
|
1512
|
-
args: list[str] = []
|
|
1513
|
-
args_migrated = False
|
|
1514
|
-
else:
|
|
1515
|
-
args, args_migrated = _normalize_mcp_mount_list(raw_args)
|
|
1516
|
-
|
|
1517
|
-
raw_oauth_resource = raw_server.get("oauth_resource")
|
|
1518
|
-
oauth_resource = (
|
|
1519
|
-
raw_oauth_resource.strip() if isinstance(raw_oauth_resource, str) else ""
|
|
1520
|
-
)
|
|
1521
|
-
raw_launcher = raw_server.get("launcher")
|
|
1522
|
-
launcher = raw_launcher.strip() if isinstance(raw_launcher, str) else ""
|
|
1523
|
-
if isinstance(raw_launcher, str) and launcher != raw_launcher:
|
|
1524
|
-
migrated = True
|
|
1525
|
-
if raw_launcher not in {None, ""} and not isinstance(raw_launcher, str):
|
|
1526
|
-
migrated = True
|
|
1527
|
-
raw_command = raw_server.get("command")
|
|
1528
|
-
command = raw_command.strip() if isinstance(raw_command, str) else ""
|
|
1529
|
-
cwd_raw = raw_server.get("cwd")
|
|
1530
|
-
cwd = ""
|
|
1531
|
-
if isinstance(cwd_raw, str) and cwd_raw.strip():
|
|
1532
|
-
cwd = _normalize_mcp_server_cwd(cwd_raw.strip(), base_dir=base_dir)
|
|
1533
|
-
migrated = migrated or cwd != cwd_raw
|
|
1534
|
-
elif cwd_raw not in {None, ""}:
|
|
1535
|
-
migrated = True
|
|
1536
|
-
raw_url = raw_server.get("url")
|
|
1537
|
-
url = raw_url.strip() if isinstance(raw_url, str) else ""
|
|
1538
|
-
raw_bearer_token_env_var = raw_server.get("bearer_token_env_var")
|
|
1539
|
-
bearer_token_env_var = (
|
|
1540
|
-
raw_bearer_token_env_var.strip()
|
|
1541
|
-
if isinstance(raw_bearer_token_env_var, str)
|
|
1542
|
-
else ""
|
|
1543
|
-
)
|
|
1544
|
-
|
|
1545
|
-
if transport == "stdio":
|
|
1546
|
-
if (
|
|
1547
|
-
scopes
|
|
1548
|
-
or oauth_resource
|
|
1549
|
-
or url
|
|
1550
|
-
or bearer_token_env_var
|
|
1551
|
-
or http_headers
|
|
1552
|
-
or env_http_headers
|
|
1553
|
-
):
|
|
1554
|
-
migrated = True
|
|
1555
|
-
scopes = []
|
|
1556
|
-
oauth_resource = ""
|
|
1557
|
-
url = ""
|
|
1558
|
-
bearer_token_env_var = ""
|
|
1559
|
-
http_headers = {}
|
|
1560
|
-
env_http_headers = []
|
|
1561
|
-
else:
|
|
1562
|
-
if command or args or env or env_vars or cwd:
|
|
1563
|
-
migrated = True
|
|
1564
|
-
command = ""
|
|
1565
|
-
args = []
|
|
1566
|
-
env = {}
|
|
1567
|
-
env_vars = []
|
|
1568
|
-
cwd = ""
|
|
1569
|
-
|
|
1570
|
-
migrated = (
|
|
1571
|
-
migrated
|
|
1572
|
-
or enabled_migrated
|
|
1573
|
-
or required_migrated
|
|
1574
|
-
or startup_timeout_migrated
|
|
1575
|
-
or tool_timeout_migrated
|
|
1576
|
-
or enabled_tools_migrated
|
|
1577
|
-
or disabled_tools_migrated
|
|
1578
|
-
or scopes_migrated
|
|
1579
|
-
or args_migrated
|
|
1580
|
-
or env_migrated
|
|
1581
|
-
or env_vars_migrated
|
|
1582
|
-
or http_headers_migrated
|
|
1583
|
-
or env_http_headers_migrated
|
|
1584
|
-
)
|
|
1585
|
-
|
|
1586
|
-
return (
|
|
1587
|
-
MCPServerConfig(
|
|
1588
|
-
name=name,
|
|
1589
|
-
transport=transport,
|
|
1590
|
-
enabled=enabled,
|
|
1591
|
-
required=required,
|
|
1592
|
-
startup_timeout_sec=startup_timeout_sec,
|
|
1593
|
-
tool_timeout_sec=tool_timeout_sec,
|
|
1594
|
-
enabled_tools=enabled_tools,
|
|
1595
|
-
disabled_tools=disabled_tools,
|
|
1596
|
-
scopes=scopes,
|
|
1597
|
-
oauth_resource=oauth_resource,
|
|
1598
|
-
launcher=launcher,
|
|
1599
|
-
command=command,
|
|
1600
|
-
args=args,
|
|
1601
|
-
env=env,
|
|
1602
|
-
env_vars=env_vars,
|
|
1603
|
-
cwd=cwd,
|
|
1604
|
-
url=url,
|
|
1605
|
-
bearer_token_env_var=bearer_token_env_var,
|
|
1606
|
-
http_headers=http_headers,
|
|
1607
|
-
env_http_headers=env_http_headers,
|
|
1608
|
-
),
|
|
1609
|
-
migrated,
|
|
1610
|
-
)
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
def _normalize_mcp_servers(
|
|
1614
|
-
raw_servers: object,
|
|
1615
|
-
*,
|
|
1616
|
-
base_dir: str | Path | None = None,
|
|
1617
|
-
) -> tuple[list[MCPServerConfig], bool]:
|
|
1618
|
-
if raw_servers is None:
|
|
1619
|
-
return [], False
|
|
1620
|
-
if not isinstance(raw_servers, list):
|
|
1621
|
-
return [], True
|
|
1622
|
-
|
|
1623
|
-
normalized: list[MCPServerConfig] = []
|
|
1624
|
-
seen: set[str] = set()
|
|
1625
|
-
migrated = False
|
|
1626
|
-
for raw_server in raw_servers:
|
|
1627
|
-
server, server_migrated = _build_mcp_server_config(
|
|
1628
|
-
raw_server,
|
|
1629
|
-
base_dir=base_dir,
|
|
1630
|
-
)
|
|
1631
|
-
migrated = migrated or server_migrated
|
|
1632
|
-
if server is None:
|
|
1633
|
-
continue
|
|
1634
|
-
if server.name in seen:
|
|
1635
|
-
migrated = True
|
|
1636
|
-
continue
|
|
1637
|
-
seen.add(server.name)
|
|
1638
|
-
normalized.append(server)
|
|
1639
|
-
return normalized, migrated
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
1243
|
def _build_pending_chat(raw_chat: object) -> tuple[TelegramPendingChat | None, bool]:
|
|
1643
1244
|
if not isinstance(raw_chat, dict):
|
|
1644
1245
|
return None, True
|
|
@@ -2173,18 +1774,24 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
|
|
|
2173
1774
|
included_tools = normalize_tool_names(
|
|
2174
1775
|
[name for name in included_tools_raw if isinstance(name, str)]
|
|
2175
1776
|
)
|
|
2176
|
-
from flowent.tools import
|
|
2177
|
-
is_assistant_only_mcp_tool_name,
|
|
2178
|
-
is_assistant_only_tool_name,
|
|
2179
|
-
)
|
|
1777
|
+
from flowent.tools import is_assistant_only_tool_name
|
|
2180
1778
|
|
|
2181
1779
|
filtered_included_tools = [
|
|
2182
1780
|
tool_name
|
|
2183
1781
|
for tool_name in included_tools
|
|
2184
|
-
if not
|
|
2185
|
-
and not
|
|
1782
|
+
if not tool_name.startswith("mcp__")
|
|
1783
|
+
and not is_assistant_only_tool_name(tool_name)
|
|
2186
1784
|
]
|
|
2187
1785
|
migrated = migrated or filtered_included_tools != included_tools
|
|
1786
|
+
excluded_tools = normalize_tool_names(
|
|
1787
|
+
[name for name in excluded_tools_raw if isinstance(name, str)]
|
|
1788
|
+
)
|
|
1789
|
+
filtered_excluded_tools = [
|
|
1790
|
+
tool_name
|
|
1791
|
+
for tool_name in excluded_tools
|
|
1792
|
+
if not tool_name.startswith("mcp__")
|
|
1793
|
+
]
|
|
1794
|
+
migrated = migrated or filtered_excluded_tools != excluded_tools
|
|
2188
1795
|
|
|
2189
1796
|
roles.append(
|
|
2190
1797
|
RoleConfig(
|
|
@@ -2194,17 +1801,12 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
|
|
|
2194
1801
|
model=role_model,
|
|
2195
1802
|
model_params=role_model_params,
|
|
2196
1803
|
included_tools=filtered_included_tools,
|
|
2197
|
-
excluded_tools=
|
|
2198
|
-
[name for name in excluded_tools_raw if isinstance(name, str)]
|
|
2199
|
-
),
|
|
1804
|
+
excluded_tools=filtered_excluded_tools,
|
|
2200
1805
|
)
|
|
2201
1806
|
)
|
|
2202
1807
|
|
|
2203
|
-
mcp_servers
|
|
2204
|
-
|
|
2205
|
-
base_dir=working_dir,
|
|
2206
|
-
)
|
|
2207
|
-
migrated = migrated or mcp_servers_migrated
|
|
1808
|
+
if "mcp_servers" in data:
|
|
1809
|
+
migrated = True
|
|
2208
1810
|
|
|
2209
1811
|
return (
|
|
2210
1812
|
Settings(
|
|
@@ -2220,7 +1822,6 @@ def _build_settings(data: dict[str, object]) -> tuple[Settings, bool]:
|
|
|
2220
1822
|
custom_post_prompt=custom_post_prompt,
|
|
2221
1823
|
providers=providers,
|
|
2222
1824
|
roles=roles,
|
|
2223
|
-
mcp_servers=mcp_servers,
|
|
2224
1825
|
),
|
|
2225
1826
|
migrated,
|
|
2226
1827
|
)
|
|
@@ -2364,13 +1965,6 @@ def find_role(settings: Settings, role_name: str) -> RoleConfig | None:
|
|
|
2364
1965
|
return None
|
|
2365
1966
|
|
|
2366
1967
|
|
|
2367
|
-
def find_mcp_server(settings: Settings, server_name: str) -> MCPServerConfig | None:
|
|
2368
|
-
for server in settings.mcp_servers:
|
|
2369
|
-
if server.name == server_name:
|
|
2370
|
-
return server
|
|
2371
|
-
return None
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
1968
|
def clear_provider_references(settings: Settings, provider_id: str) -> bool:
|
|
2375
1969
|
changed = False
|
|
2376
1970
|
|