flowent 0.0.1 → 0.0.5
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 +20 -9
- package/backend/.python-version +1 -0
- package/backend/README.md +74 -0
- package/backend/pyproject.toml +58 -0
- package/backend/src/flowent/__init__.py +3 -0
- 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__/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/_version.py +7 -0
- package/backend/src/flowent/access.py +247 -0
- package/backend/src/flowent/agent.py +3120 -0
- package/backend/src/flowent/assistant_commands.py +115 -0
- package/backend/src/flowent/channels/__init__.py +3 -0
- 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 +615 -0
- package/backend/src/flowent/cli.py +85 -0
- package/backend/src/flowent/config.py +14 -0
- package/backend/src/flowent/dev.py +3 -0
- package/backend/src/flowent/events.py +157 -0
- package/backend/src/flowent/graph_runtime.py +60 -0
- package/backend/src/flowent/graph_service.py +2508 -0
- package/backend/src/flowent/image_assets.py +356 -0
- package/backend/src/flowent/logging.py +155 -0
- package/backend/src/flowent/main.py +124 -0
- package/backend/src/flowent/mcp_service.py +1918 -0
- package/backend/src/flowent/model_metadata.py +102 -0
- package/backend/src/flowent/models/__init__.py +125 -0
- 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 +34 -0
- package/backend/src/flowent/models/base.py +24 -0
- package/backend/src/flowent/models/blueprint.py +176 -0
- package/backend/src/flowent/models/content.py +164 -0
- package/backend/src/flowent/models/delta.py +44 -0
- package/backend/src/flowent/models/event.py +51 -0
- package/backend/src/flowent/models/graph.py +472 -0
- package/backend/src/flowent/models/history.py +272 -0
- package/backend/src/flowent/models/llm.py +62 -0
- package/backend/src/flowent/models/message.py +33 -0
- package/backend/src/flowent/models/tab.py +85 -0
- package/backend/src/flowent/models/todo.py +10 -0
- package/backend/src/flowent/network.py +146 -0
- package/backend/src/flowent/observability_service.py +218 -0
- package/backend/src/flowent/prompts/__init__.py +67 -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/prompts/common.py +250 -0
- package/backend/src/flowent/prompts/steward.py +64 -0
- package/backend/src/flowent/providers/__init__.py +23 -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/providers/anthropic.py +468 -0
- package/backend/src/flowent/providers/base_url.py +60 -0
- package/backend/src/flowent/providers/configuration.py +189 -0
- package/backend/src/flowent/providers/content.py +122 -0
- package/backend/src/flowent/providers/errors.py +223 -0
- package/backend/src/flowent/providers/gateway.py +169 -0
- package/backend/src/flowent/providers/gemini.py +447 -0
- package/backend/src/flowent/providers/headers.py +20 -0
- package/backend/src/flowent/providers/management.py +96 -0
- package/backend/src/flowent/providers/ollama.py +293 -0
- package/backend/src/flowent/providers/openai.py +422 -0
- package/backend/src/flowent/providers/openai_responses.py +655 -0
- package/backend/src/flowent/providers/registry.py +144 -0
- package/backend/src/flowent/providers/sse.py +31 -0
- package/backend/src/flowent/providers/thinking.py +79 -0
- package/backend/src/flowent/registry.py +73 -0
- package/backend/src/flowent/role_management.py +267 -0
- package/backend/src/flowent/routes/__init__.py +28 -0
- 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/access.py +48 -0
- package/backend/src/flowent/routes/assistant.py +155 -0
- package/backend/src/flowent/routes/image_assets.py +33 -0
- package/backend/src/flowent/routes/mcp.py +125 -0
- package/backend/src/flowent/routes/meta.py +28 -0
- package/backend/src/flowent/routes/nodes.py +413 -0
- package/backend/src/flowent/routes/prompts.py +46 -0
- package/backend/src/flowent/routes/providers_route.py +365 -0
- package/backend/src/flowent/routes/roles.py +207 -0
- package/backend/src/flowent/routes/settings.py +328 -0
- package/backend/src/flowent/routes/tabs.py +310 -0
- package/backend/src/flowent/routes/ws.py +33 -0
- package/backend/src/flowent/runtime.py +165 -0
- package/backend/src/flowent/sandbox.py +45 -0
- package/backend/src/flowent/security.py +57 -0
- package/backend/src/flowent/settings.py +2518 -0
- package/backend/src/flowent/settings_management.py +298 -0
- package/backend/src/flowent/state_db.py +120 -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/datetime-eJqd0V2S.js +1 -0
- package/backend/src/flowent/static/assets/dialog-BOvHIBrg.js +1 -0
- package/backend/src/flowent/static/assets/elk-worker.min-C9JGDOE-.js +6312 -0
- package/backend/src/flowent/static/assets/graph-vendor-CHpVij2M.css +1 -0
- package/backend/src/flowent/static/assets/graph-vendor-DRq_-6fV.js +7 -0
- 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/layout.worker-jMHqAFbP.js +24 -0
- package/backend/src/flowent/static/assets/markdown-vendor-C9RtvaJh.js +29 -0
- package/backend/src/flowent/static/assets/modelParams-DcEhGnu0.js +1 -0
- package/backend/src/flowent/static/assets/react-vendor-mEs_JJxa.js +9 -0
- package/backend/src/flowent/static/assets/roles-BbIEIMeG.js +1 -0
- package/backend/src/flowent/static/assets/rolldown-runtime-BYbx6iT9.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/triState-DgLlKdRR.js +1 -0
- package/backend/src/flowent/static/assets/ui-vendor-UazN8rcv.js +51 -0
- package/backend/src/flowent/static/index.html +35 -0
- package/backend/src/flowent/tools/__init__.py +275 -0
- 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 +100 -0
- package/backend/src/flowent/tools/contacts.py +22 -0
- package/backend/src/flowent/tools/create_agent.py +191 -0
- package/backend/src/flowent/tools/create_tab.py +61 -0
- package/backend/src/flowent/tools/delete_tab.py +39 -0
- package/backend/src/flowent/tools/edit.py +142 -0
- package/backend/src/flowent/tools/exec.py +118 -0
- package/backend/src/flowent/tools/fetch.py +85 -0
- package/backend/src/flowent/tools/idle.py +27 -0
- package/backend/src/flowent/tools/list_roles.py +75 -0
- package/backend/src/flowent/tools/list_tabs.py +100 -0
- package/backend/src/flowent/tools/list_tools.py +28 -0
- package/backend/src/flowent/tools/manage_prompts.py +102 -0
- package/backend/src/flowent/tools/manage_providers.py +220 -0
- package/backend/src/flowent/tools/manage_roles.py +275 -0
- package/backend/src/flowent/tools/manage_settings.py +364 -0
- package/backend/src/flowent/tools/mcp.py +199 -0
- package/backend/src/flowent/tools/read.py +152 -0
- package/backend/src/flowent/tools/send.py +68 -0
- package/backend/src/flowent/tools/set_permissions.py +99 -0
- package/backend/src/flowent/tools/sleep.py +41 -0
- package/backend/src/flowent/tools/todo.py +51 -0
- package/backend/src/flowent/workspace_store.py +479 -0
- package/backend/tests/__init__.py +0 -0
- 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/conftest.py +6 -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/conftest.py +29 -0
- package/backend/tests/integration/api/test_access_api.py +182 -0
- package/backend/tests/integration/api/test_assistant_api.py +354 -0
- package/backend/tests/integration/api/test_frontend_mounting.py +61 -0
- package/backend/tests/integration/api/test_mcp_api.py +116 -0
- package/backend/tests/integration/api/test_meta_api.py +33 -0
- package/backend/tests/integration/api/test_nodes_api.py +722 -0
- package/backend/tests/integration/api/test_prompts_api.py +47 -0
- package/backend/tests/integration/api/test_roles_api.py +228 -0
- package/backend/tests/integration/api/test_tabs_api.py +802 -0
- 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 +837 -0
- package/backend/tests/unit/agent/test_agent_runtime.py +2942 -0
- package/backend/tests/unit/channels/__pycache__/test_telegram_channel.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/channels/test_telegram_channel.py +552 -0
- package/backend/tests/unit/logging/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/logging/test_logging.py +132 -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 +570 -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/providers/test_anthropic_provider.py +185 -0
- package/backend/tests/unit/providers/test_errors.py +68 -0
- package/backend/tests/unit/providers/test_extract_delta_parts.py +22 -0
- package/backend/tests/unit/providers/test_openai_provider.py +139 -0
- package/backend/tests/unit/providers/test_openai_responses.py +402 -0
- package/backend/tests/unit/providers/test_provider_gateway.py +359 -0
- package/backend/tests/unit/providers/test_think_tag_parser.py +36 -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 +104 -0
- package/backend/tests/unit/routes/test_providers_route.py +370 -0
- package/backend/tests/unit/routes/test_roles_routes.py +535 -0
- package/backend/tests/unit/routes/test_settings_routes.py +1142 -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 +1002 -0
- package/backend/tests/unit/sandbox/__pycache__/test_sandbox_tools.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/sandbox/test_sandbox_tools.py +78 -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 +124 -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 +751 -0
- package/backend/tests/unit/test_access.py +45 -0
- package/backend/tests/unit/test_cli.py +124 -0
- package/backend/tests/unit/test_graph_runtime.py +72 -0
- package/backend/tests/unit/test_network.py +51 -0
- package/backend/tests/unit/test_state_sqlite_storage.py +159 -0
- package/backend/tests/unit/test_workspace_store.py +231 -0
- 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 +228 -0
- package/backend/tests/unit/tools/test_create_agent_tool.py +436 -0
- package/backend/tests/unit/tools/test_delete_tab_tool.py +116 -0
- package/backend/tests/unit/tools/test_edit_tool.py +115 -0
- package/backend/tests/unit/tools/test_exec_tool.py +81 -0
- package/backend/tests/unit/tools/test_fetch_tool.py +65 -0
- package/backend/tests/unit/tools/test_manage_prompts_tool.py +117 -0
- package/backend/tests/unit/tools/test_manage_providers_tool.py +460 -0
- package/backend/tests/unit/tools/test_manage_roles_tool.py +411 -0
- package/backend/tests/unit/tools/test_manage_settings_tool.py +611 -0
- package/backend/tests/unit/tools/test_read_tool.py +33 -0
- package/backend/tests/unit/tools/test_set_permissions_tool.py +595 -0
- package/backend/tests/unit/tools/test_todo_tool.py +37 -0
- package/backend/tests/unit/tools/test_tool_registry.py +194 -0
- package/backend/uv.lock +1144 -0
- package/bin/flowent.mjs +62 -36
- 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/datetime-eJqd0V2S.js +1 -0
- package/dist/frontend/assets/dialog-BOvHIBrg.js +1 -0
- package/dist/frontend/assets/elk-worker.min-C9JGDOE-.js +6312 -0
- package/dist/frontend/assets/graph-vendor-CHpVij2M.css +1 -0
- package/dist/frontend/assets/graph-vendor-DRq_-6fV.js +7 -0
- package/dist/frontend/assets/index-Biio-CoI.js +10 -0
- package/dist/frontend/assets/index-CmQvO7sl.css +1 -0
- package/dist/frontend/assets/layout.worker-jMHqAFbP.js +24 -0
- package/dist/frontend/assets/markdown-vendor-C9RtvaJh.js +29 -0
- package/dist/frontend/assets/modelParams-DcEhGnu0.js +1 -0
- package/dist/frontend/assets/react-vendor-mEs_JJxa.js +9 -0
- package/dist/frontend/assets/roles-BbIEIMeG.js +1 -0
- package/dist/frontend/assets/rolldown-runtime-BYbx6iT9.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/triState-DgLlKdRR.js +1 -0
- package/dist/frontend/assets/ui-vendor-UazN8rcv.js +51 -0
- package/dist/frontend/index.html +35 -0
- package/package.json +27 -41
- package/dist/.next/BUILD_ID +0 -1
- package/dist/.next/app-path-routes-manifest.json +0 -6
- package/dist/.next/build-manifest.json +0 -20
- package/dist/.next/package.json +0 -1
- package/dist/.next/prerender-manifest.json +0 -114
- package/dist/.next/required-server-files.json +0 -333
- package/dist/.next/routes-manifest.json +0 -69
- package/dist/.next/server/app/_global-error/page/app-paths-manifest.json +0 -3
- package/dist/.next/server/app/_global-error/page/build-manifest.json +0 -16
- package/dist/.next/server/app/_global-error/page/next-font-manifest.json +0 -6
- package/dist/.next/server/app/_global-error/page/react-loadable-manifest.json +0 -1
- package/dist/.next/server/app/_global-error/page/server-reference-manifest.json +0 -4
- package/dist/.next/server/app/_global-error/page.js +0 -9
- package/dist/.next/server/app/_global-error/page.js.map +0 -5
- package/dist/.next/server/app/_global-error/page.js.nft.json +0 -1
- package/dist/.next/server/app/_global-error/page_client-reference-manifest.js +0 -3
- package/dist/.next/server/app/_global-error.html +0 -1
- package/dist/.next/server/app/_global-error.meta +0 -15
- package/dist/.next/server/app/_global-error.rsc +0 -14
- package/dist/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +0 -5
- package/dist/.next/server/app/_global-error.segments/_full.segment.rsc +0 -14
- package/dist/.next/server/app/_global-error.segments/_head.segment.rsc +0 -5
- package/dist/.next/server/app/_global-error.segments/_index.segment.rsc +0 -5
- package/dist/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
- package/dist/.next/server/app/_not-found/page/app-paths-manifest.json +0 -3
- package/dist/.next/server/app/_not-found/page/build-manifest.json +0 -16
- package/dist/.next/server/app/_not-found/page/next-font-manifest.json +0 -10
- package/dist/.next/server/app/_not-found/page/react-loadable-manifest.json +0 -1
- package/dist/.next/server/app/_not-found/page/server-reference-manifest.json +0 -4
- package/dist/.next/server/app/_not-found/page.js +0 -13
- package/dist/.next/server/app/_not-found/page.js.map +0 -5
- package/dist/.next/server/app/_not-found/page.js.nft.json +0 -1
- package/dist/.next/server/app/_not-found/page_client-reference-manifest.js +0 -3
- package/dist/.next/server/app/_not-found.html +0 -1
- package/dist/.next/server/app/_not-found.meta +0 -16
- package/dist/.next/server/app/_not-found.rsc +0 -16
- package/dist/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
- package/dist/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
- package/dist/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
- package/dist/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
- package/dist/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
- package/dist/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
- package/dist/.next/server/app/icon.svg/route/app-paths-manifest.json +0 -3
- package/dist/.next/server/app/icon.svg/route/build-manifest.json +0 -9
- package/dist/.next/server/app/icon.svg/route.js +0 -6
- package/dist/.next/server/app/icon.svg/route.js.map +0 -5
- package/dist/.next/server/app/icon.svg/route.js.nft.json +0 -1
- package/dist/.next/server/app/icon.svg.meta +0 -1
- package/dist/.next/server/app/index.html +0 -1
- package/dist/.next/server/app/index.meta +0 -14
- package/dist/.next/server/app/index.rsc +0 -15
- package/dist/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -5
- package/dist/.next/server/app/index.segments/_full.segment.rsc +0 -15
- package/dist/.next/server/app/index.segments/_head.segment.rsc +0 -6
- package/dist/.next/server/app/index.segments/_index.segment.rsc +0 -5
- package/dist/.next/server/app/index.segments/_tree.segment.rsc +0 -3
- package/dist/.next/server/app/page/app-paths-manifest.json +0 -3
- package/dist/.next/server/app/page/build-manifest.json +0 -16
- package/dist/.next/server/app/page/next-font-manifest.json +0 -10
- package/dist/.next/server/app/page/react-loadable-manifest.json +0 -1
- package/dist/.next/server/app/page/server-reference-manifest.json +0 -4
- package/dist/.next/server/app/page.js +0 -14
- package/dist/.next/server/app/page.js.map +0 -5
- package/dist/.next/server/app/page.js.nft.json +0 -1
- package/dist/.next/server/app/page_client-reference-manifest.js +0 -3
- package/dist/.next/server/app-paths-manifest.json +0 -6
- package/dist/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +0 -3
- package/dist/.next/server/chunks/[root-of-the-server]__0vcj1q1._.js +0 -13
- package/dist/.next/server/chunks/[turbopack]_runtime.js +0 -903
- package/dist/.next/server/chunks/_next-internal_server_app_icon_svg_route_actions_0-0ehc~.js +0 -3
- package/dist/.next/server/chunks/ssr/05w9_next_dist_0ihu0u9._.js +0 -6
- package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_12u3mib._.js +0 -3
- package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_forbidden_04fbe_..js +0 -3
- package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_global-error_0brpl_..js +0 -3
- package/dist/.next/server/chunks/ssr/05w9_next_dist_client_components_builtin_unauthorized_0~2g66g.js +0 -3
- package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_0~cyr1_.js +0 -4
- package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_1105emf.js +0 -4
- package/dist/.next/server/chunks/ssr/05w9_next_dist_esm_build_templates_app-page_11uhyqv.js +0 -4
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0.t9_75._.js +0 -33
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0c0ud_z._.js +0 -3
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0f9_8d4._.js +0 -3
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0l5ko41._.js +0 -19
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0mn6z7i._.js +0 -3
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0npxxst._.js +0 -33
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0qjhaca._.js +0 -3
- package/dist/.next/server/chunks/ssr/[root-of-the-server]__0rwgw3s._.js +0 -3
- package/dist/.next/server/chunks/ssr/[turbopack]_runtime.js +0 -903
- package/dist/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +0 -3
- package/dist/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +0 -3
- package/dist/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +0 -3
- package/dist/.next/server/chunks/ssr/node_modules__pnpm_056~6.6._.js +0 -3
- package/dist/.next/server/chunks/ssr/node_modules__pnpm_0~j0k.e._.js +0 -33
- package/dist/.next/server/functions-config-manifest.json +0 -4
- package/dist/.next/server/middleware-build-manifest.js +0 -20
- package/dist/.next/server/middleware-manifest.json +0 -6
- package/dist/.next/server/next-font-manifest.js +0 -1
- package/dist/.next/server/next-font-manifest.json +0 -13
- package/dist/.next/server/pages/404.html +0 -1
- package/dist/.next/server/pages/500.html +0 -1
- package/dist/.next/server/pages-manifest.json +0 -4
- package/dist/.next/server/prefetch-hints.json +0 -1
- package/dist/.next/server/server-reference-manifest.js +0 -1
- package/dist/.next/server/server-reference-manifest.json +0 -5
- package/dist/.next/static/SMWpxFVvkpYFxY7uuFvGB/_buildManifest.js +0 -11
- package/dist/.next/static/SMWpxFVvkpYFxY7uuFvGB/_clientMiddlewareManifest.js +0 -1
- package/dist/.next/static/SMWpxFVvkpYFxY7uuFvGB/_ssgManifest.js +0 -1
- package/dist/.next/static/chunks/01qk2~bgf76vu.js +0 -1
- package/dist/.next/static/chunks/03~yq9q893hmn.js +0 -1
- package/dist/.next/static/chunks/080queev.r2uy.js +0 -31
- package/dist/.next/static/chunks/0v3lyuj75aq50.js +0 -1
- package/dist/.next/static/chunks/10b~xdx5c-i7s.js +0 -5
- package/dist/.next/static/chunks/14gla2ascffgv.css +0 -2
- package/dist/.next/static/chunks/turbopack-0m-970~qvs7sc.js +0 -1
- package/dist/.next/static/media/7178b3e590c64307-s.11.cyxs5p-0z~.woff2 +0 -0
- package/dist/.next/static/media/8a480f0b521d4e75-s.06d3mdzz5bre_.woff2 +0 -0
- package/dist/.next/static/media/caa3a2e1cccd8315-s.p.16t1db8_9y2o~.woff2 +0 -0
- package/dist/package.json +0 -88
- package/dist/server.js +0 -38
- /package/{dist/.next/server/app/icon.svg.body → backend/src/flowent/static/favicon.svg} +0 -0
- /package/dist/{.next/static/media/icon.0.r~afrtrocz9.svg → frontend/favicon.svg} +0 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Final
|
|
5
|
+
|
|
6
|
+
from flowent.settings import (
|
|
7
|
+
AssistantSettings,
|
|
8
|
+
EventLogSettings,
|
|
9
|
+
LeaderSettings,
|
|
10
|
+
ModelSettings,
|
|
11
|
+
Settings,
|
|
12
|
+
build_assistant_allow_network,
|
|
13
|
+
build_assistant_write_dirs,
|
|
14
|
+
build_default_model_params,
|
|
15
|
+
build_model_auto_compact_token_limit,
|
|
16
|
+
build_model_context_window_tokens,
|
|
17
|
+
build_model_input_image,
|
|
18
|
+
build_model_max_retries,
|
|
19
|
+
build_model_output_image,
|
|
20
|
+
build_model_params_from_mapping,
|
|
21
|
+
build_model_retry_backoff_cap_retries,
|
|
22
|
+
build_model_retry_initial_delay_seconds,
|
|
23
|
+
build_model_retry_max_delay_seconds,
|
|
24
|
+
build_model_retry_policy,
|
|
25
|
+
build_model_structured_output,
|
|
26
|
+
build_model_timeout_ms,
|
|
27
|
+
build_working_dir,
|
|
28
|
+
find_role,
|
|
29
|
+
serialize_settings,
|
|
30
|
+
validate_model_retry_backoff_settings,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
MISSING: Final = object()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True, slots=True)
|
|
37
|
+
class ResolvedSettingsUpdate:
|
|
38
|
+
working_dir: str
|
|
39
|
+
assistant: AssistantSettings
|
|
40
|
+
leader: LeaderSettings
|
|
41
|
+
model: ModelSettings
|
|
42
|
+
event_log: EventLogSettings
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def serialize_manage_settings(settings: Settings) -> dict[str, object]:
|
|
46
|
+
serialized = serialize_settings(settings)
|
|
47
|
+
return {
|
|
48
|
+
"app_data_dir": serialized["app_data_dir"],
|
|
49
|
+
"working_dir": serialized["working_dir"],
|
|
50
|
+
"assistant": serialized["assistant"],
|
|
51
|
+
"leader": serialized["leader"],
|
|
52
|
+
"model": serialized["model"],
|
|
53
|
+
"event_log": serialized["event_log"],
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _resolve_role_name(
|
|
58
|
+
settings: Settings,
|
|
59
|
+
*,
|
|
60
|
+
current_role_name: str,
|
|
61
|
+
next_role_name: str | None,
|
|
62
|
+
field_name: str,
|
|
63
|
+
) -> str:
|
|
64
|
+
if next_role_name is None:
|
|
65
|
+
return current_role_name
|
|
66
|
+
normalized_role_name = next_role_name.strip()
|
|
67
|
+
if not normalized_role_name:
|
|
68
|
+
raise ValueError(f"{field_name} must not be empty")
|
|
69
|
+
if find_role(settings, normalized_role_name) is None:
|
|
70
|
+
raise ValueError(f"Role '{normalized_role_name}' not found")
|
|
71
|
+
return normalized_role_name
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def resolve_settings_update(
|
|
75
|
+
settings: Settings,
|
|
76
|
+
*,
|
|
77
|
+
working_dir: str | None = None,
|
|
78
|
+
assistant_role_name: str | None = None,
|
|
79
|
+
assistant_allow_network: object = MISSING,
|
|
80
|
+
assistant_write_dirs: object = MISSING,
|
|
81
|
+
leader_role_name: str | None = None,
|
|
82
|
+
active_provider_id: str | None = None,
|
|
83
|
+
active_model: str | None = None,
|
|
84
|
+
context_window_tokens: object = MISSING,
|
|
85
|
+
input_image: object = MISSING,
|
|
86
|
+
output_image: object = MISSING,
|
|
87
|
+
structured_output: object = MISSING,
|
|
88
|
+
max_retries: object = MISSING,
|
|
89
|
+
retry_policy: object = MISSING,
|
|
90
|
+
timeout_ms: object = MISSING,
|
|
91
|
+
retry_initial_delay_seconds: object = MISSING,
|
|
92
|
+
retry_max_delay_seconds: object = MISSING,
|
|
93
|
+
retry_backoff_cap_retries: object = MISSING,
|
|
94
|
+
auto_compact_token_limit: object = MISSING,
|
|
95
|
+
model_params: object = MISSING,
|
|
96
|
+
timestamp_format: str | None = None,
|
|
97
|
+
assistant_role_field_name: str = "assistant.role_name",
|
|
98
|
+
assistant_allow_network_field_name: str = "assistant.allow_network",
|
|
99
|
+
assistant_write_dirs_field_name: str = "assistant.write_dirs",
|
|
100
|
+
leader_role_field_name: str = "leader.role_name",
|
|
101
|
+
working_dir_field_name: str = "working_dir",
|
|
102
|
+
retry_policy_field_name: str = "model.retry_policy",
|
|
103
|
+
timeout_ms_field_name: str = "model.timeout_ms",
|
|
104
|
+
max_retries_field_name: str = "model.max_retries",
|
|
105
|
+
retry_initial_delay_seconds_field_name: str = "model.retry_initial_delay_seconds",
|
|
106
|
+
retry_max_delay_seconds_field_name: str = "model.retry_max_delay_seconds",
|
|
107
|
+
retry_backoff_cap_retries_field_name: str = "model.retry_backoff_cap_retries",
|
|
108
|
+
input_image_field_name: str = "model.input_image",
|
|
109
|
+
output_image_field_name: str = "model.output_image",
|
|
110
|
+
structured_output_field_name: str = "model.structured_output",
|
|
111
|
+
context_window_tokens_field_name: str = "model.context_window_tokens",
|
|
112
|
+
auto_compact_token_limit_field_name: str = "model.auto_compact_token_limit",
|
|
113
|
+
) -> ResolvedSettingsUpdate:
|
|
114
|
+
next_working_dir = (
|
|
115
|
+
settings.working_dir
|
|
116
|
+
if working_dir is None
|
|
117
|
+
else build_working_dir(working_dir, field_name=working_dir_field_name)
|
|
118
|
+
)
|
|
119
|
+
next_assistant_role_name = _resolve_role_name(
|
|
120
|
+
settings,
|
|
121
|
+
current_role_name=settings.assistant.role_name,
|
|
122
|
+
next_role_name=assistant_role_name,
|
|
123
|
+
field_name=assistant_role_field_name,
|
|
124
|
+
)
|
|
125
|
+
next_assistant_allow_network = (
|
|
126
|
+
settings.assistant.allow_network
|
|
127
|
+
if assistant_allow_network is MISSING
|
|
128
|
+
else build_assistant_allow_network(
|
|
129
|
+
assistant_allow_network,
|
|
130
|
+
field_name=assistant_allow_network_field_name,
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
next_assistant_write_dirs = (
|
|
134
|
+
list(settings.assistant.write_dirs)
|
|
135
|
+
if assistant_write_dirs is MISSING
|
|
136
|
+
else build_assistant_write_dirs(
|
|
137
|
+
assistant_write_dirs,
|
|
138
|
+
field_name=assistant_write_dirs_field_name,
|
|
139
|
+
base_dir=next_working_dir,
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
next_leader_role_name = _resolve_role_name(
|
|
144
|
+
settings,
|
|
145
|
+
current_role_name=settings.leader.role_name,
|
|
146
|
+
next_role_name=leader_role_name,
|
|
147
|
+
field_name=leader_role_field_name,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
next_active_provider_id = (
|
|
151
|
+
settings.model.active_provider_id
|
|
152
|
+
if active_provider_id is None
|
|
153
|
+
else active_provider_id
|
|
154
|
+
)
|
|
155
|
+
next_active_model = (
|
|
156
|
+
settings.model.active_model if active_model is None else active_model
|
|
157
|
+
)
|
|
158
|
+
next_context_window_tokens = (
|
|
159
|
+
settings.model.context_window_tokens
|
|
160
|
+
if context_window_tokens is MISSING
|
|
161
|
+
else build_model_context_window_tokens(
|
|
162
|
+
context_window_tokens,
|
|
163
|
+
field_name=context_window_tokens_field_name,
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
next_input_image = (
|
|
167
|
+
settings.model.input_image
|
|
168
|
+
if input_image is MISSING
|
|
169
|
+
else build_model_input_image(
|
|
170
|
+
input_image,
|
|
171
|
+
field_name=input_image_field_name,
|
|
172
|
+
)
|
|
173
|
+
)
|
|
174
|
+
next_output_image = (
|
|
175
|
+
settings.model.output_image
|
|
176
|
+
if output_image is MISSING
|
|
177
|
+
else build_model_output_image(
|
|
178
|
+
output_image,
|
|
179
|
+
field_name=output_image_field_name,
|
|
180
|
+
)
|
|
181
|
+
)
|
|
182
|
+
next_structured_output = (
|
|
183
|
+
settings.model.structured_output
|
|
184
|
+
if structured_output is MISSING
|
|
185
|
+
else build_model_structured_output(
|
|
186
|
+
structured_output,
|
|
187
|
+
field_name=structured_output_field_name,
|
|
188
|
+
)
|
|
189
|
+
)
|
|
190
|
+
next_retry_policy = (
|
|
191
|
+
settings.model.retry_policy
|
|
192
|
+
if retry_policy is MISSING
|
|
193
|
+
else build_model_retry_policy(
|
|
194
|
+
retry_policy,
|
|
195
|
+
field_name=retry_policy_field_name,
|
|
196
|
+
)
|
|
197
|
+
)
|
|
198
|
+
next_timeout_ms = (
|
|
199
|
+
settings.model.timeout_ms
|
|
200
|
+
if timeout_ms is MISSING
|
|
201
|
+
else build_model_timeout_ms(
|
|
202
|
+
timeout_ms,
|
|
203
|
+
field_name=timeout_ms_field_name,
|
|
204
|
+
)
|
|
205
|
+
)
|
|
206
|
+
next_max_retries = (
|
|
207
|
+
settings.model.max_retries
|
|
208
|
+
if max_retries is MISSING
|
|
209
|
+
else build_model_max_retries(
|
|
210
|
+
max_retries,
|
|
211
|
+
field_name=max_retries_field_name,
|
|
212
|
+
)
|
|
213
|
+
)
|
|
214
|
+
next_retry_initial_delay_seconds = (
|
|
215
|
+
settings.model.retry_initial_delay_seconds
|
|
216
|
+
if retry_initial_delay_seconds is MISSING
|
|
217
|
+
else build_model_retry_initial_delay_seconds(
|
|
218
|
+
retry_initial_delay_seconds,
|
|
219
|
+
field_name=retry_initial_delay_seconds_field_name,
|
|
220
|
+
)
|
|
221
|
+
)
|
|
222
|
+
next_retry_max_delay_seconds = (
|
|
223
|
+
settings.model.retry_max_delay_seconds
|
|
224
|
+
if retry_max_delay_seconds is MISSING
|
|
225
|
+
else build_model_retry_max_delay_seconds(
|
|
226
|
+
retry_max_delay_seconds,
|
|
227
|
+
field_name=retry_max_delay_seconds_field_name,
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
next_retry_backoff_cap_retries = (
|
|
231
|
+
settings.model.retry_backoff_cap_retries
|
|
232
|
+
if retry_backoff_cap_retries is MISSING
|
|
233
|
+
else build_model_retry_backoff_cap_retries(
|
|
234
|
+
retry_backoff_cap_retries,
|
|
235
|
+
field_name=retry_backoff_cap_retries_field_name,
|
|
236
|
+
)
|
|
237
|
+
)
|
|
238
|
+
next_auto_compact_token_limit = (
|
|
239
|
+
settings.model.auto_compact_token_limit
|
|
240
|
+
if auto_compact_token_limit is MISSING
|
|
241
|
+
else build_model_auto_compact_token_limit(
|
|
242
|
+
auto_compact_token_limit,
|
|
243
|
+
field_name=auto_compact_token_limit_field_name,
|
|
244
|
+
)
|
|
245
|
+
)
|
|
246
|
+
validate_model_retry_backoff_settings(
|
|
247
|
+
retry_initial_delay_seconds=next_retry_initial_delay_seconds,
|
|
248
|
+
retry_max_delay_seconds=next_retry_max_delay_seconds,
|
|
249
|
+
)
|
|
250
|
+
next_model_params = (
|
|
251
|
+
settings.model.params
|
|
252
|
+
if model_params is MISSING
|
|
253
|
+
else build_model_params_from_mapping(model_params)
|
|
254
|
+
or build_default_model_params()
|
|
255
|
+
)
|
|
256
|
+
next_timestamp_format = (
|
|
257
|
+
settings.event_log.timestamp_format
|
|
258
|
+
if timestamp_format is None
|
|
259
|
+
else timestamp_format
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
return ResolvedSettingsUpdate(
|
|
263
|
+
working_dir=next_working_dir,
|
|
264
|
+
assistant=AssistantSettings(
|
|
265
|
+
role_name=next_assistant_role_name,
|
|
266
|
+
allow_network=next_assistant_allow_network,
|
|
267
|
+
write_dirs=next_assistant_write_dirs,
|
|
268
|
+
),
|
|
269
|
+
leader=LeaderSettings(role_name=next_leader_role_name),
|
|
270
|
+
model=ModelSettings(
|
|
271
|
+
active_provider_id=next_active_provider_id,
|
|
272
|
+
active_model=next_active_model,
|
|
273
|
+
input_image=next_input_image,
|
|
274
|
+
output_image=next_output_image,
|
|
275
|
+
structured_output=next_structured_output,
|
|
276
|
+
context_window_tokens=next_context_window_tokens,
|
|
277
|
+
params=next_model_params,
|
|
278
|
+
timeout_ms=next_timeout_ms,
|
|
279
|
+
retry_policy=next_retry_policy,
|
|
280
|
+
max_retries=next_max_retries,
|
|
281
|
+
retry_initial_delay_seconds=next_retry_initial_delay_seconds,
|
|
282
|
+
retry_max_delay_seconds=next_retry_max_delay_seconds,
|
|
283
|
+
retry_backoff_cap_retries=next_retry_backoff_cap_retries,
|
|
284
|
+
auto_compact_token_limit=next_auto_compact_token_limit,
|
|
285
|
+
),
|
|
286
|
+
event_log=EventLogSettings(timestamp_format=next_timestamp_format),
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def apply_resolved_settings_update(
|
|
291
|
+
settings: Settings,
|
|
292
|
+
resolved: ResolvedSettingsUpdate,
|
|
293
|
+
) -> None:
|
|
294
|
+
settings.working_dir = resolved.working_dir
|
|
295
|
+
settings.assistant = resolved.assistant
|
|
296
|
+
settings.leader = resolved.leader
|
|
297
|
+
settings.model = resolved.model
|
|
298
|
+
settings.event_log = resolved.event_log
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sqlite3
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
STATE_DB_FILENAME = "state.sqlite"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_state_db_path() -> Path:
|
|
10
|
+
from flowent import settings as settings_module
|
|
11
|
+
|
|
12
|
+
return settings_module.get_app_data_dir_path() / STATE_DB_FILENAME
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_images_dir() -> Path:
|
|
16
|
+
from flowent import settings as settings_module
|
|
17
|
+
|
|
18
|
+
return settings_module.get_app_data_dir_path() / "assets" / "images"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_legacy_workspace_file_path() -> Path:
|
|
22
|
+
from flowent import settings as settings_module
|
|
23
|
+
|
|
24
|
+
return settings_module.get_app_data_dir_path() / "workspace.json"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_legacy_image_assets_dir() -> Path:
|
|
28
|
+
from flowent import settings as settings_module
|
|
29
|
+
|
|
30
|
+
return settings_module.get_app_data_dir_path() / "image-assets"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def open_state_db(*, create: bool) -> sqlite3.Connection | None:
|
|
34
|
+
db_path = get_state_db_path()
|
|
35
|
+
if not create and not db_path.exists():
|
|
36
|
+
return None
|
|
37
|
+
if create:
|
|
38
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
39
|
+
try:
|
|
40
|
+
connection = sqlite3.connect(db_path, timeout=30.0)
|
|
41
|
+
except sqlite3.Error as exc:
|
|
42
|
+
raise RuntimeError(f"Failed to open state store `{db_path}`: {exc}") from exc
|
|
43
|
+
connection.row_factory = sqlite3.Row
|
|
44
|
+
try:
|
|
45
|
+
connection.execute("PRAGMA foreign_keys = ON")
|
|
46
|
+
connection.execute("PRAGMA journal_mode = WAL")
|
|
47
|
+
_ensure_schema(connection)
|
|
48
|
+
except sqlite3.Error as exc:
|
|
49
|
+
connection.close()
|
|
50
|
+
raise RuntimeError(
|
|
51
|
+
f"Failed to initialize state store `{db_path}`: {exc}"
|
|
52
|
+
) from exc
|
|
53
|
+
return connection
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _ensure_schema(connection: sqlite3.Connection) -> None:
|
|
57
|
+
connection.executescript(
|
|
58
|
+
"""
|
|
59
|
+
CREATE TABLE IF NOT EXISTS tabs (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
payload TEXT NOT NULL,
|
|
62
|
+
updated_at REAL NOT NULL
|
|
63
|
+
);
|
|
64
|
+
CREATE TABLE IF NOT EXISTS nodes (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
payload TEXT NOT NULL,
|
|
67
|
+
tab_id TEXT,
|
|
68
|
+
node_type TEXT NOT NULL,
|
|
69
|
+
updated_at REAL NOT NULL
|
|
70
|
+
);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_nodes_tab_id ON nodes(tab_id);
|
|
72
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
73
|
+
id TEXT PRIMARY KEY,
|
|
74
|
+
payload TEXT NOT NULL,
|
|
75
|
+
tab_id TEXT NOT NULL
|
|
76
|
+
);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_edges_tab_id ON edges(tab_id);
|
|
78
|
+
CREATE TABLE IF NOT EXISTS blueprints (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
payload TEXT NOT NULL,
|
|
81
|
+
updated_at REAL NOT NULL
|
|
82
|
+
);
|
|
83
|
+
CREATE TABLE IF NOT EXISTS image_assets (
|
|
84
|
+
id TEXT PRIMARY KEY,
|
|
85
|
+
stored_name TEXT NOT NULL,
|
|
86
|
+
mime_type TEXT NOT NULL,
|
|
87
|
+
width INTEGER,
|
|
88
|
+
height INTEGER,
|
|
89
|
+
original_name TEXT
|
|
90
|
+
);
|
|
91
|
+
CREATE TABLE IF NOT EXISTS llm_request_records (
|
|
92
|
+
id TEXT PRIMARY KEY,
|
|
93
|
+
ended_at REAL NOT NULL,
|
|
94
|
+
payload TEXT NOT NULL
|
|
95
|
+
);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_llm_request_records_ended_at
|
|
97
|
+
ON llm_request_records(ended_at);
|
|
98
|
+
CREATE TABLE IF NOT EXISTS compact_records (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
ended_at REAL NOT NULL,
|
|
101
|
+
payload TEXT NOT NULL
|
|
102
|
+
);
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_compact_records_ended_at
|
|
104
|
+
ON compact_records(ended_at);
|
|
105
|
+
CREATE TABLE IF NOT EXISTS mcp_snapshots (
|
|
106
|
+
server_name TEXT PRIMARY KEY,
|
|
107
|
+
payload TEXT NOT NULL
|
|
108
|
+
);
|
|
109
|
+
CREATE TABLE IF NOT EXISTS mcp_activities (
|
|
110
|
+
id TEXT PRIMARY KEY,
|
|
111
|
+
server_name TEXT NOT NULL,
|
|
112
|
+
ended_at REAL NOT NULL,
|
|
113
|
+
payload TEXT NOT NULL
|
|
114
|
+
);
|
|
115
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_activities_server_name
|
|
116
|
+
ON mcp_activities(server_name);
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_mcp_activities_ended_at
|
|
118
|
+
ON mcp_activities(ended_at);
|
|
119
|
+
"""
|
|
120
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{q as r}from"./ui-vendor-UazN8rcv.js";import{A as i,C as a,D as o,E as s,M as c,N as l,O as u,S as d,T as ee,_ as te,b as ne,g as re,h as ie,j as ae,k as oe,m as f,t as p,v as se,w as ce,x as m,y as le}from"./WorkspacePanels-BZxBw8M5.js";import{B as h,L as g,P as ue,R as _,S as v,b as y,g as b,h as x,m as de,p as fe,rt as S,tt as C,x as pe}from"./index-Biio-CoI.js";async function me(e){return h(`/api/assistant/message`,{method:`POST`,body:e,errorMessage:`Failed to send Assistant message`})}async function he(e){return h(`/api/assistant/messages/${e}/retry`,{method:`POST`,errorMessage:`Failed to retry Assistant message`})}var w=e(t(),1);function T(e){for(let t of e.values())if(t.node_type===`assistant`)return t;return null}function ge(e){return T(e)?.id??null}var E=`assistant`;function _e(){return s(E)}function ve(e){return o(E,e)}function ye(e){ee(E,e)}function D(e={}){let{bottomInset:t=0}=e,{agents:n}=b(),{connected:i}=de(),{agentHistories:o,clearAgentHistory:s,clearHistorySnapshot:c,historyInvalidatedAt:ee,historyClearedAt:ae,historySnapshots:p,streamingDeltas:h}=x(),{activeToolCalls:S}=fe(),[C,T]=(0,w.useState)(null),[E,D]=(0,w.useState)(0),[O,k]=(0,w.useState)(``),[A,j]=(0,w.useState)([]),[M,N]=(0,w.useState)(null),[be,xe]=(0,w.useState)(!1),[Se,Ce]=(0,w.useState)(null),[P,we]=(0,w.useState)(!1),[F,I]=(0,w.useState)([]),[L,R]=(0,w.useState)(null),z=(0,w.useRef)(null),B=(0,w.useRef)(!0),Te=(0,w.useRef)([]),V=(0,w.useRef)(null),H=(0,w.useRef)(!1),U=(0,w.useMemo)(()=>ge(n),[n]),W=(0,w.useMemo)(()=>U?n.get(U)??null:null,[n,U]),Ee=W?.capabilities?.input_image??!1,De=U?ae.get(U)??0:0,Oe=U?ee.get(U)??0:0,G=U?p.get(U)??null:null,ke=A.some(e=>e.status===`uploading`),Ae=A.filter(le),K=(0,w.useSyncExternalStore)(ve,_e,_e),q=M===null?null:K[M]??null,je=q!==null&&O===q.text&&se(A,q),J=W?.state??C?.state??null,Me=(0,w.useCallback)(async e=>{let t=e.pendingMessageTimestamp??Date.now(),n=ie(e.content,e.parts,t);we(!0),I(e=>[...e,n]);try{let n=await me({content:e.content,parts:e.parts});return n.status===`command_executed`?I(n=>y(n,{content:e.content,timestamp:t})):n.message_id&&I(r=>r.map(r=>r.timestamp===t&&r.content===e.content?{...r,message_id:n.message_id}:r)),ye(e.history),e.restoreDraft&&d(e.restoreDraft.images),!0}catch(n){return I(n=>y(n,{content:e.content,timestamp:t})),e.restoreDraft&&(k(e.restoreDraft.input),j(e.restoreDraft.images),N(e.restoreDraft.historyCursor)),r.error(n instanceof Error?n.message:`Failed to send message`),!1}finally{we(!1)}},[]),Y=(0,w.useCallback)((e,t)=>{N(t),k(e?.text??``),j(e?a(e):[])},[]),Ne=(0,w.useCallback)(e=>{N(null),k(e)},[]);(0,w.useEffect)(()=>{Te.current=A},[A]),(0,w.useEffect)(()=>{V.current=L},[L]),(0,w.useEffect)(()=>()=>{d(Te.current)},[]),(0,w.useEffect)(()=>{De&&(I([]),R(null),T(e=>e&&{...e,history:u(e.history)}),D(Date.now()))},[De]),(0,w.useEffect)(()=>{Oe&&(I([]),G&&(T(e=>e&&{...e,history:G}),D(Date.now())))},[Oe,G]),(0,w.useEffect)(()=>{let e=V.current;!e||e.send_failed||e.target_id!==U||J!==e.target_state&&R({...e,target_state:J})},[U,J]),(0,w.useEffect)(()=>{let e=V.current;!e||e.send_failed||!U||e.target_id!==U||J!==`idle`||P||H.current||(H.current=!0,R(null),Me({content:e.content,parts:e.parts??[],history:e.history_entry,pendingMessageTimestamp:e.timestamp}).then(t=>{H.current=!1,t||R({...e,send_failed:!0,target_state:`error`})}).catch(()=>{H.current=!1,R({...e,send_failed:!0,target_state:`error`})}))},[U,J,P,Me]),(0,w.useEffect)(()=>{if(!i||!U){T(null);return}let e=new AbortController,t=!1;return(async()=>{s(U);try{let n=await g(U,e.signal);if(t||!n)return;T(n),D(Date.now()),c(U)}catch{!t&&!e.signal.aborted&&r.error(`Failed to load Assistant history`)}})(),()=>{t=!0,e.abort()}},[De,Oe,U,s,c,i]);let X=(0,w.useMemo)(()=>U?oe({history:G??C?.history??[],incremental:o.get(U),deltas:h.get(U),fetchedAt:E||Date.now()}):[],[o,G,C,E,h,U]);(0,w.useEffect)(()=>{if(!U||F.length===0)return;let e=X.filter(e=>e.type===`ReceivedMessage`&&e.from_id===`human`&&(!!e.content||!!e.message_id||!!e.parts?.length));e.length!==0&&I(t=>e.reduce((e,t)=>y(e,{content:t.content??pe(t.parts,t.content),messageId:t.message_id}),t))},[U,X,F.length]);let Z=(0,w.useMemo)(()=>[...X,...L?[{...L}]:[],...F.map(e=>({...e}))],[X,F,L]),Q=(0,w.useMemo)(()=>{let e=F.length+ +!!L,t=U?h.get(U)??[]:[],n=i&&(e>0||W?.state===`running`||W?.state===`sleeping`||S.has(U??``)||t.length>0),r=[...Z].map((e,t)=>({item:e,index:t})).reverse().find(({item:e})=>e.type===`PendingHumanMessage`?!0:e.type===`ReceivedMessage`&&e.from_id===`human`&&v(e.parts,e.content).length>0)?.index,a=r===void 0?[]:Z.slice(r+1),o=a.some(e=>e.type===`AssistantText`&&v(e.parts,e.content).length>0),s=[...a].reverse().find(e=>e.type===`ToolCall`&&e.streaming===!0),c=(U?S.get(U)??null:null)??s?.tool_name??null;return{running:n,runningHint:n&&r!==void 0&&!o?{label:c?`Running tools...`:`Thinking...`,toolName:c}:null}},[S,U,W?.state,i,F.length,L,h,Z]);(0,w.useLayoutEffect)(()=>{let e=z.current;!e||!B.current||(e.scrollTop=e.scrollHeight)},[t,Q.runningHint?`${Q.runningHint.label}:${Q.runningHint.toolName??``}`:``,Z]),(0,w.useLayoutEffect)(()=>{let e=z.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>{B.current&&(e.scrollTop=e.scrollHeight)});return t.observe(e),()=>{t.disconnect()}},[]);let Pe=e=>{B.current=ne(e.currentTarget)},$=async(e={})=>{let t=O.trim();if(!t&&Ae.length===0||ke||P)return;let n=f(t,Ae),i=O,a=A,o=M,s=Date.now(),c=t||pe(n),l={text:i,images:ce(a),timestamp:s},u=e.deferWhenBusy&&U&&V.current?.target_id===U&&(J===`error`||J===`terminated`);if(e.deferWhenBusy&&U&&(J===`running`||J===`sleeping`||u)){R(re({content:c,historyEntry:l,historyScope:`assistant`,parts:n,targetId:U,targetState:J,timestamp:s})),N(null),k(``),j([]),d(a);return}if(J===`error`||J===`terminated`){r.error(`Resolve the current chat before sending`);return}N(null),k(``),j([]),await Me({content:c,parts:n,history:l,pendingMessageTimestamp:s,restoreDraft:{input:i,images:a,historyCursor:o}})},Fe=(0,w.useCallback)(async e=>{if(N(null),!Ee){r.error(`Current model does not support image input`);return}let t=Array.from(e).filter(e=>e.type.startsWith(`image/`));if(t.length===0)return;let n=await te(t);j(e=>[...e,...n]),await Promise.all(n.map(async(e,n)=>{let i=t[n];if(i)try{let t=await l(i);j(n=>n.map(n=>n.id===e.id?{...n,assetId:t.id,mimeType:t.mime_type,width:typeof t.width==`number`?t.width:n.width,height:typeof t.height==`number`?t.height:n.height,status:`ready`}:n))}catch(t){m(e),j(t=>t.filter(t=>t.id!==e.id)),r.error(t instanceof Error?t.message:`Failed to upload image`)}}))},[Ee]),Ie=(0,w.useCallback)(e=>{N(null),j(t=>{let n=t.find(t=>t.id===e);return n&&m(n),t.filter(t=>t.id!==e)})},[]),Le=(0,w.useCallback)((e,t)=>{if(K.length===0)return!1;let n=t.start,r=t.end,i=O.length===0&&A.length===0,a=typeof n==`number`&&typeof r==`number`&&n===r&&(n===0||n===O.length);if(!i&&!(q!==null&&je&&a))return!1;if(M===null){if(e!==-1)return!1;let t=K.length-1;return Y(K[t]??null,t),!0}if(e===-1){let e=Math.max(M-1,0);return Y(K[e]??null,e),!0}if(M>=K.length-1)return Y(null,null),!0;let o=M+1;return Y(K[o]??null,o),!0},[q,A,M,O,K,je,Y]),Re=async()=>{if(!(!U||be)){xe(!0);try{await ue(U),I([]),R(null),s(U),T(await g(U)),D(Date.now()),c(U)}catch(e){r.error(e instanceof Error?e.message:`Failed to clear assistant chat`)}finally{xe(!1)}}},ze=(0,w.useCallback)(async()=>{if(U&&!(W?.state!==`running`&&W?.state!==`sleeping`)){await _(U);for(let e=0;e<25;e+=1){let e=await g(U);if(!e)break;if(T(e),D(Date.now()),e.state!==`running`&&e.state!==`sleeping`)return;await new Promise(e=>window.setTimeout(e,120))}throw Error(`Assistant did not stop in time`)}},[U,W?.state]),Be=async e=>{if(!(!U||!e||Se)){Ce(e);try{try{await ze(),await he(e)}catch(e){r.error(e instanceof Error?e.message:`Failed to retry Assistant message`);return}s(U);try{let e=await g(U);e&&(T(e),D(Date.now()),c(U))}catch{return}}finally{Ce(null)}}},Ve=(0,w.useCallback)(async()=>{if(!U)return;await _(U),I([]),s(U);let e=await g(U);e&&(T(e),D(Date.now()),c(U))},[U,s,c]);return{addImages:Fe,connected:i,draftImages:A,handleKeyDown:e=>{if(e.key===`Tab`&&!e.shiftKey){(O.trim()||Ae.length>0)&&(e.preventDefault(),$({deferWhenBusy:!0}));return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),$())},hasUploadingImages:ke,input:O,isBrowsingInputHistory:je,navigateInputHistory:Le,onMessagesScroll:Pe,removeImage:Ie,retryMessage:Be,retryingMessageId:Se,scrollRef:z,clearing:be,sending:P,clearChat:Re,cancelPendingSend:(0,w.useCallback)(e=>{R(t=>t?.id===e?null:t)},[]),sendMessage:$,setInput:Ne,stopAssistant:Ve,supportsInputImage:Ee,timelineItems:Z,assistantActivity:Q}}var O=n();function k({onOpenDetails:e}){let{agents:t}=b(),[n,a]=(0,w.useState)(!1),{height:o,ref:s}=i(),{addImages:l=async()=>{},assistantActivity:u={running:!1,runningHint:null},clearChat:d,cancelPendingSend:ee,clearing:te=!1,connected:ne,draftImages:re=[],handleKeyDown:ie,hasUploadingImages:oe=!1,input:f,isBrowsingInputHistory:p,navigateInputHistory:se,onMessagesScroll:ce,removeImage:m=()=>{},retryMessage:le,retryingMessageId:h,scrollRef:g,sending:ue,sendMessage:_,setInput:v,stopAssistant:y,supportsInputImage:x=!1,timelineItems:de}=D({bottomInset:o}),fe=Array.from(t.values()).find(e=>e.node_type===`assistant`)?.role_name??null;return(0,O.jsxs)(`div`,{className:S(`relative flex h-full flex-col overflow-hidden bg-surface-overlay text-foreground`),children:[(0,O.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,O.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,O.jsx)(`div`,{"aria-hidden":`true`,className:S(`pointer-events-none absolute inset-0 z-20 border transition-[opacity,border-color,box-shadow] duration-300`,u.running?`animate-pulse shadow-lg shadow-ring/5`:`opacity-0`,u.running&&`border-ring/25 opacity-100 shadow-ring/10`)}),(0,O.jsx)(A,{connected:ne,onClearChat:()=>void d(),onOpenDetails:e,roleName:fe,clearing:te}),(0,O.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,O.jsx)(ae,{allowHumanMessageRetry:!0,bottomInset:o,items:de,nodes:t,onRetryHumanMessage:e=>void le(e),onCancelPendingSend:ee,onScroll:ce,retryImageInputEnabled:x,retryingMessageId:h,runningHint:u.runningHint,scrollRef:g}),(0,O.jsx)(`div`,{ref:s,style:{paddingBottom:`calc(10px + env(safe-area-inset-bottom, 0px))`},className:`pointer-events-none absolute inset-x-0 bottom-0 z-10 bg-gradient-to-b from-transparent via-background/70 to-background/95 px-2.5 pt-8`,children:(0,O.jsx)(`div`,{className:`mx-auto w-full max-w-3xl`,children:(0,O.jsx)(c,{busy:u.running,disabled:!f.trim()&&re.length===0||oe||ue,commandsEnabled:!0,images:re,imageInputEnabled:x,input:f,onAddImages:e=>void l(e),onChange:v,onNavigateHistory:se,onKeyDown:ie,onRemoveImage:m,onSend:()=>void _(),onStop:()=>{a(!0),y().catch(e=>{r.error(e instanceof Error?e.message:`Failed to stop Assistant`)}).finally(()=>{a(!1)})},overlay:!0,stopping:n,suppressCommandNavigation:p,targetLabel:`Assistant`})})})]})]})}function A({clearing:e,connected:t,onClearChat:n,onOpenDetails:r,roleName:i}){return(0,O.jsxs)(`div`,{className:`relative z-10 flex flex-wrap items-center gap-2.5 border-b border-border px-3.5 py-2.5`,children:[(0,O.jsxs)(`div`,{className:`flex min-w-[220px] flex-1 items-center gap-2`,children:[(0,O.jsx)(`div`,{className:`shrink-0 text-[14px] font-semibold leading-6 text-foreground`,children:`Assistant`}),i?(0,O.jsxs)(`span`,{className:`min-w-0 truncate rounded-full border border-border bg-accent/35 px-2 py-0.5 text-[10px] font-medium leading-4 text-muted-foreground/78`,children:[`Role: `,i]}):null,(0,O.jsx)(j,{connected:t})]}),(0,O.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,O.jsx)(C,{type:`button`,size:`sm`,variant:`outline`,disabled:e,onClick:n,children:e?`Clearing...`:`Clear Chat`}),(0,O.jsx)(C,{type:`button`,size:`sm`,variant:`outline`,disabled:!r,onClick:r,children:`Assistant Details`})]})]})}function j({connected:e}){return(0,O.jsx)(`span`,{className:S(`rounded-full border px-2.5 py-0.5 text-[9px] font-medium transition-colors`,e?`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`:`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`),children:e?`Online`:`Connecting...`})}function M(){let{agents:e}=b(),t=T(e),[n,r]=(0,w.useState)(!1);return(0,O.jsx)(`div`,{className:`flex h-full flex-col min-h-0`,children:n&&t?(0,O.jsx)(`div`,{className:`h-full overflow-hidden p-6`,children:(0,O.jsx)(`div`,{className:`h-full overflow-hidden rounded-xl border border-border bg-surface-overlay/90 shadow-md`,children:(0,O.jsx)(p,{agent:t,onClose:()=>r(!1)})})}):(0,O.jsx)(k,{onOpenDetails:t?()=>r(!0):void 0})})}export{M as AssistantPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{dt as r,nn as i,q as a,tt as o}from"./ui-vendor-UazN8rcv.js";import{B as s,J as c,s as l,tt as u}from"./index-Biio-CoI.js";import{l as d,s as f}from"./surface-Bzr1FRG4.js";import{c as p,n as m,r as h,s as g}from"./PageScaffold-DteOA8V7.js";import{t as _}from"./datetime-eJqd0V2S.js";async function v(){return s(`/api/settings/telegram`,{errorMessage:`Failed to fetch Telegram settings`})}async function y(e){return s(`/api/settings/telegram`,{method:`PATCH`,body:e,errorMessage:`Failed to save Telegram settings`})}async function b(e){return s(`/api/settings/telegram/approve/${e}`,{method:`POST`,errorMessage:`Failed to approve Telegram chat`})}async function x(e){return s(`/api/settings/telegram/pending/${e}`,{method:`DELETE`,errorMessage:`Failed to remove pending Telegram chat`})}async function S(e){return s(`/api/settings/telegram/chat/${e}`,{method:`DELETE`,errorMessage:`Failed to remove Telegram chat`})}var C=e(t(),1),w=n();function T(e){return e?_(e,{fallback:`—`,unit:`seconds`}):`—`}function E(e){return e.display_name.trim()?e.display_name.trim():e.username?.trim()?`@${e.username.trim()}`:`Unknown chat`}function D(){let{data:e,isLoading:t,mutate:n}=p(`telegramSettings`,v),[s,_]=(0,C.useState)(!1),[D,O]=(0,C.useState)(``),[k,A]=(0,C.useState)(!1),j=(0,C.useMemo)(()=>!!e?.bot_token,[e?.bot_token]),M=async()=>{if(e){_(!0);try{let e={};k&&(e.bot_token=D.trim()),n((await y(e)).telegram,!1),O(``),A(!1),a.success(`Telegram settings saved`)}catch{a.error(`Failed to save Telegram settings`)}finally{_(!1)}}},N=async e=>{try{n((await b(e)).telegram,!1),a.success(`Telegram chat approved`)}catch{a.error(`Failed to approve Telegram chat`)}},P=async e=>{try{n((await x(e)).telegram,!1),a.success(`Pending Telegram chat removed`)}catch{a.error(`Failed to remove pending Telegram chat`)}},F=async e=>{try{n((await S(e)).telegram,!1),a.success(`Approved Telegram chat removed`)}catch{a.error(`Failed to remove approved Telegram chat`)}};return t||!e?(0,w.jsx)(l,{label:`Loading channels...`,textClassName:`text-[13px]`}):(0,w.jsx)(m,{children:(0,w.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto pr-2 scrollbar-none pt-6`,children:(0,w.jsxs)(`div`,{className:`mx-auto max-w-[680px] pb-10`,children:[(0,w.jsx)(h,{title:`Channels`}),(0,w.jsxs)(g,{className:`mt-6 space-y-8`,children:[(0,w.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,w.jsx)(`div`,{children:(0,w.jsx)(`h2`,{className:`text-lg font-medium text-foreground`,children:`Telegram`})}),(0,w.jsx)(d,{tone:j?`running`:`idle`,children:j?`Configured`:`Not configured`})]}),(0,w.jsxs)(`section`,{children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Bot Token`}),(0,w.jsx)(d,{tone:j?`running`:`idle`,children:j?`Saved`:`Missing`})]}),(0,w.jsxs)(`div`,{className:`mt-3`,children:[(0,w.jsx)(c,{value:D,onChange:e=>{O(e.target.value),A(!0)},placeholder:e.bot_token||`Enter Telegram bot token`,mono:!0,showLabel:`Show Telegram bot token`,hideLabel:`Hide Telegram bot token`}),j&&!k?(0,w.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Leave empty to keep the current token.`}):null]})]}),(0,w.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Pending Private Chats`}),(0,w.jsxs)(d,{tone:`muted`,className:`px-2 py-0.5`,children:[e.pending_chats.length,` waiting`]})]}),e.pending_chats.length===0?(0,w.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No pending chats.`}):(0,w.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.pending_chats.map(e=>(0,w.jsx)(f,{as:`div`,padding:`sm`,className:`px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsxs)(`div`,{className:`min-w-0`,children:[(0,w.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:E(e)}),(0,w.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,w.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,w.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,w.jsxs)(`span`,{children:[`First seen: `,T(e.first_seen_at)]})]})]}),(0,w.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,w.jsxs)(u,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>void N(e.chat_id),children:[(0,w.jsx)(i,{className:`size-3.5`}),`Approve`]}),(0,w.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void P(e.chat_id),className:`text-muted-foreground hover:bg-destructive/10 hover:text-destructive`,children:(0,w.jsx)(o,{className:`size-3.5`})})]})]})},e.chat_id))})]}),(0,w.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,w.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,w.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Approved Private Chats`}),(0,w.jsxs)(d,{tone:`muted`,className:`px-2 py-0.5`,children:[e.approved_chats.length,` active`]})]}),e.approved_chats.length===0?(0,w.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No approved chats yet.`}):(0,w.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.approved_chats.map(e=>(0,w.jsx)(f,{as:`div`,padding:`sm`,className:`group px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,w.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,w.jsxs)(`div`,{className:`min-w-0`,children:[(0,w.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:E(e)}),(0,w.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,w.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,w.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,w.jsxs)(`span`,{children:[`Approved: `,T(e.approved_at)]})]})]}),(0,w.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-xs`,onClick:()=>void F(e.chat_id),className:`shrink-0 text-muted-foreground opacity-0 transition-all hover:bg-destructive/10 hover:text-destructive group-hover:opacity-100 focus:opacity-100`,children:(0,w.jsx)(o,{className:`size-3.5`})})]})},e.chat_id))})]}),(0,w.jsx)(`div`,{className:`flex justify-end border-t border-border pt-6`,children:(0,w.jsxs)(u,{type:`button`,size:`sm`,onClick:()=>void M(),disabled:s,className:`text-[13px]`,children:[(0,w.jsx)(r,{className:`size-4`}),s?`Saving...`:`Save Changes`]})})]})]})})})}export{D as ChannelsPage};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{$ as r,J as i,_t as a,pt as ee,q as o,ut as s}from"./ui-vendor-UazN8rcv.js";import{$ as c,B as l,K as u,V as d,et as f,rt as p,tt as m}from"./index-Biio-CoI.js";import{a as h,c as te,l as g,o as _,r as v,s as y,t as b,u as ne}from"./surface-Bzr1FRG4.js";import{c as re,n as x,r as ie,s as S}from"./PageScaffold-DteOA8V7.js";import{t as C}from"./datetime-eJqd0V2S.js";import{a as ae,i as w,n as oe,r as T,t as se}from"./select-D9SwnlXF.js";import{n as E,t as ce}from"./WorkspaceCommandDialog-DRS6wiD6.js";async function le(){return l(`/api/mcp`,{method:`GET`,errorMessage:`Failed to fetch MCP state`})}async function ue(){return l(`/api/mcp/refresh`,{method:`POST`,errorMessage:`Failed to refresh MCP servers`,fallback:[],map:e=>e?.servers??[]})}async function de(e){return l(`/api/mcp/servers`,{method:`POST`,body:e,errorMessage:`Failed to create MCP server`,map:e=>{if(!e)throw Error(`Failed to create MCP server`);return e.snapshot}})}async function fe(e,t){return l(`/api/mcp/servers/${e}`,{method:`PATCH`,body:t,errorMessage:`Failed to update MCP server`,map:e=>{if(!e)throw Error(`Failed to update MCP server`);return e.snapshot}})}async function pe(e){await d(`/api/mcp/servers/${e}`,{method:`DELETE`,errorMessage:`Failed to delete MCP server`})}async function me(e){return l(`/api/mcp/servers/${e}/refresh`,{method:`POST`,errorMessage:`Failed to refresh MCP server`,map:e=>{if(!e)throw Error(`Failed to refresh MCP server`);return e.snapshot}})}async function he(e){return l(`/api/mcp/servers/${e}/login`,{method:`POST`,errorMessage:`Failed to login MCP server`,map:e=>{if(!e)throw Error(`Failed to login MCP server`);return e.snapshot}})}async function ge(e){await d(`/api/mcp/servers/${e}/logout`,{method:`POST`,errorMessage:`Failed to logout MCP server`})}async function _e(e,t,n={}){return l(`/api/mcp/servers/${e}/prompt-preview`,{method:`POST`,body:{name:t,arguments:n},errorMessage:`Failed to preview MCP prompt`,map:e=>{if(!e)throw Error(`Failed to preview MCP prompt`);return e.preview}})}var D=n(),ve=`border-border/70 bg-background/45 hover:border-ring/35 hover:bg-accent/65`;function O(e){return e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(Boolean)}function k(e){return e.join(`
|
|
3
|
+
`)}function ye(e){let t={};for(let n of e.split(`
|
|
4
|
+
`)){let e=n.trim();if(!e)continue;let r=e.indexOf(`:`);if(r<0)continue;let i=e.slice(0,r).trim(),a=e.slice(r+1).trim();i&&(t[i]=a)}return t}function A(e){return Object.entries(e).map(([e,t])=>`${e}: ${t}`).join(`
|
|
5
|
+
`)}function j({checked:e,disabled:t,label:n,onChange:r}){return(0,D.jsxs)(`label`,{className:`flex items-center justify-between gap-4 rounded-xl border border-border bg-card/20 px-4 py-3 text-sm${t?` opacity-50`:``}`,children:[(0,D.jsx)(`span`,{className:`text-foreground/85`,children:n}),(0,D.jsx)(u,{checked:e,disabled:t,label:n,onCheckedChange:r})]})}function be({draft:e,onChange:t,onOpenChange:n,onSubmit:r,open:i,pending:a,title:ee}){return(0,D.jsxs)(ce,{open:i,onOpenChange:n,title:ee,footer:(0,D.jsxs)(`div`,{className:`flex w-full items-center justify-end gap-3`,children:[(0,D.jsx)(m,{type:`button`,variant:`outline`,className:ve,onClick:()=>n(!1),children:`Cancel`}),(0,D.jsx)(m,{type:`button`,disabled:a,onClick:r,children:a?`Saving...`:`Save Server`})]}),className:`max-w-3xl`,children:[(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Name`,children:(0,D.jsx)(f,{value:e.name,onChange:n=>t({...e,name:n.target.value}),placeholder:`filesystem`})}),(0,D.jsx)(E,{label:`Transport`,children:(0,D.jsxs)(se,{value:e.transport,onValueChange:n=>t({...e,transport:n}),children:[(0,D.jsx)(w,{className:`h-8 w-full rounded-md bg-background/50 text-sm text-foreground`,children:(0,D.jsx)(ae,{placeholder:`Select transport`})}),(0,D.jsxs)(oe,{className:`rounded-xl bg-popover text-popover-foreground`,children:[(0,D.jsx)(T,{value:`stdio`,children:`stdio`}),(0,D.jsx)(T,{value:`streamable_http`,children:`streamable_http`})]})]})})]}),(0,D.jsx)(E,{label:`Launcher Command`,hint:`optional`,children:(0,D.jsx)(f,{value:e.launcher,onChange:n=>t({...e,launcher:n.target.value}),placeholder:e.transport===`streamable_http`?`https://mcp.example.com`:`npx @playwright/mcp@latest`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(j,{checked:e.enabled,label:`Enabled`,onChange:n=>t({...e,enabled:n})}),(0,D.jsx)(j,{checked:e.required,label:`Required`,onChange:n=>t({...e,required:n})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Startup Timeout`,hint:`seconds`,children:(0,D.jsx)(f,{type:`number`,value:String(e.startup_timeout_sec),onChange:n=>t({...e,startup_timeout_sec:Number(n.target.value)||10})})}),(0,D.jsx)(E,{label:`Tool Timeout`,hint:`seconds`,children:(0,D.jsx)(f,{type:`number`,value:String(e.tool_timeout_sec),onChange:n=>t({...e,tool_timeout_sec:Number(n.target.value)||30})})})]}),e.transport===`stdio`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(E,{label:`Command`,children:(0,D.jsx)(f,{value:e.command,onChange:n=>t({...e,command:n.target.value}),placeholder:`npx`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Args`,hint:`one per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.args),onChange:n=>t({...e,args:O(n.target.value)})})}),(0,D.jsx)(E,{label:`Env Vars`,hint:`one env var name per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.env_vars),onChange:n=>t({...e,env_vars:O(n.target.value)})})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Env`,hint:`KEY: value`,children:(0,D.jsx)(c,{rows:5,value:A(e.env),onChange:n=>t({...e,env:ye(n.target.value)})})}),(0,D.jsx)(E,{label:`Cwd`,children:(0,D.jsx)(f,{value:e.cwd,onChange:n=>t({...e,cwd:n.target.value}),placeholder:`/workspace/tools`})})]})]}):(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(E,{label:`URL`,children:(0,D.jsx)(f,{value:e.url,onChange:n=>t({...e,url:n.target.value}),placeholder:`https://mcp.example.com`})}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Bearer Token Env Var`,children:(0,D.jsx)(f,{value:e.bearer_token_env_var,onChange:n=>t({...e,bearer_token_env_var:n.target.value}),placeholder:`MCP_TOKEN`})}),(0,D.jsx)(E,{label:`OAuth Resource`,children:(0,D.jsx)(f,{value:e.oauth_resource,onChange:n=>t({...e,oauth_resource:n.target.value}),placeholder:`https://mcp.example.com`})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`HTTP Headers`,hint:`Header: value`,children:(0,D.jsx)(c,{rows:5,value:A(e.http_headers),onChange:n=>t({...e,http_headers:ye(n.target.value)})})}),(0,D.jsx)(E,{label:`Env HTTP Headers`,hint:`one env var name per line`,children:(0,D.jsx)(c,{rows:5,value:k(e.env_http_headers),onChange:n=>t({...e,env_http_headers:O(n.target.value)})})})]}),(0,D.jsx)(E,{label:`Scopes`,hint:`one scope per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.scopes),onChange:n=>t({...e,scopes:O(n.target.value)})})})]}),(0,D.jsxs)(`div`,{className:`grid gap-4 md:grid-cols-2`,children:[(0,D.jsx)(E,{label:`Enabled Tools`,hint:`one raw tool name per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.enabled_tools),onChange:n=>t({...e,enabled_tools:O(n.target.value)})})}),(0,D.jsx)(E,{label:`Disabled Tools`,hint:`one raw tool name per line`,children:(0,D.jsx)(c,{rows:4,value:k(e.disabled_tools),onChange:n=>t({...e,disabled_tools:O(n.target.value)})})})]})]})}var M=e(t(),1),N=[`overview`,`capabilities`,`activity`],P=[`tools`,`resources`,`resource_templates`,`prompts`],F=[{value:`all`,label:`All`},{value:`connected`,label:`Connected`},{value:`auth_required`,label:`Auth Required`},{value:`error`,label:`Error`},{value:`disabled`,label:`Disabled`},{value:`connecting`,label:`Connecting`}],I=[{value:`all`,label:`All`},{value:`refresh`,label:`Refresh`},{value:`auth`,label:`Auth`},{value:`tool`,label:`Tool`},{value:`resource`,label:`Resource`},{value:`prompt`,label:`Prompt`}],L={name:``,transport:`stdio`,enabled:!0,required:!1,startup_timeout_sec:10,tool_timeout_sec:30,enabled_tools:[],disabled_tools:[],scopes:[],oauth_resource:``,launcher:``,command:``,args:[],env:{},env_vars:[],cwd:``,url:``,bearer_token_env_var:``,http_headers:{},env_http_headers:[]};function R(e){return C(e,{fallback:`Never`})}function z(e){return e.split(`_`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function B(e){switch(e){case`unsupported`:return`Unsupported`;case`not_logged_in`:return`Not logged in`;case`logging_in`:return`Logging in`;case`connected`:return`Connected`;case`error`:return`Error`;default:return z(e)}}function xe(e){return C(e,{fallback:`Never`,format:{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}})}function V(e){switch(e){case`disabled`:return`Disabled`;case`connecting`:return`Connecting`;case`connected`:return`Connected`;case`auth_required`:return`Auth required`;case`error`:return`Error`;default:return e}}function H(e){switch(e){case`connected`:return`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`;case`auth_required`:return`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`;case`error`:return`border-destructive/30 bg-destructive/10 text-destructive`;case`disabled`:return`border-border bg-accent/20 text-muted-foreground`;default:return`border-primary/20 bg-primary/[0.1] text-primary`}}function Se(e){switch(e){case`success`:return`border-graph-status-running/18 bg-graph-status-running/[0.12] text-graph-status-running`;case`rejected`:return`border-graph-status-idle/18 bg-graph-status-idle/[0.12] text-graph-status-idle`;default:return`border-destructive/30 bg-destructive/10 text-destructive`}}function Ce(e){let t=e.snapshot.capability_counts;return`${t.tools} tools · ${t.resources} resources · ${t.prompts} prompts`}function U(e){return e.visibility.active?`Global`:null}function we(e){return e.length<2?e:e.startsWith(`"`)&&e.endsWith(`"`)||e.startsWith(`'`)&&e.endsWith(`'`)?e.slice(1,-1):e}function Te(e){return(e.match(/'[^']*'|"[^"]*"|\S+/g)??[]).map(e=>we(e))}function W(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)}function Ee(e){return W((e.startsWith(`@`)?e.replace(/@[^/@]+$/u,``):e.replace(/@[^/]+$/u,``)).split(`/`).filter(Boolean).join(`-`))}function De(e){try{let t=new URL(e);return W(t.hostname.replace(/^www\./u,``).split(`.`).filter(e=>e&&![`mcp`,`api`].includes(e))[0]??t.hostname)}catch{return``}}function Oe(e,t){if(/^https?:\/\//u.test(e))return De(e);let n=t[0]??``,r=n===`pnpm`||n===`yarn`?2:n===`npm`?3:1,i=t.slice(r).find(e=>e&&!e.startsWith(`-`));if(i){let e=Ee(i);if(e)return e}return n?W(n.split(`/`).pop()??n):``}function ke(e,t){let n=e.trim(),r=W(t);if(!n)return{draft:null,error:`Enter a launcher command or URL.`};if(!r)return{draft:null,error:`Quick Add needs a valid server name.`};if(/^https?:\/\//u.test(n))try{let e=new URL(n).toString();return{draft:{...L,name:r,transport:`streamable_http`,launcher:n,url:e},error:null}}catch{return{draft:null,error:`Quick Add URL is not valid.`}}let i=Te(n);return i.length===0?{draft:null,error:`Quick Add needs a single-line launcher command.`}:{draft:{...L,name:r,transport:`stdio`,launcher:n,command:i[0],args:i.slice(1)},error:null}}function Ae(e){return e.config.transport===`streamable_http`?e.config.url.trim()||`No URL configured`:[e.config.command,...e.config.args].filter(Boolean).join(` `)}function je(e){return{config:e,snapshot:{server_name:e.name,transport:e.transport,status:`connecting`,auth_status:e.transport===`stdio`?`unsupported`:`not_logged_in`,last_auth_result:null,last_refresh_at:null,last_refresh_result:`never`,last_error:null,tools:[],resources:[],resource_templates:[],prompts:[],capability_counts:{tools:0,resources:0,resource_templates:0,prompts:0}},visibility:{scope:`global`,active:!1},activity:[]}}function Me(e){return e.config.enabled_tools.length>0?`Enabled tools limited to ${e.config.enabled_tools.length} entries`:e.config.disabled_tools.length>0?`${e.config.disabled_tools.length} tools excluded`:`All discovered tools remain available`}function Ne(e){return e.config.transport===`stdio`?`Auth N/A`:e.snapshot.auth_status===`connected`?`Logout`:`Login`}function Pe(e){return e.config.transport===`stdio`}function G(e,t=`Not set`){return typeof e==`string`&&e.trim()||t}function K(e,t=`None`){return e.length===0?t:e.join(`
|
|
6
|
+
`)}function Fe(e,t=`None`){let n=Object.keys(e);return n.length===0?t:n.join(`
|
|
7
|
+
`)}function Ie(e){if(e.action===`login`||e.action===`logout`)return!0;if(e.action!==`refresh`)return!1;let t=`${e.summary} ${e.target??``}`.toLowerCase();return[`auth`,`authentication`,`oauth`,`token`,`bearer`,`login`,`logged out`,`env var`].some(e=>t.includes(e))}function Le(e){if(Ie(e))return`auth`;switch(e.action){case`refresh`:return`refresh`;case`login`:case`logout`:return`auth`;case`tool_call`:return`tool`;case`resource_read`:return`resource`;case`prompt_get`:return`prompt`;default:return`all`}}function Re(e){switch(Le(e)){case`refresh`:return`Refresh`;case`auth`:return`Auth`;case`tool`:return`Tool`;case`resource`:return`Resource`;case`prompt`:return`Prompt`;default:return z(e.action)}}function ze(e,t){return!(t!==`all`&&e.snapshot.status!==t)}function Be(e,t=`Not set`){return e.trim()?e:t}function Ve(e){return Object.fromEntries((e?.arguments??[]).map(e=>e.name).filter(e=>typeof e==`string`&&e.length>0).map(e=>[e,``]))}function He(){let{data:e,error:t,isLoading:n,mutate:r}=re(`mcp-state`,le),[i,a]=(0,M.useState)(null),[ee,s]=(0,M.useState)(`overview`),[c,l]=(0,M.useState)(`tools`),[u,d]=(0,M.useState)(!1),[f,p]=(0,M.useState)(null),[m,h]=(0,M.useState)(L),[te,g]=(0,M.useState)(!1),[_,v]=(0,M.useState)(null),[y,b]=(0,M.useState)(null),[ne,x]=(0,M.useState)(!1),[ie,S]=(0,M.useState)(`{}`),[C,ae]=(0,M.useState)(`all`),[w,oe]=(0,M.useState)(`all`),[T,se]=(0,M.useState)(``),[E,ce]=(0,M.useState)(``),[D,ve]=(0,M.useState)(!1),[O,k]=(0,M.useState)(!1),[ye,A]=(0,M.useState)(null),j=(0,M.useMemo)(()=>Te(T.trim()),[T]),be=(0,M.useMemo)(()=>Oe(T.trim(),j),[T,j]),N=D?E:be,P=(0,M.useMemo)(()=>ke(T,N),[T,N]),F=(0,M.useMemo)(()=>{let t=e?.servers??[];return!O||P.draft===null||t.some(e=>e.config.name===P.draft?.name)?t:[je(P.draft),...t]},[e,P.draft,O]),I=(0,M.useMemo)(()=>F.filter(e=>ze(e,C)),[C,F]),R=(0,M.useMemo)(()=>I.find(e=>e.config.name===i)??I[0]??null,[I,i]);(0,M.useEffect)(()=>{I.length>0&&!I.some(e=>e.config.name===i)&&a(I[0]?.config.name??null)},[I,i]),(0,M.useEffect)(()=>{v(null),b(null),x(!1),S(`{}`),oe(`all`)},[R?.config.name]),(0,M.useEffect)(()=>{D||ce(be)},[D,be]);let z=(0,M.useMemo)(()=>({configured:F.length,connected:F.filter(e=>e.snapshot.status===`connected`).length,authRequired:F.filter(e=>e.snapshot.status===`auth_required`).length,error:F.filter(e=>e.snapshot.status===`error`).length}),[F]),B=(0,M.useMemo)(()=>R?.snapshot.prompts.find(e=>e.name===_)??null,[_,R]),xe=(0,M.useMemo)(()=>R?R.activity.filter(e=>w===`all`?!0:Le(e)===w):[],[w,R]),V=()=>{p(null),h(L),d(!0)},H=e=>{p(e.config.name),h(e.config),d(!0)},Se=e=>{se(e),A(null)},Ce=e=>{ve(!0),ce(e),A(null)},U=()=>{document.getElementById(`mcp-quick-add-input`)?.focus()},we=()=>{ae(`all`)},W=async()=>{try{await ue(),await r(),o.success(`MCP servers refreshed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to refresh MCP servers`)}},Ee=async()=>{g(!0);try{f?await fe(f,m):await de(m),await r(),a(m.name.trim()),d(!1),o.success(`MCP server saved`)}catch(e){o.error(e instanceof Error?e.message:`Failed to save MCP server`)}finally{g(!1)}},De=async()=>{if(P.error||P.draft===null){A(P.error??`Quick Add is not ready yet.`);return}k(!0),A(null),a(P.draft.name);try{await de(P.draft),await r(),a(P.draft.name),se(``),ce(``),ve(!1),o.success(`MCP server added`)}catch(e){await r(),a(P.draft.name),A(e instanceof Error?e.message:`Failed to add MCP server`),o.error(e instanceof Error?e.message:`Failed to add MCP server`)}finally{k(!1)}},Ae=async e=>{try{await pe(e),await r(),o.success(`MCP server removed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to remove MCP server`)}},Me=async e=>{try{await fe(e.config.name,{...e.config,enabled:!e.config.enabled}),await r()}catch(e){o.error(e instanceof Error?e.message:`Failed to update MCP server`)}},Ne=async e=>{try{await me(e),await r(),o.success(`Server refreshed`)}catch(e){o.error(e instanceof Error?e.message:`Failed to refresh server`)}},Pe=async e=>{try{await he(e),await r(),o.success(`Server refreshed after login`)}catch(e){o.error(e instanceof Error?e.message:`Failed to login MCP server`)}},G=async e=>{try{await ge(e),await r(),o.success(`Logout request sent`)}catch(e){o.error(e instanceof Error?e.message:`Failed to logout MCP server`)}},K=async(e,t,n={})=>{x(!0);try{b(await _e(e,t,n))}catch(e){b({error:e instanceof Error?e.message:`Failed to preview prompt`})}finally{x(!1)}};return{error:t,isLoading:n,servers:F,filteredServers:I,selectedServer:R,summaryCounts:z,filteredActivity:xe,detailTab:ee,setDetailTab:s,capabilityTab:c,setCapabilityTab:l,serverStatusFilter:C,setServerStatusFilter:ae,activityFilter:w,setActivityFilter:oe,selectedServerName:i,setSelectedServerName:a,clearServerFilters:we,focusQuickAdd:U,dialog:{draft:m,editingServerName:f,open:u,pending:te,setDraft:h,setOpen:d,openCreateDialog:V,openEditDialog:H,saveServer:Ee},quickAdd:{error:ye,input:T,nameValue:N,parse:P,pending:O,setInput:Se,setName:Ce,submit:De},promptPreviewState:{argumentsText:ie,loading:ne,preview:y,selectedPrompt:B,selectedPromptName:_,setArgumentsText:e=>{S(e)},previewCurrent:()=>{if(!(!R||!_))try{let e=JSON.parse(ie);K(R.config.name,_,e)}catch{b({error:`Arguments must be valid JSON`})}},selectPrompt:(e,t)=>{v(t);let n=Ve(R?.snapshot.prompts.find(e=>e.name===t)??null);S(JSON.stringify(n,null,2)),K(e,t,n)}},actions:{deleteServer:Ae,login:Pe,logout:G,refreshAll:W,refreshServer:Ne,toggleEnabled:Me}}}function q({label:e,value:t}){return(0,D.jsx)(h,{label:e,value:t,className:`min-h-0 px-4`})}function Ue({active:e,label:t,onClick:n,variant:r=`pill`}){return(0,D.jsx)(v,{active:e,label:t,onClick:n,variant:r})}function J({label:e,value:t,mono:n=!1}){return(0,D.jsx)(te,{label:e,value:t,mono:n})}var Y=`bg-card/20`,X=`text-[13px] text-muted-foreground`,Z=ne,Q=`border-border/70 bg-background/45 hover:border-ring/35 hover:bg-accent/65`,We=`border-graph-status-error/35 bg-graph-status-error/10 text-graph-status-error hover:bg-graph-status-error/18`,Ge=`mt-4 max-h-48 bg-background/55 p-3 text-foreground/70`,$=`mt-2 line-clamp-1 text-[13px] leading-6 text-muted-foreground`;function Ke(){return(0,D.jsxs)(`div`,{className:`grid h-full gap-5 lg:grid-cols-[320px_minmax(0,1fr)]`,children:[(0,D.jsxs)(`div`,{className:`space-y-3`,children:[Array.from({length:5}).map((e,t)=>(0,D.jsx)(`div`,{className:`h-24 rounded-xl border border-border bg-card/20 skeleton-shimmer`},t)),(0,D.jsx)(`p`,{className:`px-2 text-[13px] text-muted-foreground`,children:`Loading MCP servers...`})]}),(0,D.jsx)(`div`,{className:`rounded-xl border border-border bg-card/20 skeleton-shimmer`})]})}function qe(){return(0,D.jsx)(S,{className:`flex h-full items-center justify-center text-center text-muted-foreground`,children:`Failed to load MCP state.`})}function Je({quickAdd:e,dialog:t}){return(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(Ye,{quickAdd:e,dialog:t}),(0,D.jsx)(_,{icon:r,title:`No MCP servers`,minHeightClassName:`h-full`,className:`mt-4`})]})}function Ye({dialog:e,quickAdd:t}){return(0,D.jsx)(S,{className:p(`mt-4`,Y),children:(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsx)(`div`,{children:(0,D.jsx)(`p`,{className:Z,children:`Quick Add`})}),t.parse.draft?(0,D.jsx)(g,{className:p(H(t.parse.draft.transport===`streamable_http`?`connected`:`connecting`)),children:t.parse.draft.transport===`streamable_http`?`URL`:`Launcher`}):null]}),(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,1.4fr)_minmax(260px,0.6fr)]`,children:[(0,D.jsx)(E,{label:`Launcher or URL`,children:(0,D.jsx)(f,{id:`mcp-quick-add-input`,value:t.input,onChange:e=>t.setInput(e.target.value),placeholder:`npx @playwright/mcp@latest`})}),(0,D.jsx)(E,{label:`Name`,children:(0,D.jsx)(f,{value:t.nameValue,onChange:e=>t.setName(e.target.value),placeholder:`playwright-mcp`})})]}),t.parse.draft?(0,D.jsxs)(`div`,{className:`grid gap-3 xl:grid-cols-3`,children:[(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Transport`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:t.parse.draft.transport})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Parsed Name`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:t.parse.draft.name})]}),(0,D.jsxs)(S,{className:p(`xl:col-span-1`,Y),children:[(0,D.jsx)(`p`,{className:Z,children:`Parsed Result`}),(0,D.jsx)(`p`,{className:`mt-2 break-all font-mono text-[12px] text-foreground/80`,children:t.parse.draft.transport===`streamable_http`?t.parse.draft.url:[t.parse.draft.command,...t.parse.draft.args].join(` `)})]})]}):null,t.error||t.input.trim()&&t.parse.error?(0,D.jsx)(`p`,{className:`text-[13px] text-destructive`,children:t.error??t.parse.error}):null,(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,D.jsx)(m,{type:`button`,disabled:t.pending||t.parse.draft===null,onClick:()=>void t.submit(),children:t.pending?`Adding...`:`Quick Add`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.openCreateDialog,children:`Advanced Add`})]})]})})}function Xe(e){return(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(Ze,{summaryCounts:e.summaryCounts}),(0,D.jsx)(Ye,{quickAdd:e.quickAdd,dialog:e.dialog}),(0,D.jsx)(Qe,{serverStatusFilter:e.serverStatusFilter,onServerStatusFilterChange:e.onServerStatusFilterChange}),(0,D.jsx)(`div`,{className:`mt-4 min-h-0 flex-1 overflow-hidden`,children:e.filteredServers.length===0?(0,D.jsx)(_,{icon:s,title:`No matching MCP servers`,minHeightClassName:`h-full`,action:(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.clearServerFilters,children:[(0,D.jsx)(i,{className:`mr-2 size-4`}),`Show All Servers`]})}):(0,D.jsxs)(`div`,{className:`grid h-full gap-5 xl:grid-cols-[360px_minmax(0,1fr)]`,children:[(0,D.jsx)($e,{actions:e.actions,dialog:e.dialog,filteredServers:e.filteredServers,onSelectServer:e.onSelectServer,selectedServer:e.selectedServer}),(0,D.jsx)(tt,{actions:e.actions,activityFilter:e.activityFilter,capabilityTab:e.capabilityTab,dialog:e.dialog,detailTab:e.detailTab,filteredActivity:e.filteredActivity,onActivityFilterChange:e.onActivityFilterChange,onCapabilityTabChange:e.onCapabilityTabChange,onDetailTabChange:e.onDetailTabChange,onFocusQuickAdd:e.onFocusQuickAdd,promptPreviewState:e.promptPreviewState,selectedServer:e.selectedServer})]})})]})}function Ze({summaryCounts:e}){return(0,D.jsx)(S,{children:(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:[(0,D.jsx)(q,{label:`Configured`,value:e.configured}),(0,D.jsx)(q,{label:`Connected`,value:e.connected}),(0,D.jsx)(q,{label:`Auth Required`,value:e.authRequired}),(0,D.jsx)(q,{label:`Error`,value:e.error})]})})}function Qe({onServerStatusFilterChange:e,serverStatusFilter:t}){return(0,D.jsx)(S,{className:`mt-4`,children:(0,D.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:F.map(n=>(0,D.jsx)(Ue,{active:t===n.value,label:n.label,onClick:()=>e(n.value)},n.value))})})}function $e({actions:e,dialog:t,filteredServers:n,onSelectServer:r,selectedServer:i}){return(0,D.jsx)(`div`,{className:`min-h-0 overflow-y-auto pr-1 scrollbar-none`,children:(0,D.jsx)(`div`,{className:`space-y-3`,children:n.map(n=>(0,D.jsx)(et,{actions:e,dialog:t,isSelected:i?.config.name===n.config.name,onSelectServer:r,serverRecord:n},n.config.name))})})}function et({actions:e,dialog:t,isSelected:n,onSelectServer:r,serverRecord:i}){let a=U(i);return(0,D.jsx)(y,{as:`div`,padding:`sm`,className:p(`p-4 transition-colors`,n?`bg-accent/20`:`bg-card/20 hover:bg-accent/20`),children:(0,D.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,D.jsxs)(m,{type:`button`,variant:`ghost`,onClick:()=>r(i.config.name),className:`h-auto min-w-0 flex-1 justify-start p-0 text-left hover:bg-transparent hover:text-inherit`,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:i.config.name}),i.config.required?(0,D.jsx)(g,{tone:`idle`,className:`px-2 py-0.5`,children:`required`}):null,a?(0,D.jsx)(g,{tone:`primary`,className:`px-2 py-0.5`,children:a}):null]}),(0,D.jsxs)(`div`,{className:`mt-3 grid gap-1.5 text-[12px] text-muted-foreground`,children:[(0,D.jsxs)(`p`,{children:[`Transport `,i.config.transport]}),(0,D.jsxs)(`p`,{children:[`Status `,V(i.snapshot.status)]}),(0,D.jsxs)(`p`,{children:[`Auth `,B(i.snapshot.auth_status)]}),(0,D.jsx)(`p`,{children:Ce(i)})]}),i.snapshot.last_error?(0,D.jsx)(`p`,{className:`mt-3 line-clamp-2 text-[12px] leading-5 text-destructive`,children:i.snapshot.last_error}):null]}),(0,D.jsxs)(`div`,{className:`flex shrink-0 flex-col items-end gap-1.5`,children:[(0,D.jsx)(g,{className:p(H(i.snapshot.status)),children:V(i.snapshot.status)}),(0,D.jsx)(rt,{actions:e,buttonClassName:`h-7 px-2 text-[11px]`,dialog:t,serverRecord:i})]})]})})}function tt({actions:e,activityFilter:t,capabilityTab:n,dialog:r,detailTab:i,filteredActivity:a,onActivityFilterChange:ee,onCapabilityTabChange:o,onDetailTabChange:s,onFocusQuickAdd:c,promptPreviewState:l,selectedServer:u}){return u?(0,D.jsx)(`div`,{className:`min-h-0 overflow-hidden`,children:(0,D.jsxs)(S,{className:`flex h-full min-h-0 flex-col`,children:[(0,D.jsx)(nt,{actions:e,dialog:r,selectedServer:u}),(0,D.jsx)(`div`,{className:`mt-4 flex flex-wrap gap-4 border-b border-border`,children:N.map(e=>(0,D.jsx)(Ue,{active:i===e,label:z(e),onClick:()=>s(e),variant:`tab`},e))}),(0,D.jsxs)(`div`,{className:`mt-5 min-h-0 flex-1 overflow-y-auto pr-1 scrollbar-none`,children:[i===`overview`?(0,D.jsx)(it,{selectedServer:u}):null,i===`capabilities`?(0,D.jsx)(st,{capabilityTab:n,onCapabilityTabChange:o,promptPreviewState:l,selectedServer:u}):null,i===`activity`?(0,D.jsx)(ft,{activityFilter:t,filteredActivity:a,onActivityFilterChange:ee,selectedServer:u}):null]})]})}):(0,D.jsx)(`div`,{className:`min-h-0 overflow-hidden`,children:(0,D.jsx)(_,{title:`Select an MCP server`,action:(0,D.jsx)(m,{type:`button`,size:`sm`,onClick:c,children:`Quick Add`}),minHeightClassName:`h-full`})})}function nt({actions:e,dialog:t,selectedServer:n}){return(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-4 border-b border-border pb-4`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,D.jsx)(`h2`,{className:`text-[18px] font-medium text-foreground`,children:n.config.name}),(0,D.jsx)(g,{uppercase:!0,className:p(H(n.snapshot.status)),children:V(n.snapshot.status)}),U(n)?(0,D.jsx)(g,{tone:`primary`,children:U(n)}):null]}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[n.config.transport,` · Auth`,` `,B(n.snapshot.auth_status)]}),n.snapshot.last_error?(0,D.jsx)(`p`,{className:`mt-2 max-w-3xl text-[13px] leading-6 text-destructive`,children:n.snapshot.last_error}):null]}),(0,D.jsx)(rt,{actions:e,dialog:t,serverRecord:n})]})}function rt({actions:e,buttonClassName:t,dialog:n,serverRecord:r}){return(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>e.toggleEnabled(r),children:r.config.enabled?`Disable`:`Enable`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,disabled:Pe(r),className:p(Q,t),onClick:()=>r.snapshot.auth_status===`connected`?e.logout(r.config.name):e.login(r.config.name),children:Ne(r)}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>n.openEditDialog(r),children:`Edit`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(Q,t),onClick:()=>e.refreshServer(r.config.name),children:`Refresh`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:p(We,t),onClick:()=>e.deleteServer(r.config.name),children:`Remove`})]})}function it({selectedServer:e}){return(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Status`}),(0,D.jsx)(`p`,{className:`mt-3 text-[22px] font-medium text-foreground`,children:V(e.snapshot.status)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Auth `,B(e.snapshot.auth_status)]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Visibility`}),(0,D.jsx)(`p`,{className:`mt-3 text-[22px] font-medium text-foreground`,children:U(e)??`Pending`})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Last Refresh`}),(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:R(e.snapshot.last_refresh_at)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Result`,` `,z(e.snapshot.last_refresh_result)]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Timeouts`}),(0,D.jsxs)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:[`Startup `,e.config.startup_timeout_sec,`s`]}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Tool `,e.config.tool_timeout_sec,`s`]})]}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Tool Filters`}),(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:Me(e)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Enabled `,e.config.enabled_tools.length,` · `,`Disabled `,e.config.disabled_tools.length]})]}),(0,D.jsxs)(S,{className:p(`xl:col-span-2`,Y),children:[(0,D.jsx)(`p`,{className:Z,children:`Capability Summary`}),(0,D.jsx)(`div`,{className:`mt-4 grid gap-3 sm:grid-cols-2 xl:grid-cols-4`,children:Object.entries(e.snapshot.capability_counts).map(([e,t])=>(0,D.jsxs)(y,{as:`div`,padding:`sm`,className:`bg-card/20`,children:[(0,D.jsx)(`p`,{className:Z,children:e.replaceAll(`_`,` `)}),(0,D.jsx)(`p`,{className:`mt-2 text-xl font-medium text-foreground`,children:t})]},e))})]}),e.config.launcher?(0,D.jsx)(S,{className:p(`xl:col-span-2`,Y),children:(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`Original Launcher`,value:G(e.config.launcher),mono:!0}),(0,D.jsx)(J,{label:`Parsed Result`,value:Ae(e),mono:!0})]})}):null,e.config.transport===`stdio`?(0,D.jsx)(at,{selectedServer:e}):(0,D.jsx)(ot,{selectedServer:e})]})}function at({selectedServer:e}){return(0,D.jsx)(S,{className:p(`xl:col-span-2`,Y),children:(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`Command`,value:G(e.config.command),mono:!0}),(0,D.jsx)(J,{label:`Cwd`,value:G(e.config.cwd),mono:!0}),(0,D.jsx)(J,{label:`Args`,value:K(e.config.args),mono:!0}),(0,D.jsx)(J,{label:`Env Vars`,value:K(e.config.env_vars),mono:!0})]})})}function ot({selectedServer:e}){return(0,D.jsxs)(S,{className:p(`xl:col-span-2`,Y),children:[(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-2`,children:[(0,D.jsx)(J,{label:`URL`,value:G(e.config.url),mono:!0}),(0,D.jsx)(J,{label:`OAuth Resource`,value:G(e.config.oauth_resource),mono:!0}),(0,D.jsx)(J,{label:`Bearer Token Env Var`,value:G(e.config.bearer_token_env_var),mono:!0}),(0,D.jsx)(J,{label:`Scopes`,value:K(e.config.scopes),mono:!0}),(0,D.jsx)(J,{label:`HTTP Headers`,value:Fe(e.config.http_headers),mono:!0}),(0,D.jsx)(J,{label:`Env HTTP Headers`,value:K(e.config.env_http_headers),mono:!0})]}),(0,D.jsxs)(y,{as:`div`,padding:`sm`,className:`mt-4 bg-card/20`,children:[(0,D.jsx)(`p`,{className:Z,children:`Recent Auth Result`}),(0,D.jsx)(`p`,{className:`mt-2 text-[14px] font-medium text-foreground`,children:Be(e.snapshot.last_auth_result??``,`No login action yet`)}),(0,D.jsxs)(`p`,{className:`mt-2 text-[13px] text-muted-foreground`,children:[`Current auth status`,` `,B(e.snapshot.auth_status)]})]})]})}function st({capabilityTab:e,onCapabilityTabChange:t,promptPreviewState:n,selectedServer:r}){return(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsx)(`div`,{className:`flex flex-wrap gap-4 border-b border-border`,children:P.map(n=>(0,D.jsx)(Ue,{active:e===n,label:n===`resource_templates`?`Resource Templates`:z(n),onClick:()=>t(n),variant:`tab`},n))}),e===`tools`?(0,D.jsx)(ct,{selectedServer:r}):null,e===`resources`?(0,D.jsx)(lt,{selectedServer:r}):null,e===`resource_templates`?(0,D.jsx)(ut,{selectedServer:r}):null,e===`prompts`?(0,D.jsx)(dt,{promptPreviewState:n,selectedServer:r}):null]})}function ct({selectedServer:e}){return e.snapshot.tools.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No tools discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.tools.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`font-mono text-[13px] text-foreground`,children:e.tool_name}),e.title?(0,D.jsx)(`p`,{className:`mt-2 text-[13px] text-foreground/70`,children:e.title}):null,(0,D.jsx)(`p`,{className:`mt-1 text-[12px] text-muted-foreground`,children:e.fully_qualified_id})]}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-2 text-[10px]`,children:[e.read_only_hint?(0,D.jsx)(g,{tone:`primary`,children:`readOnly`}):null,e.destructive_hint?(0,D.jsx)(g,{tone:`danger`,children:`destructive`}):null,e.open_world_hint?(0,D.jsx)(g,{tone:`idle`,children:`openWorld`}):null]})]}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null,(0,D.jsx)(b,{className:Ge,children:JSON.stringify(e.parameters??{},null,2)})]},e.fully_qualified_id))})}function lt({selectedServer:e}){return e.snapshot.resources.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No resources discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.resources.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:e.name}),(0,D.jsx)(`p`,{className:`mt-1 font-mono text-[12px] text-muted-foreground`,children:e.uri}),(0,D.jsx)(`p`,{className:`mt-3 text-[13px] text-foreground/70`,children:e.mime_type??`Unknown MIME`}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null]},e.uri))})}function ut({selectedServer:e}){return e.snapshot.resource_templates.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No resource templates discovered.`}):(0,D.jsx)(`div`,{className:`space-y-3`,children:e.snapshot.resource_templates.map(e=>(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:e.name}),(0,D.jsx)(`p`,{className:`mt-1 font-mono text-[12px] text-muted-foreground`,children:e.uri_template}),e.description?(0,D.jsx)(`p`,{className:$,children:e.description}):null]},e.uri_template))})}function dt({promptPreviewState:e,selectedServer:t}){return(0,D.jsxs)(`div`,{className:`grid gap-4 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]`,children:[(0,D.jsx)(`div`,{className:`space-y-3`,children:t.snapshot.prompts.length===0?(0,D.jsx)(S,{className:p(Y,X),children:`No prompts discovered.`}):t.snapshot.prompts.map(n=>(0,D.jsxs)(m,{type:`button`,variant:`ghost`,onClick:()=>e.selectPrompt(t.config.name,n.name),className:p(`h-auto w-full flex-col items-stretch rounded-xl border border-border bg-card/20 p-5 text-left transition-colors hover:text-inherit`,e.selectedPromptName===n.name?`border-border bg-accent/20`:`hover:bg-accent/20`),children:[(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:n.name}),n.description?(0,D.jsx)(`p`,{className:$,children:n.description}):null,(0,D.jsx)(b,{className:Ge,children:JSON.stringify(n.arguments??[],null,2)})]},n.name))}),(0,D.jsxs)(S,{className:Y,children:[(0,D.jsx)(`p`,{className:Z,children:`Prompt Preview`}),e.selectedPromptName?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(`p`,{className:`mt-3 text-[15px] font-medium text-foreground`,children:e.selectedPromptName}),(0,D.jsx)(`p`,{className:`mt-4 text-[11px] text-muted-foreground/80`,children:`Arguments`}),(0,D.jsx)(c,{value:e.argumentsText,onChange:t=>e.setArgumentsText(t.target.value),className:`mt-2 min-h-[120px] bg-background/50 font-mono text-[11px] text-foreground/80`}),(0,D.jsxs)(`div`,{className:`mt-3 flex items-center justify-between gap-3`,children:[(0,D.jsx)(`p`,{className:`text-[12px] text-muted-foreground`,children:`Edit argument JSON, then refresh the preview.`}),(0,D.jsx)(m,{type:`button`,variant:`outline`,className:Q,onClick:e.previewCurrent,children:`Preview`})]}),e.selectedPrompt?.arguments?.length?(0,D.jsx)(b,{className:p(Ge,`max-h-40`),children:JSON.stringify(e.selectedPrompt.arguments,null,2)}):null,(0,D.jsx)(b,{className:p(Ge,`max-h-[420px]`),children:e.loading?`Loading preview...`:JSON.stringify(e.preview??{},null,2)})]}):(0,D.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`Select a prompt to preview it.`})]})]})}function ft({activityFilter:e,filteredActivity:t,onActivityFilterChange:n,selectedServer:r}){return(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:I.map(t=>(0,D.jsx)(Ue,{active:e===t.value,label:t.label,onClick:()=>n(t.value)},t.value))}),t.length===0?(0,D.jsx)(S,{className:p(Y,X),children:r.activity.length===0?`No recent MCP activity.`:`No activity matches the current filter.`}):t.map(e=>(0,D.jsx)(pt,{activityRecord:e},e.id))]})}function pt({activityRecord:e}){return(0,D.jsxs)(S,{className:Y,children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(g,{tone:`neutral`,children:Re(e)}),(0,D.jsx)(`p`,{className:`text-[14px] font-medium text-foreground`,children:z(e.action)})]}),(0,D.jsx)(`p`,{className:`mt-2 text-[12px] text-muted-foreground`,children:R(e.started_at)})]}),(0,D.jsx)(g,{uppercase:!0,className:p(Se(e.result)),children:e.result})]}),(0,D.jsx)(`p`,{className:`mt-3 text-[13px] leading-6 text-muted-foreground`,children:e.summary}),(0,D.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-4 text-[12px] text-muted-foreground`,children:[e.actor_node_id?(0,D.jsxs)(`span`,{children:[`Node `,e.actor_node_id.slice(0,8)]}):null,e.tab_id?(0,D.jsxs)(`span`,{children:[`Workflow `,e.tab_id.slice(0,8)]}):null,e.tool_name?(0,D.jsxs)(`span`,{children:[`Tool `,e.tool_name]}):null,e.target?(0,D.jsxs)(`span`,{children:[`Target `,e.target]}):null,(0,D.jsxs)(`span`,{children:[Math.round(e.duration_ms),` ms`]}),(0,D.jsx)(`span`,{children:xe(e.ended_at)})]})]})}function mt(){let{actions:e,activityFilter:t,capabilityTab:n,clearServerFilters:r,detailTab:i,dialog:o,error:s,filteredActivity:c,filteredServers:l,focusQuickAdd:u,isLoading:d,promptPreviewState:f,quickAdd:p,selectedServer:h,serverStatusFilter:te,servers:g,setActivityFilter:_,setCapabilityTab:v,setDetailTab:y,setSelectedServerName:b,setServerStatusFilter:ne,summaryCounts:re}=He();return(0,D.jsxs)(x,{children:[(0,D.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col px-8 py-6`,children:[(0,D.jsx)(ie,{title:`MCP`,actions:(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:()=>void e.refreshAll(),children:[(0,D.jsx)(ee,{className:`mr-2 size-4`}),`Refresh`]}),(0,D.jsxs)(m,{type:`button`,variant:`outline`,className:Q,onClick:u,children:[(0,D.jsx)(a,{className:`mr-2 size-4`}),`Quick Add`]}),(0,D.jsxs)(m,{type:`button`,onClick:o.openCreateDialog,children:[(0,D.jsx)(a,{className:`mr-2 size-4`}),`Advanced Add`]})]})}),(0,D.jsx)(`div`,{className:`mt-6 min-h-0 flex-1 overflow-hidden`,children:d?(0,D.jsx)(Ke,{}):s?(0,D.jsx)(qe,{}):g.length===0?(0,D.jsx)(Je,{quickAdd:p,dialog:o}):(0,D.jsx)(Xe,{actions:e,activityFilter:t,capabilityTab:n,clearServerFilters:r,detailTab:i,dialog:o,filteredActivity:c,filteredServers:l,onActivityFilterChange:_,onCapabilityTabChange:v,onDetailTabChange:y,onFocusQuickAdd:u,onSelectServer:b,onServerStatusFilterChange:ne,promptPreviewState:f,quickAdd:p,selectedServer:h,serverStatusFilter:te,summaryCounts:re})})]}),(0,D.jsx)(be,{draft:o.draft,onChange:o.setDraft,open:o.open,pending:o.pending,title:o.editingServerName?`Edit MCP Server`:`Advanced Add MCP Server`,onOpenChange:o.setOpen,onSubmit:()=>void o.saveServer()})]})}export{mt as McpPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{c as t,d as n,l as r}from"./graph-vendor-DRq_-6fV.js";import{Lt as i}from"./ui-vendor-UazN8rcv.js";import{a,i as o,n as s,r as c,rt as l,tt as u}from"./index-Biio-CoI.js";import{s as d}from"./surface-Bzr1FRG4.js";var f=e(n(),1),p=t(),m=Object.prototype.hasOwnProperty;function h(e,t){var n,r;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((r=e.length)===t.length)for(;r--&&h(e[r],t[r]););return r===-1}if(!n||typeof e==`object`){for(n in r=0,e)if(m.call(e,n)&&++r&&!m.call(t,n)||!(n in t)||!h(e[n],t[n]))return!1;return Object.keys(t).length===r}}return e!==e&&t!==t}var g=new WeakMap,_=()=>{},v=void 0,y=Object,b=e=>e===v,x=e=>typeof e==`function`,S=(e,t)=>({...e,...t}),ee=e=>x(e.then),C={},w={},T=`undefined`,E=typeof window!=T,D=typeof document!=T,O=E&&`Deno`in window,k=()=>E&&typeof window.requestAnimationFrame!=T,te=(e,t)=>{let n=g.get(e);return[()=>!b(t)&&e.get(t)||C,r=>{if(!b(t)){let i=e.get(t);t in w||(w[t]=i),n[5](t,S(i,r),i||C)}},n[6],()=>!b(t)&&t in w?w[t]:!b(t)&&e.get(t)||C]},A=!0,j=()=>A,[M,N]=E&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[_,_],P=()=>{let e=D&&document.visibilityState;return b(e)||e!==`hidden`},ne=e=>(D&&document.addEventListener(`visibilitychange`,e),M(`focus`,e),()=>{D&&document.removeEventListener(`visibilitychange`,e),N(`focus`,e)}),re=e=>{let t=()=>{A=!0,e()},n=()=>{A=!1};return M(`online`,t),M(`offline`,n),()=>{N(`online`,t),N(`offline`,n)}},ie={isOnline:j,isVisible:P},F={initFocus:ne,initReconnect:re},ae=!f.useId,I=!E||O,oe=e=>k()?window.requestAnimationFrame(e):setTimeout(e,1),L=I?f.useEffect:f.useLayoutEffect,R=typeof navigator<`u`&&navigator.connection,z=!I&&R&&([`slow-2g`,`2g`].includes(R.effectiveType)||R.saveData),B=new WeakMap,se=e=>y.prototype.toString.call(e),V=(e,t)=>e===`[object ${t}]`,ce=0,H=e=>{let t=typeof e,n=se(e),r=V(n,`Date`),i=V(n,`RegExp`),a=V(n,`Object`),o,s;if(y(e)===e&&!r&&!i){if(o=B.get(e),o)return o;if(o=++ce+`~`,B.set(e,o),Array.isArray(e)){for(o=`@`,s=0;s<e.length;s++)o+=H(e[s])+`,`;B.set(e,o)}if(a){o=`#`;let t=y.keys(e).sort();for(;!b(s=t.pop());)b(e[s])||(o+=s+`:`+H(e[s])+`,`);B.set(e,o)}}else o=r?e.toJSON():t==`symbol`?e.toString():t==`string`?JSON.stringify(e):``+e;return o},le=e=>{if(x(e))try{e=e()}catch{e=``}let t=e;return e=typeof e==`string`?e:(Array.isArray(e)?e.length:e)?H(e):``,[e,t]},U=0,ue=()=>++U;async function de(...e){let[t,n,r,i]=e,a=S({populateCache:!0,throwOnError:!0},typeof i==`boolean`?{revalidate:i}:i||{}),o=a.populateCache,s=a.rollbackOnError,c=a.optimisticData,l=e=>typeof s==`function`?s(e):s!==!1,u=a.throwOnError;if(x(n)){let e=n,r=[],i=t.keys();for(let n of i)!/^\$(inf|sub)\$/.test(n)&&e(t.get(n)._k)&&r.push(n);return Promise.all(r.map(d))}return d(n);async function d(n){let[i]=le(n);if(!i)return;let[s,d]=te(t,i),[f,p,m,h]=g.get(t),_=()=>{let e=f[i];return(x(a.revalidate)?a.revalidate(s().data,n):a.revalidate!==!1)&&(delete m[i],delete h[i],e&&e[0])?e[0](2).then(()=>s().data):s().data};if(e.length<3)return _();let y=r,S,C=!1,w=ue();p[i]=[w,0];let T=!b(c),E=s(),D=E.data,O=E._c,k=b(O)?D:O;if(T&&(c=x(c)?c(k,D):c,d({data:c,_c:k})),x(y))try{y=y(k)}catch(e){S=e,C=!0}if(y&&ee(y))if(y=await y.catch(e=>{S=e,C=!0}),w!==p[i][0]){if(C)throw S;return y}else C&&T&&l(S)&&(o=!0,d({data:k,_c:v}));if(o&&(C||(x(o)?d({data:o(y,k),error:v,_c:v}):d({data:y,error:v,_c:v}))),p[i][1]=ue(),Promise.resolve(_()).then(()=>{d({_c:v})}),C){if(u)throw S;return}return y}}var W=(e,t)=>{for(let n in e)e[n][0]&&e[n][0](t)},G=(e,t)=>{if(!g.has(e)){let n=S(F,t),r=Object.create(null),i=de.bind(v,e),a=_,o=Object.create(null),s=(e,t)=>{let n=o[e]||[];return o[e]=n,n.push(t),()=>n.splice(n.indexOf(t),1)},c=(t,n,r)=>{e.set(t,n);let i=o[t];if(i)for(let e of i)e(n,r)},l=()=>{if(!g.has(e)&&(g.set(e,[r,Object.create(null),Object.create(null),Object.create(null),i,c,s]),!I)){let t=n.initFocus(setTimeout.bind(v,W.bind(v,r,0))),i=n.initReconnect(setTimeout.bind(v,W.bind(v,r,1)));a=()=>{t&&t(),i&&i(),g.delete(e)}}};return l(),[e,i,l,a]}return[e,g.get(e)[4]]},K=(e,t,n,r,i)=>{let a=n.errorRetryCount,o=i.retryCount,s=~~((Math.random()+.5)*(1<<(o<8?o:8)))*n.errorRetryInterval;!b(a)&&o>a||setTimeout(r,s,i)},q=h,[J,fe]=G(new Map),Y=S({onLoadingSlow:_,onSuccess:_,onError:_,onErrorRetry:K,onDiscarded:_,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:z?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:z?5e3:3e3,compare:q,isPaused:()=>!1,cache:J,mutate:fe,fallback:{}},ie),X=(e,t)=>{let n=S(e,t);if(t){let{use:r,fallback:i}=e,{use:a,fallback:o}=t;r&&a&&(n.use=r.concat(a)),i&&o&&(n.fallback=S(i,o))}return n},Z=(0,f.createContext)({}),pe=e=>{let{value:t}=e,n=(0,f.useContext)(Z),r=x(t),i=(0,f.useMemo)(()=>r?t(n):t,[r,n,t]),a=(0,f.useMemo)(()=>r?i:X(n,i),[r,n,i]),o=i&&i.provider,s=(0,f.useRef)(v);o&&!s.current&&(s.current=G(o(a.cache||J),i));let c=s.current;return c&&(a.cache=c[0],a.mutate=c[1]),L(()=>{if(c)return c[2]&&c[2](),c[3]},[]),(0,f.createElement)(Z.Provider,S(e,{value:a}))},Q=E&&window.__SWR_DEVTOOLS_USE__,me=Q?window.__SWR_DEVTOOLS_USE__:[],he=()=>{Q&&(window.__SWR_DEVTOOLS_REACT__=f.default)},ge=e=>x(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],_e=()=>{let e=(0,f.useContext)(Z);return(0,f.useMemo)(()=>S(Y,e),[e])},ve=me.concat(e=>(t,n,r)=>e(t,n&&((...e)=>{let[r]=le(t),[,,,i]=g.get(J);if(r.startsWith(`$inf$`))return n(...e);let a=i[r];return b(a)?n(...e):(delete i[r],a)}),r)),ye=e=>function(...t){let n=_e(),[r,i,a]=ge(t),o=X(n,a),s=e,{use:c}=o,l=(c||[]).concat(ve);for(let e=l.length;e--;)s=l[e](s);return s(r,i||o.fetcher||null,o)},be=(e,t,n)=>{let r=t[e]||(t[e]=[]);return r.push(n),()=>{let e=r.indexOf(n);e>=0&&(r[e]=r[r.length-1],r.pop())}};he();var xe=f.use||(e=>{switch(e.status){case`pending`:throw e;case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:throw e.status=`pending`,e.then(t=>{e.status=`fulfilled`,e.value=t},t=>{e.status=`rejected`,e.reason=t}),e}}),Se={dedupe:!0},Ce=Promise.resolve(v),we=()=>_,Te=(e,t,n)=>{let{cache:r,compare:i,suspense:a,fallbackData:o,revalidateOnMount:s,revalidateIfStale:c,refreshInterval:l,refreshWhenHidden:u,refreshWhenOffline:d,keepPreviousData:m,strictServerPrefetchWarning:h}=n,[_,y,C,w]=g.get(r),[T,E]=le(e),D=(0,f.useRef)(!1),O=(0,f.useRef)(!1),k=(0,f.useRef)(T),A=(0,f.useRef)(t),j=(0,f.useRef)(n),M=()=>j.current,N=()=>M().isVisible()&&M().isOnline(),[P,ne,re,ie]=te(r,T),F=(0,f.useRef)({}).current,R=b(o)?b(n.fallback)?v:n.fallback[T]:o,z=(e,t)=>{for(let n in F){let r=n;if(r===`data`){if(!i(e[r],t[r])&&(!b(e[r])||!i(K,t[r])))return!1}else if(t[r]!==e[r])return!1}return!0},B=!D.current,se=(0,f.useMemo)(()=>{let e=P(),n=ie(),r=e=>{let n=S(e);return delete n._k,!(!T||!t||M().isPaused())&&(B&&!b(s)?s:b(b(R)?n.data:R)||c)?{isValidating:!0,isLoading:!0,...n}:n},i=r(e),a=e===n?i:r(n),o=i;return[()=>{let e=r(P());return z(e,o)?(o.data=e.data,o.isLoading=e.isLoading,o.isValidating=e.isValidating,o.error=e.error,o):(o=e,e)},()=>a]},[r,T]),V=(0,p.useSyncExternalStore)((0,f.useCallback)(e=>re(T,(t,n)=>{z(n,t)||e()}),[r,T]),se[0],se[1]),ce=_[T]&&_[T].length>0,H=V.data,U=b(H)?R&&ee(R)?xe(R):R:H,W=V.error,G=(0,f.useRef)(U),K=m?b(H)?b(G.current)?U:G.current:H:U,q=T&&b(U),J=(0,f.useRef)(null);!I&&(0,p.useSyncExternalStore)(we,()=>(J.current=!1,J),()=>(J.current=!0,J));let fe=J.current;h&&fe&&!a&&q&&console.warn(`Missing pre-initiated data for serialized key "${T}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let Y=!T||!t||M().isPaused()||ce&&!b(W)?!1:B&&!b(s)?s:a?b(U)?!1:c:b(U)||c,X=B&&Y,Z=b(V.isValidating)?X:V.isValidating,pe=b(V.isLoading)?X:V.isLoading,Q=(0,f.useCallback)(async e=>{let t=A.current;if(!T||!t||O.current||M().isPaused())return!1;let r,a,o=!0,s=e||{},c=!C[T]||!s.dedupe,l=()=>ae?!O.current&&T===k.current&&D.current:T===k.current,u={isValidating:!1,isLoading:!1},d=()=>{ne(u)},f=()=>{let e=C[T];e&&e[1]===a&&delete C[T]},p={isValidating:!0};b(P().data)&&(p.isLoading=!0);try{if(c&&(ne(p),n.loadingTimeout&&b(P().data)&&setTimeout(()=>{o&&l()&&M().onLoadingSlow(T,n)},n.loadingTimeout),C[T]=[t(E),ue()]),[r,a]=C[T],r=await r,c&&setTimeout(f,n.dedupingInterval),!C[T]||C[T][1]!==a)return c&&l()&&M().onDiscarded(T),!1;u.error=v;let e=y[T];if(!b(e)&&(a<=e[0]||a<=e[1]||e[1]===0))return d(),c&&l()&&M().onDiscarded(T),!1;let s=P().data;u.data=i(s,r)?s:r,c&&l()&&M().onSuccess(r,T,n)}catch(e){f();let t=M(),{shouldRetryOnError:n}=t;t.isPaused()||(u.error=e,c&&l()&&(t.onError(e,T,t),(n===!0||x(n)&&n(e))&&(!M().revalidateOnFocus||!M().revalidateOnReconnect||N())&&t.onErrorRetry(e,T,t,e=>{let t=_[T];t&&t[0]&&t[0](3,e)},{retryCount:(s.retryCount||0)+1,dedupe:!0})))}return o=!1,d(),!0},[T,r]),me=(0,f.useCallback)((...e)=>de(r,k.current,...e),[]);if(L(()=>{A.current=t,j.current=n,b(H)||(G.current=H)}),L(()=>{if(!T)return;let e=Q.bind(v,Se),t=0;M().revalidateOnFocus&&(t=Date.now()+M().focusThrottleInterval);let n=be(T,_,(n,r={})=>{if(n==0){let n=Date.now();M().revalidateOnFocus&&n>t&&N()&&(t=n+M().focusThrottleInterval,e())}else if(n==1)M().revalidateOnReconnect&&N()&&e();else if(n==2)return Q();else if(n==3)return Q(r)});return O.current=!1,k.current=T,D.current=!0,ne({_k:E}),Y&&(C[T]||(b(U)||I?e():oe(e))),()=>{O.current=!0,n()}},[T]),L(()=>{let e;function t(){let t=x(l)?l(P().data):l;t&&e!==-1&&(e=setTimeout(n,t))}function n(){!P().error&&(u||M().isVisible())&&(d||M().isOnline())?Q(Se).then(t):t()}return t(),()=>{e&&=(clearTimeout(e),-1)}},[l,u,d,T]),(0,f.useDebugValue)(K),a){if(!ae&&I&&q)throw Error(`Fallback data is required when using Suspense in SSR.`);q&&(A.current=t,j.current=n,O.current=!1);let e=w[T];if(xe(!b(e)&&q?me(e):Ce),!b(W)&&q)throw W;let r=q?Q(Se):Ce;!b(K)&&q&&(r.status=`fulfilled`,r.value=!0),xe(r)}return{mutate:me,get data(){return F.data=!0,K},get error(){return F.error=!0,W},get isValidating(){return F.isValidating=!0,Z},get isLoading(){return F.isLoading=!0,pe}}};y.defineProperty(pe,`defaultValue`,{value:Y});var Ee=ye(Te),$=r();function De({children:e,className:t}){return(0,$.jsx)(`div`,{className:l(`flex h-full flex-col min-h-0 overflow-hidden`,t),children:e})}function Oe({children:e,className:t}){return(0,$.jsx)(d,{as:`section`,padding:`md`,className:l(`border-transparent bg-card/[0.18] ring-1 ring-white/[0.04]`,t),children:e})}function ke({actions:e,className:t,hint:n,title:r}){return(0,$.jsx)(`div`,{className:l(`border-b border-border/70 pb-4`,t),children:(0,$.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-4`,children:[(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center gap-2`,children:[(0,$.jsx)(`h1`,{className:`text-[28px] font-medium tracking-[-0.04em] text-foreground`,children:r}),n?(0,$.jsx)(o,{delayDuration:150,children:(0,$.jsxs)(s,{children:[(0,$.jsx)(a,{asChild:!0,children:(0,$.jsx)(u,{type:`button`,variant:`ghost`,size:`icon-sm`,className:`inline-flex size-7 items-center justify-center rounded-full border border-border/70 bg-card/20 text-muted-foreground transition-colors hover:bg-accent/35 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/50`,"aria-label":`${r} details`,children:(0,$.jsx)(i,{className:`size-3.5`})})}),(0,$.jsx)(c,{side:`right`,className:`max-w-xs px-3 py-2`,children:n})]})}):null]}),e?(0,$.jsx)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-2`,children:e}):null]})})}function Ae({title:e}){return(0,$.jsx)(`div`,{className:`mb-4`,children:(0,$.jsx)(`h2`,{className:`text-[14px] font-medium tracking-tight text-foreground/90`,children:e})})}function je({children:e,className:t,contentClassName:n,separated:r=!1,title:i}){return(0,$.jsxs)(`section`,{className:l(r?`border-t border-border pt-8`:`mb-10`,t),children:[(0,$.jsx)(Ae,{title:i}),(0,$.jsx)(`div`,{className:l(`rounded-xl border border-white/[0.04] bg-card/[0.03] shadow-sm px-5 transition-colors`,n),children:e})]})}function Me({label:e,description:t,children:n,valueClassName:r}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-2 border-b border-border/40 py-5 last:border-b-0 md:flex-row md:items-start md:justify-between md:gap-8 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 shrink-0 md:w-[35%] pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1 text-[12px] text-muted-foreground/70 leading-relaxed pr-4`,children:t})]}),(0,$.jsx)(`div`,{className:l(`w-full min-w-0 flex-1 md:w-[65%] flex md:justify-end`,r),children:(0,$.jsx)(`div`,{className:`w-full md:max-w-md space-y-3`,children:n})})]})}function Ne({label:e,description:t,children:n}){return(0,$.jsxs)(`div`,{className:`flex flex-col gap-3 border-b border-border/40 py-5 last:border-b-0 hover:bg-muted/10 transition-colors`,children:[(0,$.jsxs)(`div`,{className:`min-w-0 pt-1`,children:[(0,$.jsx)(`label`,{className:`block text-[13px] font-medium text-foreground/80 tracking-tight`,children:e}),t&&(0,$.jsx)(`p`,{className:`mt-1.5 text-[12px] text-muted-foreground/70 leading-relaxed max-w-2xl`,children:t})]}),(0,$.jsx)(`div`,{className:`w-full mt-1`,children:n})]})}function Pe({children:e,className:t}){return(0,$.jsx)(`div`,{className:l(`mt-3 flex flex-col gap-3 rounded-lg border border-border/40 bg-background/30 p-4`,t),children:e})}export{Me as a,Ee as c,Pe as i,De as n,Ne as o,ke as r,Oe as s,je as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{Lt as r,dt as i,q as a}from"./ui-vendor-UazN8rcv.js";import{B as o,a as s,i as c,n as l,q as u,r as d,s as f,tt as p}from"./index-Biio-CoI.js";import{l as m,s as h}from"./surface-Bzr1FRG4.js";import{c as g,n as _,r as v}from"./PageScaffold-DteOA8V7.js";async function y(){return o(`/api/prompts`,{errorMessage:`Failed to fetch prompts`})}async function b(e){return o(`/api/prompts`,{method:`PUT`,body:e,errorMessage:`Failed to save prompts`})}var x=e(t(),1),S=n(),C=`min-h-0 w-full flex-1 resize-none select-text rounded-md bg-transparent p-3 font-mono text-[13px] leading-relaxed text-foreground placeholder:text-muted-foreground transition-colors focus:bg-background/35 focus:outline-none scrollbar-none`;function w(){let{data:e,isLoading:t,mutate:n}=g(`promptSettings`,y),[r,o]=(0,x.useState)(``),[s,c]=(0,x.useState)(``),[l,d]=(0,x.useState)(!1);(0,x.useEffect)(()=>{e&&(o(e.custom_prompt),c(e.custom_post_prompt))},[e]);let w=async()=>{d(!0);try{n(await b({custom_prompt:r,custom_post_prompt:s}),!1),a.success(`Prompts saved`)}catch{a.error(`Failed to save prompts`)}finally{d(!1)}};return t?(0,S.jsx)(f,{label:`Loading prompts...`,textClassName:`text-[13px]`}):(0,S.jsx)(_,{children:(0,S.jsxs)(`div`,{className:`mx-auto flex h-full w-full max-w-[800px] flex-col px-4 pb-10 pt-6`,children:[(0,S.jsx)(v,{title:`Prompts`,hint:`Custom Prompt is appended to the global system prompt layer. Custom Post Prompt is appended after the built-in runtime post prompt.`,actions:(0,S.jsxs)(p,{type:`button`,onClick:()=>void w(),disabled:l,size:`sm`,className:`text-[13px]`,children:[(0,S.jsx)(i,{className:`size-4`}),l?`Saving...`:`Save Changes`]})}),(0,S.jsxs)(`div`,{className:`grid min-h-0 flex-1 gap-8 pt-6`,children:[(0,S.jsxs)(`div`,{className:`flex min-h-0 flex-col`,children:[(0,S.jsx)(`div`,{className:`mb-3 flex items-center justify-between px-1`,children:(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{className:`text-[15px] font-medium text-foreground`,children:`Custom Prompt`}),T(`Custom Prompt details`,`Appended to every node's system prompt.`),(0,S.jsxs)(m,{tone:`neutral`,className:`px-2 py-0.5`,children:[r.length,` chars`]})]})}),(0,S.jsx)(h,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(u,{"aria-label":`Custom Prompt`,value:r,onChange:e=>o(e.target.value),placeholder:`Appended to every node's system prompt...`,className:C,mono:!0})})]}),(0,S.jsxs)(`div`,{className:`flex min-h-0 flex-col`,children:[(0,S.jsx)(`div`,{className:`mb-3 flex items-center justify-between px-1`,children:(0,S.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,S.jsx)(`h2`,{className:`text-[15px] font-medium text-foreground`,children:`Custom Post Prompt`}),T(`Custom Post Prompt details`,`Appended after the built-in runtime post prompt.`),(0,S.jsxs)(m,{tone:`neutral`,className:`px-2 py-0.5`,children:[s.length,` chars`]})]})}),(0,S.jsx)(h,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(u,{"aria-label":`Custom Post Prompt`,value:s,onChange:e=>c(e.target.value),placeholder:`Appended after the built-in runtime post prompt...`,className:C,mono:!0})})]})]})]})})}var T=(e,t)=>(0,S.jsx)(c,{delayDuration:150,children:(0,S.jsxs)(l,{children:[(0,S.jsx)(s,{asChild:!0,children:(0,S.jsx)(p,{type:`button`,variant:`ghost`,size:`icon-xs`,"aria-label":e,className:`rounded-full text-muted-foreground hover:bg-accent/35 hover:text-foreground`,children:(0,S.jsx)(r,{className:`size-3.5`})})}),(0,S.jsx)(d,{className:`max-w-xs`,children:t})]})});export{w as PromptsPage};
|