flowent 0.0.7 → 0.0.11
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 +0 -3
- package/backend/README.md +0 -3
- package/backend/pyproject.toml +2 -8
- package/backend/src/flowent/__init__.py +6 -2
- package/backend/src/flowent/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/agent.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/context.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/llm.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__/patch.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/paths.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/sandbox.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/storage.cpython-313.pyc +0 -0
- package/backend/src/flowent/__pycache__/tools.cpython-313.pyc +0 -0
- package/backend/src/flowent/agent.py +213 -3173
- package/backend/src/flowent/cli.py +19 -24
- package/backend/src/flowent/context.py +127 -0
- package/backend/src/flowent/llm.py +256 -0
- package/backend/src/flowent/logging.py +170 -129
- package/backend/src/flowent/main.py +321 -70
- package/backend/src/flowent/patch.py +182 -0
- package/backend/src/flowent/paths.py +11 -0
- package/backend/src/flowent/sandbox.py +214 -40
- package/backend/src/flowent/static/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/backend/src/flowent/static/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/backend/src/flowent/static/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/backend/src/flowent/static/assets/index-C76K95ty.js +81 -0
- package/backend/src/flowent/static/assets/index-iUMNKvlU.css +2 -0
- package/backend/src/flowent/static/flowent.png +0 -0
- package/backend/src/flowent/static/index.html +5 -25
- package/backend/src/flowent/storage.py +302 -0
- package/backend/src/flowent/tools.py +376 -0
- package/backend/tests/__pycache__/test_agent_tools.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/__pycache__/test_health.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/__pycache__/test_llm_providers.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/__pycache__/test_logging.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/__pycache__/test_persistence.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/__pycache__/test_workspace_chat.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/test_agent_tools.py +477 -0
- package/backend/tests/test_health.py +12 -0
- package/backend/tests/test_llm_providers.py +113 -0
- package/backend/tests/test_logging.py +182 -0
- package/backend/tests/test_persistence.py +125 -0
- package/backend/tests/test_workspace_chat.py +578 -0
- package/backend/uv.lock +803 -99
- package/dist/frontend/assets/geist-cyrillic-wght-normal-CHSlOQsW.woff2 +0 -0
- package/dist/frontend/assets/geist-latin-ext-wght-normal-DMtmJ5ZE.woff2 +0 -0
- package/dist/frontend/assets/geist-latin-wght-normal-Dm3htQBi.woff2 +0 -0
- package/dist/frontend/assets/index-C76K95ty.js +81 -0
- package/dist/frontend/assets/index-iUMNKvlU.css +2 -0
- package/dist/frontend/flowent.png +0 -0
- package/dist/frontend/index.html +5 -25
- package/package.json +1 -2
- 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__/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__/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__/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/access.py +0 -247
- package/backend/src/flowent/assistant_commands.py +0 -115
- package/backend/src/flowent/channels/__init__.py +0 -3
- 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 +0 -615
- package/backend/src/flowent/config.py +0 -14
- package/backend/src/flowent/dev.py +0 -3
- package/backend/src/flowent/events.py +0 -157
- package/backend/src/flowent/graph_runtime.py +0 -60
- package/backend/src/flowent/graph_service.py +0 -2401
- package/backend/src/flowent/image_assets.py +0 -356
- package/backend/src/flowent/model_metadata.py +0 -102
- package/backend/src/flowent/models/__init__.py +0 -125
- 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 +0 -34
- package/backend/src/flowent/models/base.py +0 -24
- package/backend/src/flowent/models/blueprint.py +0 -176
- package/backend/src/flowent/models/content.py +0 -164
- package/backend/src/flowent/models/delta.py +0 -44
- package/backend/src/flowent/models/event.py +0 -51
- package/backend/src/flowent/models/graph.py +0 -472
- package/backend/src/flowent/models/history.py +0 -272
- package/backend/src/flowent/models/llm.py +0 -62
- package/backend/src/flowent/models/message.py +0 -33
- package/backend/src/flowent/models/tab.py +0 -85
- package/backend/src/flowent/models/todo.py +0 -10
- package/backend/src/flowent/network.py +0 -146
- package/backend/src/flowent/observability_service.py +0 -218
- package/backend/src/flowent/prompts/__init__.py +0 -67
- 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 +0 -250
- package/backend/src/flowent/prompts/steward.py +0 -64
- package/backend/src/flowent/providers/__init__.py +0 -23
- 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 +0 -468
- package/backend/src/flowent/providers/base_url.py +0 -60
- package/backend/src/flowent/providers/configuration.py +0 -189
- package/backend/src/flowent/providers/content.py +0 -122
- package/backend/src/flowent/providers/errors.py +0 -223
- package/backend/src/flowent/providers/gateway.py +0 -169
- package/backend/src/flowent/providers/gemini.py +0 -447
- package/backend/src/flowent/providers/headers.py +0 -20
- package/backend/src/flowent/providers/management.py +0 -96
- package/backend/src/flowent/providers/ollama.py +0 -293
- package/backend/src/flowent/providers/openai.py +0 -422
- package/backend/src/flowent/providers/openai_responses.py +0 -655
- package/backend/src/flowent/providers/registry.py +0 -144
- package/backend/src/flowent/providers/sse.py +0 -31
- package/backend/src/flowent/providers/thinking.py +0 -79
- package/backend/src/flowent/registry.py +0 -73
- package/backend/src/flowent/role_management.py +0 -270
- package/backend/src/flowent/routes/__init__.py +0 -26
- package/backend/src/flowent/routes/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/access.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/assistant.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/image_assets.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/meta.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/nodes.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/prompts.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/providers_route.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/settings.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/tabs.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/__pycache__/ws.cpython-313.pyc +0 -0
- package/backend/src/flowent/routes/access.py +0 -48
- package/backend/src/flowent/routes/assistant.py +0 -158
- package/backend/src/flowent/routes/image_assets.py +0 -33
- package/backend/src/flowent/routes/meta.py +0 -28
- package/backend/src/flowent/routes/nodes.py +0 -423
- package/backend/src/flowent/routes/prompts.py +0 -46
- package/backend/src/flowent/routes/providers_route.py +0 -365
- package/backend/src/flowent/routes/roles.py +0 -207
- package/backend/src/flowent/routes/settings.py +0 -379
- package/backend/src/flowent/routes/tabs.py +0 -298
- package/backend/src/flowent/routes/ws.py +0 -33
- package/backend/src/flowent/runtime.py +0 -160
- package/backend/src/flowent/security.py +0 -37
- package/backend/src/flowent/settings.py +0 -2112
- package/backend/src/flowent/settings_management.py +0 -394
- package/backend/src/flowent/state_db.py +0 -108
- package/backend/src/flowent/static/assets/AssistantPage-BW7XAd9I.js +0 -1
- package/backend/src/flowent/static/assets/ChannelsPage-tCJHgt6m.js +0 -1
- package/backend/src/flowent/static/assets/PageScaffold-f6g2l7XN.js +0 -1
- package/backend/src/flowent/static/assets/PromptsPage-C3Sxn2D7.js +0 -1
- package/backend/src/flowent/static/assets/ProvidersPage-BfmdXmNt.js +0 -3
- package/backend/src/flowent/static/assets/RolesPage-DET8wO4r.js +0 -1
- package/backend/src/flowent/static/assets/SettingsPage-D-g3deMm.js +0 -3
- package/backend/src/flowent/static/assets/ToolsPage-CDmtE2g4.js +0 -1
- package/backend/src/flowent/static/assets/WorkspacePage-AZsJ0sD0.js +0 -3
- package/backend/src/flowent/static/assets/WorkspacePanels-CteCjolX.js +0 -1
- package/backend/src/flowent/static/assets/alert-dialog-Duorp_S-.js +0 -1
- package/backend/src/flowent/static/assets/dialog-C3ixjGjN.js +0 -1
- package/backend/src/flowent/static/assets/elk-worker.min-C9JGDOE-.js +0 -6312
- package/backend/src/flowent/static/assets/graph-vendor-CHpVij2M.css +0 -1
- package/backend/src/flowent/static/assets/graph-vendor-DRq_-6fV.js +0 -7
- package/backend/src/flowent/static/assets/index--o_0fv0N.css +0 -1
- package/backend/src/flowent/static/assets/index-C9HuekJm.js +0 -10
- package/backend/src/flowent/static/assets/layout.worker-jMHqAFbP.js +0 -24
- package/backend/src/flowent/static/assets/markdown-vendor-C9RtvaJh.js +0 -29
- package/backend/src/flowent/static/assets/modelParams-DmnF2hwR.js +0 -1
- package/backend/src/flowent/static/assets/providerTypes-DT3Ahwl_.js +0 -1
- package/backend/src/flowent/static/assets/react-vendor-mEs_JJxa.js +0 -9
- package/backend/src/flowent/static/assets/roles-CuRT_chR.js +0 -1
- package/backend/src/flowent/static/assets/rolldown-runtime-BYbx6iT9.js +0 -1
- package/backend/src/flowent/static/assets/select-DCfeNu-F.js +0 -1
- package/backend/src/flowent/static/assets/surface-pWwG5ogx.js +0 -1
- package/backend/src/flowent/static/assets/ui-vendor-C5pJa8N7.js +0 -51
- package/backend/src/flowent/static/assets/useAppRoute-FgSHBKhV.js +0 -1
- package/backend/src/flowent/static/favicon.svg +0 -4
- package/backend/src/flowent/tools/__init__.py +0 -176
- package/backend/src/flowent/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/connect.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/contacts.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/create_agent.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/create_tab.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/delete_tab.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/edit.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/exec.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/fetch.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/idle.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_tabs.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/list_tools.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_prompts.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_providers.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_roles.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/manage_settings.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/read.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/send.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/set_permissions.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/sleep.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/__pycache__/todo.cpython-313.pyc +0 -0
- package/backend/src/flowent/tools/connect.py +0 -100
- package/backend/src/flowent/tools/contacts.py +0 -22
- package/backend/src/flowent/tools/create_agent.py +0 -191
- package/backend/src/flowent/tools/create_tab.py +0 -61
- package/backend/src/flowent/tools/delete_tab.py +0 -39
- package/backend/src/flowent/tools/edit.py +0 -142
- package/backend/src/flowent/tools/exec.py +0 -118
- package/backend/src/flowent/tools/fetch.py +0 -85
- package/backend/src/flowent/tools/idle.py +0 -27
- package/backend/src/flowent/tools/list_roles.py +0 -68
- package/backend/src/flowent/tools/list_tabs.py +0 -100
- package/backend/src/flowent/tools/list_tools.py +0 -28
- package/backend/src/flowent/tools/manage_prompts.py +0 -102
- package/backend/src/flowent/tools/manage_providers.py +0 -220
- package/backend/src/flowent/tools/manage_roles.py +0 -275
- package/backend/src/flowent/tools/manage_settings.py +0 -326
- package/backend/src/flowent/tools/read.py +0 -152
- package/backend/src/flowent/tools/send.py +0 -68
- package/backend/src/flowent/tools/set_permissions.py +0 -99
- package/backend/src/flowent/tools/sleep.py +0 -41
- package/backend/src/flowent/tools/todo.py +0 -51
- package/backend/src/flowent/workspace_store.py +0 -479
- 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 +0 -6
- package/backend/tests/integration/api/__pycache__/conftest.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_access_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_assistant_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_frontend_mounting.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_meta_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_nodes_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_prompts_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_roles_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/__pycache__/test_tabs_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/integration/api/conftest.py +0 -29
- package/backend/tests/integration/api/test_access_api.py +0 -182
- package/backend/tests/integration/api/test_assistant_api.py +0 -422
- package/backend/tests/integration/api/test_frontend_mounting.py +0 -61
- package/backend/tests/integration/api/test_meta_api.py +0 -32
- package/backend/tests/integration/api/test_nodes_api.py +0 -787
- package/backend/tests/integration/api/test_prompts_api.py +0 -47
- package/backend/tests/integration/api/test_roles_api.py +0 -228
- package/backend/tests/integration/api/test_tabs_api.py +0 -688
- package/backend/tests/unit/__pycache__/test_access.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_cli.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_graph_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_network.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_state_sqlite_storage.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/__pycache__/test_workspace_store.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/__pycache__/test_agent_public_api.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/__pycache__/test_agent_runtime.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/agent/test_agent_public_api.py +0 -822
- package/backend/tests/unit/agent/test_agent_runtime.py +0 -3088
- 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 +0 -552
- 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 +0 -132
- 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 +0 -570
- 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 +0 -185
- package/backend/tests/unit/providers/test_errors.py +0 -68
- package/backend/tests/unit/providers/test_extract_delta_parts.py +0 -22
- package/backend/tests/unit/providers/test_openai_provider.py +0 -139
- package/backend/tests/unit/providers/test_openai_responses.py +0 -402
- package/backend/tests/unit/providers/test_provider_gateway.py +0 -359
- package/backend/tests/unit/providers/test_think_tag_parser.py +0 -36
- package/backend/tests/unit/routes/__pycache__/test_prompts_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_providers_route.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_roles_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/__pycache__/test_settings_routes.cpython-313-pytest-9.0.3.pyc +0 -0
- package/backend/tests/unit/routes/test_prompts_routes.py +0 -82
- package/backend/tests/unit/routes/test_providers_route.py +0 -370
- package/backend/tests/unit/routes/test_roles_routes.py +0 -539
- package/backend/tests/unit/routes/test_settings_routes.py +0 -1123
- 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 +0 -1002
- 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 +0 -78
- 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 +0 -124
- 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 +0 -703
- package/backend/tests/unit/test_access.py +0 -45
- package/backend/tests/unit/test_cli.py +0 -102
- package/backend/tests/unit/test_graph_runtime.py +0 -72
- package/backend/tests/unit/test_network.py +0 -51
- package/backend/tests/unit/test_state_sqlite_storage.py +0 -87
- package/backend/tests/unit/test_workspace_store.py +0 -228
- 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 +0 -228
- package/backend/tests/unit/tools/test_create_agent_tool.py +0 -404
- package/backend/tests/unit/tools/test_delete_tab_tool.py +0 -116
- package/backend/tests/unit/tools/test_edit_tool.py +0 -115
- package/backend/tests/unit/tools/test_exec_tool.py +0 -81
- package/backend/tests/unit/tools/test_fetch_tool.py +0 -65
- package/backend/tests/unit/tools/test_manage_prompts_tool.py +0 -92
- package/backend/tests/unit/tools/test_manage_providers_tool.py +0 -460
- package/backend/tests/unit/tools/test_manage_roles_tool.py +0 -411
- package/backend/tests/unit/tools/test_manage_settings_tool.py +0 -611
- package/backend/tests/unit/tools/test_read_tool.py +0 -33
- package/backend/tests/unit/tools/test_set_permissions_tool.py +0 -595
- package/backend/tests/unit/tools/test_todo_tool.py +0 -37
- package/backend/tests/unit/tools/test_tool_registry.py +0 -199
- package/dist/frontend/assets/AssistantPage-BW7XAd9I.js +0 -1
- package/dist/frontend/assets/ChannelsPage-tCJHgt6m.js +0 -1
- package/dist/frontend/assets/PageScaffold-f6g2l7XN.js +0 -1
- package/dist/frontend/assets/PromptsPage-C3Sxn2D7.js +0 -1
- package/dist/frontend/assets/ProvidersPage-BfmdXmNt.js +0 -3
- package/dist/frontend/assets/RolesPage-DET8wO4r.js +0 -1
- package/dist/frontend/assets/SettingsPage-D-g3deMm.js +0 -3
- package/dist/frontend/assets/ToolsPage-CDmtE2g4.js +0 -1
- package/dist/frontend/assets/WorkspacePage-AZsJ0sD0.js +0 -3
- package/dist/frontend/assets/WorkspacePanels-CteCjolX.js +0 -1
- package/dist/frontend/assets/alert-dialog-Duorp_S-.js +0 -1
- package/dist/frontend/assets/dialog-C3ixjGjN.js +0 -1
- package/dist/frontend/assets/elk-worker.min-C9JGDOE-.js +0 -6312
- package/dist/frontend/assets/graph-vendor-CHpVij2M.css +0 -1
- package/dist/frontend/assets/graph-vendor-DRq_-6fV.js +0 -7
- package/dist/frontend/assets/index--o_0fv0N.css +0 -1
- package/dist/frontend/assets/index-C9HuekJm.js +0 -10
- package/dist/frontend/assets/layout.worker-jMHqAFbP.js +0 -24
- package/dist/frontend/assets/markdown-vendor-C9RtvaJh.js +0 -29
- package/dist/frontend/assets/modelParams-DmnF2hwR.js +0 -1
- package/dist/frontend/assets/providerTypes-DT3Ahwl_.js +0 -1
- package/dist/frontend/assets/react-vendor-mEs_JJxa.js +0 -9
- package/dist/frontend/assets/roles-CuRT_chR.js +0 -1
- package/dist/frontend/assets/rolldown-runtime-BYbx6iT9.js +0 -1
- package/dist/frontend/assets/select-DCfeNu-F.js +0 -1
- package/dist/frontend/assets/surface-pWwG5ogx.js +0 -1
- package/dist/frontend/assets/ui-vendor-C5pJa8N7.js +0 -51
- package/dist/frontend/assets/useAppRoute-FgSHBKhV.js +0 -1
- package/dist/frontend/favicon.svg +0 -4
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from collections.abc import Callable
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
from typing import Final
|
|
6
|
-
|
|
7
|
-
from flowent.settings import (
|
|
8
|
-
AssistantSettings,
|
|
9
|
-
EventLogSettings,
|
|
10
|
-
LeaderSettings,
|
|
11
|
-
ModelSettings,
|
|
12
|
-
Settings,
|
|
13
|
-
build_assistant_allow_network,
|
|
14
|
-
build_assistant_write_dirs,
|
|
15
|
-
build_default_model_params,
|
|
16
|
-
build_model_auto_compact_token_limit,
|
|
17
|
-
build_model_context_window_tokens,
|
|
18
|
-
build_model_input_image,
|
|
19
|
-
build_model_max_retries,
|
|
20
|
-
build_model_output_image,
|
|
21
|
-
build_model_params_from_mapping,
|
|
22
|
-
build_model_retry_backoff_cap_retries,
|
|
23
|
-
build_model_retry_initial_delay_seconds,
|
|
24
|
-
build_model_retry_max_delay_seconds,
|
|
25
|
-
build_model_retry_policy,
|
|
26
|
-
build_model_structured_output,
|
|
27
|
-
build_model_timeout_ms,
|
|
28
|
-
build_working_dir,
|
|
29
|
-
find_role,
|
|
30
|
-
serialize_settings,
|
|
31
|
-
validate_model_retry_backoff_settings,
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
MISSING: Final = object()
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@dataclass(frozen=True, slots=True)
|
|
38
|
-
class ResolvedSettingsUpdate:
|
|
39
|
-
working_dir: str
|
|
40
|
-
assistant: AssistantSettings
|
|
41
|
-
leader: LeaderSettings
|
|
42
|
-
model: ModelSettings
|
|
43
|
-
event_log: EventLogSettings
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@dataclass(frozen=True, slots=True)
|
|
47
|
-
class SettingsUpdateFieldNames:
|
|
48
|
-
assistant_role: str = "assistant.role_name"
|
|
49
|
-
assistant_allow_network: str = "assistant.allow_network"
|
|
50
|
-
assistant_write_dirs: str = "assistant.write_dirs"
|
|
51
|
-
leader_role: str = "leader.role_name"
|
|
52
|
-
working_dir: str = "working_dir"
|
|
53
|
-
retry_policy: str = "model.retry_policy"
|
|
54
|
-
timeout_ms: str = "model.timeout_ms"
|
|
55
|
-
max_retries: str = "model.max_retries"
|
|
56
|
-
retry_initial_delay_seconds: str = "model.retry_initial_delay_seconds"
|
|
57
|
-
retry_max_delay_seconds: str = "model.retry_max_delay_seconds"
|
|
58
|
-
retry_backoff_cap_retries: str = "model.retry_backoff_cap_retries"
|
|
59
|
-
input_image: str = "model.input_image"
|
|
60
|
-
output_image: str = "model.output_image"
|
|
61
|
-
structured_output: str = "model.structured_output"
|
|
62
|
-
context_window_tokens: str = "model.context_window_tokens"
|
|
63
|
-
auto_compact_token_limit: str = "model.auto_compact_token_limit"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def serialize_manage_settings(settings: Settings) -> dict[str, object]:
|
|
67
|
-
serialized = serialize_settings(settings)
|
|
68
|
-
return {
|
|
69
|
-
"app_data_dir": serialized["app_data_dir"],
|
|
70
|
-
"working_dir": serialized["working_dir"],
|
|
71
|
-
"assistant": serialized["assistant"],
|
|
72
|
-
"leader": serialized["leader"],
|
|
73
|
-
"model": serialized["model"],
|
|
74
|
-
"event_log": serialized["event_log"],
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def _resolve_role_name(
|
|
79
|
-
settings: Settings,
|
|
80
|
-
*,
|
|
81
|
-
current_role_name: str,
|
|
82
|
-
next_role_name: str | None,
|
|
83
|
-
field_name: str,
|
|
84
|
-
) -> str:
|
|
85
|
-
if next_role_name is None:
|
|
86
|
-
return current_role_name
|
|
87
|
-
normalized_role_name = next_role_name.strip()
|
|
88
|
-
if not normalized_role_name:
|
|
89
|
-
raise ValueError(f"{field_name} must not be empty")
|
|
90
|
-
if find_role(settings, normalized_role_name) is None:
|
|
91
|
-
raise ValueError(f"Role '{normalized_role_name}' not found")
|
|
92
|
-
return normalized_role_name
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def _resolve_value[T](
|
|
96
|
-
current_value: T,
|
|
97
|
-
raw_value: object,
|
|
98
|
-
builder: Callable[..., T],
|
|
99
|
-
*,
|
|
100
|
-
field_name: str,
|
|
101
|
-
) -> T:
|
|
102
|
-
if raw_value is MISSING:
|
|
103
|
-
return current_value
|
|
104
|
-
return builder(raw_value, field_name=field_name)
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
def _resolve_assistant_settings(
|
|
108
|
-
settings: Settings,
|
|
109
|
-
*,
|
|
110
|
-
next_working_dir: str,
|
|
111
|
-
assistant_role_name: str | None,
|
|
112
|
-
assistant_allow_network: object,
|
|
113
|
-
assistant_write_dirs: object,
|
|
114
|
-
field_names: SettingsUpdateFieldNames,
|
|
115
|
-
) -> AssistantSettings:
|
|
116
|
-
return AssistantSettings(
|
|
117
|
-
role_name=_resolve_role_name(
|
|
118
|
-
settings,
|
|
119
|
-
current_role_name=settings.assistant.role_name,
|
|
120
|
-
next_role_name=assistant_role_name,
|
|
121
|
-
field_name=field_names.assistant_role,
|
|
122
|
-
),
|
|
123
|
-
allow_network=_resolve_value(
|
|
124
|
-
settings.assistant.allow_network,
|
|
125
|
-
assistant_allow_network,
|
|
126
|
-
build_assistant_allow_network,
|
|
127
|
-
field_name=field_names.assistant_allow_network,
|
|
128
|
-
),
|
|
129
|
-
write_dirs=(
|
|
130
|
-
list(settings.assistant.write_dirs)
|
|
131
|
-
if assistant_write_dirs is MISSING
|
|
132
|
-
else build_assistant_write_dirs(
|
|
133
|
-
assistant_write_dirs,
|
|
134
|
-
field_name=field_names.assistant_write_dirs,
|
|
135
|
-
base_dir=next_working_dir,
|
|
136
|
-
)
|
|
137
|
-
),
|
|
138
|
-
)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def _resolve_leader_settings(
|
|
142
|
-
settings: Settings,
|
|
143
|
-
*,
|
|
144
|
-
leader_role_name: str | None,
|
|
145
|
-
field_names: SettingsUpdateFieldNames,
|
|
146
|
-
) -> LeaderSettings:
|
|
147
|
-
return LeaderSettings(
|
|
148
|
-
role_name=_resolve_role_name(
|
|
149
|
-
settings,
|
|
150
|
-
current_role_name=settings.leader.role_name,
|
|
151
|
-
next_role_name=leader_role_name,
|
|
152
|
-
field_name=field_names.leader_role,
|
|
153
|
-
)
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
def _resolve_model_params(settings: Settings, model_params: object):
|
|
158
|
-
if model_params is MISSING:
|
|
159
|
-
return settings.model.params
|
|
160
|
-
return build_model_params_from_mapping(model_params) or build_default_model_params()
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def _resolve_model_settings(
|
|
164
|
-
settings: Settings,
|
|
165
|
-
*,
|
|
166
|
-
active_provider_id: str | None,
|
|
167
|
-
active_model: str | None,
|
|
168
|
-
context_window_tokens: object,
|
|
169
|
-
input_image: object,
|
|
170
|
-
output_image: object,
|
|
171
|
-
structured_output: object,
|
|
172
|
-
max_retries: object,
|
|
173
|
-
retry_policy: object,
|
|
174
|
-
timeout_ms: object,
|
|
175
|
-
retry_initial_delay_seconds: object,
|
|
176
|
-
retry_max_delay_seconds: object,
|
|
177
|
-
retry_backoff_cap_retries: object,
|
|
178
|
-
auto_compact_token_limit: object,
|
|
179
|
-
model_params: object,
|
|
180
|
-
field_names: SettingsUpdateFieldNames,
|
|
181
|
-
) -> ModelSettings:
|
|
182
|
-
retry_initial_delay = _resolve_value(
|
|
183
|
-
settings.model.retry_initial_delay_seconds,
|
|
184
|
-
retry_initial_delay_seconds,
|
|
185
|
-
build_model_retry_initial_delay_seconds,
|
|
186
|
-
field_name=field_names.retry_initial_delay_seconds,
|
|
187
|
-
)
|
|
188
|
-
retry_max_delay = _resolve_value(
|
|
189
|
-
settings.model.retry_max_delay_seconds,
|
|
190
|
-
retry_max_delay_seconds,
|
|
191
|
-
build_model_retry_max_delay_seconds,
|
|
192
|
-
field_name=field_names.retry_max_delay_seconds,
|
|
193
|
-
)
|
|
194
|
-
validate_model_retry_backoff_settings(
|
|
195
|
-
retry_initial_delay_seconds=retry_initial_delay,
|
|
196
|
-
retry_max_delay_seconds=retry_max_delay,
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
return ModelSettings(
|
|
200
|
-
active_provider_id=(
|
|
201
|
-
settings.model.active_provider_id
|
|
202
|
-
if active_provider_id is None
|
|
203
|
-
else active_provider_id
|
|
204
|
-
),
|
|
205
|
-
active_model=(
|
|
206
|
-
settings.model.active_model if active_model is None else active_model
|
|
207
|
-
),
|
|
208
|
-
input_image=_resolve_value(
|
|
209
|
-
settings.model.input_image,
|
|
210
|
-
input_image,
|
|
211
|
-
build_model_input_image,
|
|
212
|
-
field_name=field_names.input_image,
|
|
213
|
-
),
|
|
214
|
-
output_image=_resolve_value(
|
|
215
|
-
settings.model.output_image,
|
|
216
|
-
output_image,
|
|
217
|
-
build_model_output_image,
|
|
218
|
-
field_name=field_names.output_image,
|
|
219
|
-
),
|
|
220
|
-
structured_output=_resolve_value(
|
|
221
|
-
settings.model.structured_output,
|
|
222
|
-
structured_output,
|
|
223
|
-
build_model_structured_output,
|
|
224
|
-
field_name=field_names.structured_output,
|
|
225
|
-
),
|
|
226
|
-
context_window_tokens=_resolve_value(
|
|
227
|
-
settings.model.context_window_tokens,
|
|
228
|
-
context_window_tokens,
|
|
229
|
-
build_model_context_window_tokens,
|
|
230
|
-
field_name=field_names.context_window_tokens,
|
|
231
|
-
),
|
|
232
|
-
params=_resolve_model_params(settings, model_params),
|
|
233
|
-
timeout_ms=_resolve_value(
|
|
234
|
-
settings.model.timeout_ms,
|
|
235
|
-
timeout_ms,
|
|
236
|
-
build_model_timeout_ms,
|
|
237
|
-
field_name=field_names.timeout_ms,
|
|
238
|
-
),
|
|
239
|
-
retry_policy=_resolve_value(
|
|
240
|
-
settings.model.retry_policy,
|
|
241
|
-
retry_policy,
|
|
242
|
-
build_model_retry_policy,
|
|
243
|
-
field_name=field_names.retry_policy,
|
|
244
|
-
),
|
|
245
|
-
max_retries=_resolve_value(
|
|
246
|
-
settings.model.max_retries,
|
|
247
|
-
max_retries,
|
|
248
|
-
build_model_max_retries,
|
|
249
|
-
field_name=field_names.max_retries,
|
|
250
|
-
),
|
|
251
|
-
retry_initial_delay_seconds=retry_initial_delay,
|
|
252
|
-
retry_max_delay_seconds=retry_max_delay,
|
|
253
|
-
retry_backoff_cap_retries=_resolve_value(
|
|
254
|
-
settings.model.retry_backoff_cap_retries,
|
|
255
|
-
retry_backoff_cap_retries,
|
|
256
|
-
build_model_retry_backoff_cap_retries,
|
|
257
|
-
field_name=field_names.retry_backoff_cap_retries,
|
|
258
|
-
),
|
|
259
|
-
auto_compact_token_limit=_resolve_value(
|
|
260
|
-
settings.model.auto_compact_token_limit,
|
|
261
|
-
auto_compact_token_limit,
|
|
262
|
-
build_model_auto_compact_token_limit,
|
|
263
|
-
field_name=field_names.auto_compact_token_limit,
|
|
264
|
-
),
|
|
265
|
-
)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def _resolve_event_log_settings(
|
|
269
|
-
settings: Settings,
|
|
270
|
-
*,
|
|
271
|
-
timestamp_format: str | None,
|
|
272
|
-
) -> EventLogSettings:
|
|
273
|
-
return EventLogSettings(
|
|
274
|
-
timestamp_format=(
|
|
275
|
-
settings.event_log.timestamp_format
|
|
276
|
-
if timestamp_format is None
|
|
277
|
-
else timestamp_format
|
|
278
|
-
)
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
def resolve_settings_update(
|
|
283
|
-
settings: Settings,
|
|
284
|
-
*,
|
|
285
|
-
working_dir: str | None = None,
|
|
286
|
-
assistant_role_name: str | None = None,
|
|
287
|
-
assistant_allow_network: object = MISSING,
|
|
288
|
-
assistant_write_dirs: object = MISSING,
|
|
289
|
-
leader_role_name: str | None = None,
|
|
290
|
-
active_provider_id: str | None = None,
|
|
291
|
-
active_model: str | None = None,
|
|
292
|
-
context_window_tokens: object = MISSING,
|
|
293
|
-
input_image: object = MISSING,
|
|
294
|
-
output_image: object = MISSING,
|
|
295
|
-
structured_output: object = MISSING,
|
|
296
|
-
max_retries: object = MISSING,
|
|
297
|
-
retry_policy: object = MISSING,
|
|
298
|
-
timeout_ms: object = MISSING,
|
|
299
|
-
retry_initial_delay_seconds: object = MISSING,
|
|
300
|
-
retry_max_delay_seconds: object = MISSING,
|
|
301
|
-
retry_backoff_cap_retries: object = MISSING,
|
|
302
|
-
auto_compact_token_limit: object = MISSING,
|
|
303
|
-
model_params: object = MISSING,
|
|
304
|
-
timestamp_format: str | None = None,
|
|
305
|
-
assistant_role_field_name: str = "assistant.role_name",
|
|
306
|
-
assistant_allow_network_field_name: str = "assistant.allow_network",
|
|
307
|
-
assistant_write_dirs_field_name: str = "assistant.write_dirs",
|
|
308
|
-
leader_role_field_name: str = "leader.role_name",
|
|
309
|
-
working_dir_field_name: str = "working_dir",
|
|
310
|
-
retry_policy_field_name: str = "model.retry_policy",
|
|
311
|
-
timeout_ms_field_name: str = "model.timeout_ms",
|
|
312
|
-
max_retries_field_name: str = "model.max_retries",
|
|
313
|
-
retry_initial_delay_seconds_field_name: str = "model.retry_initial_delay_seconds",
|
|
314
|
-
retry_max_delay_seconds_field_name: str = "model.retry_max_delay_seconds",
|
|
315
|
-
retry_backoff_cap_retries_field_name: str = "model.retry_backoff_cap_retries",
|
|
316
|
-
input_image_field_name: str = "model.input_image",
|
|
317
|
-
output_image_field_name: str = "model.output_image",
|
|
318
|
-
structured_output_field_name: str = "model.structured_output",
|
|
319
|
-
context_window_tokens_field_name: str = "model.context_window_tokens",
|
|
320
|
-
auto_compact_token_limit_field_name: str = "model.auto_compact_token_limit",
|
|
321
|
-
) -> ResolvedSettingsUpdate:
|
|
322
|
-
field_names = SettingsUpdateFieldNames(
|
|
323
|
-
assistant_role=assistant_role_field_name,
|
|
324
|
-
assistant_allow_network=assistant_allow_network_field_name,
|
|
325
|
-
assistant_write_dirs=assistant_write_dirs_field_name,
|
|
326
|
-
leader_role=leader_role_field_name,
|
|
327
|
-
working_dir=working_dir_field_name,
|
|
328
|
-
retry_policy=retry_policy_field_name,
|
|
329
|
-
timeout_ms=timeout_ms_field_name,
|
|
330
|
-
max_retries=max_retries_field_name,
|
|
331
|
-
retry_initial_delay_seconds=retry_initial_delay_seconds_field_name,
|
|
332
|
-
retry_max_delay_seconds=retry_max_delay_seconds_field_name,
|
|
333
|
-
retry_backoff_cap_retries=retry_backoff_cap_retries_field_name,
|
|
334
|
-
input_image=input_image_field_name,
|
|
335
|
-
output_image=output_image_field_name,
|
|
336
|
-
structured_output=structured_output_field_name,
|
|
337
|
-
context_window_tokens=context_window_tokens_field_name,
|
|
338
|
-
auto_compact_token_limit=auto_compact_token_limit_field_name,
|
|
339
|
-
)
|
|
340
|
-
next_working_dir = (
|
|
341
|
-
settings.working_dir
|
|
342
|
-
if working_dir is None
|
|
343
|
-
else build_working_dir(working_dir, field_name=field_names.working_dir)
|
|
344
|
-
)
|
|
345
|
-
|
|
346
|
-
return ResolvedSettingsUpdate(
|
|
347
|
-
working_dir=next_working_dir,
|
|
348
|
-
assistant=_resolve_assistant_settings(
|
|
349
|
-
settings,
|
|
350
|
-
next_working_dir=next_working_dir,
|
|
351
|
-
assistant_role_name=assistant_role_name,
|
|
352
|
-
assistant_allow_network=assistant_allow_network,
|
|
353
|
-
assistant_write_dirs=assistant_write_dirs,
|
|
354
|
-
field_names=field_names,
|
|
355
|
-
),
|
|
356
|
-
leader=_resolve_leader_settings(
|
|
357
|
-
settings,
|
|
358
|
-
leader_role_name=leader_role_name,
|
|
359
|
-
field_names=field_names,
|
|
360
|
-
),
|
|
361
|
-
model=_resolve_model_settings(
|
|
362
|
-
settings,
|
|
363
|
-
active_provider_id=active_provider_id,
|
|
364
|
-
active_model=active_model,
|
|
365
|
-
context_window_tokens=context_window_tokens,
|
|
366
|
-
input_image=input_image,
|
|
367
|
-
output_image=output_image,
|
|
368
|
-
structured_output=structured_output,
|
|
369
|
-
max_retries=max_retries,
|
|
370
|
-
retry_policy=retry_policy,
|
|
371
|
-
timeout_ms=timeout_ms,
|
|
372
|
-
retry_initial_delay_seconds=retry_initial_delay_seconds,
|
|
373
|
-
retry_max_delay_seconds=retry_max_delay_seconds,
|
|
374
|
-
retry_backoff_cap_retries=retry_backoff_cap_retries,
|
|
375
|
-
auto_compact_token_limit=auto_compact_token_limit,
|
|
376
|
-
model_params=model_params,
|
|
377
|
-
field_names=field_names,
|
|
378
|
-
),
|
|
379
|
-
event_log=_resolve_event_log_settings(
|
|
380
|
-
settings,
|
|
381
|
-
timestamp_format=timestamp_format,
|
|
382
|
-
),
|
|
383
|
-
)
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
def apply_resolved_settings_update(
|
|
387
|
-
settings: Settings,
|
|
388
|
-
resolved: ResolvedSettingsUpdate,
|
|
389
|
-
) -> None:
|
|
390
|
-
settings.working_dir = resolved.working_dir
|
|
391
|
-
settings.assistant = resolved.assistant
|
|
392
|
-
settings.leader = resolved.leader
|
|
393
|
-
settings.model = resolved.model
|
|
394
|
-
settings.event_log = resolved.event_log
|
|
@@ -1,108 +0,0 @@
|
|
|
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
|
-
DROP TABLE IF EXISTS mcp_snapshots;
|
|
60
|
-
DROP TABLE IF EXISTS mcp_activities;
|
|
61
|
-
CREATE TABLE IF NOT EXISTS tabs (
|
|
62
|
-
id TEXT PRIMARY KEY,
|
|
63
|
-
payload TEXT NOT NULL,
|
|
64
|
-
updated_at REAL NOT NULL
|
|
65
|
-
);
|
|
66
|
-
CREATE TABLE IF NOT EXISTS nodes (
|
|
67
|
-
id TEXT PRIMARY KEY,
|
|
68
|
-
payload TEXT NOT NULL,
|
|
69
|
-
tab_id TEXT,
|
|
70
|
-
node_type TEXT NOT NULL,
|
|
71
|
-
updated_at REAL NOT NULL
|
|
72
|
-
);
|
|
73
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_tab_id ON nodes(tab_id);
|
|
74
|
-
CREATE TABLE IF NOT EXISTS edges (
|
|
75
|
-
id TEXT PRIMARY KEY,
|
|
76
|
-
payload TEXT NOT NULL,
|
|
77
|
-
tab_id TEXT NOT NULL
|
|
78
|
-
);
|
|
79
|
-
CREATE INDEX IF NOT EXISTS idx_edges_tab_id ON edges(tab_id);
|
|
80
|
-
CREATE TABLE IF NOT EXISTS blueprints (
|
|
81
|
-
id TEXT PRIMARY KEY,
|
|
82
|
-
payload TEXT NOT NULL,
|
|
83
|
-
updated_at REAL NOT NULL
|
|
84
|
-
);
|
|
85
|
-
CREATE TABLE IF NOT EXISTS image_assets (
|
|
86
|
-
id TEXT PRIMARY KEY,
|
|
87
|
-
stored_name TEXT NOT NULL,
|
|
88
|
-
mime_type TEXT NOT NULL,
|
|
89
|
-
width INTEGER,
|
|
90
|
-
height INTEGER,
|
|
91
|
-
original_name TEXT
|
|
92
|
-
);
|
|
93
|
-
CREATE TABLE IF NOT EXISTS llm_request_records (
|
|
94
|
-
id TEXT PRIMARY KEY,
|
|
95
|
-
ended_at REAL NOT NULL,
|
|
96
|
-
payload TEXT NOT NULL
|
|
97
|
-
);
|
|
98
|
-
CREATE INDEX IF NOT EXISTS idx_llm_request_records_ended_at
|
|
99
|
-
ON llm_request_records(ended_at);
|
|
100
|
-
CREATE TABLE IF NOT EXISTS compact_records (
|
|
101
|
-
id TEXT PRIMARY KEY,
|
|
102
|
-
ended_at REAL NOT NULL,
|
|
103
|
-
payload TEXT NOT NULL
|
|
104
|
-
);
|
|
105
|
-
CREATE INDEX IF NOT EXISTS idx_compact_records_ended_at
|
|
106
|
-
ON compact_records(ended_at);
|
|
107
|
-
"""
|
|
108
|
-
)
|
|
@@ -1 +0,0 @@
|
|
|
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-C5pJa8N7.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-CteCjolX.js";import{A as h,K as g,M as ue,U as de,Y as _,ft as v,g as y,h as fe,j as b,m as pe,p as me,q as he,ut as x}from"./index-C9HuekJm.js";async function ge(e){return _(`/api/assistant/message`,{method:`POST`,body:e,errorMessage:`Failed to send Assistant message`})}async function _e(e){return _(`/api/assistant/messages/${e}/retry`,{method:`POST`,errorMessage:`Failed to retry Assistant message`})}var S=e(t(),1);function C(e){for(let t of e.values())if(t.node_type===`assistant`)return t;return null}function ve(e){return C(e)?.id??null}var w=`assistant`;function ye(){return s(w)}function be(e){return o(w,e)}function xe(e){ee(w,e)}function T(e={}){let{bottomInset:t=0}=e,{agents:n}=y(),{connected:i}=pe(),{agentHistories:o,clearAgentHistory:s,clearHistorySnapshot:c,historyInvalidatedAt:ee,historyClearedAt:ae,historySnapshots:p,streamingDeltas:_}=fe(),{activeToolCalls:v}=me(),[x,C]=(0,S.useState)(null),[w,T]=(0,S.useState)(0),[E,D]=(0,S.useState)(``),[O,k]=(0,S.useState)([]),[A,j]=(0,S.useState)(null),[Se,Ce]=(0,S.useState)(!1),[we,Te]=(0,S.useState)(null),[M,Ee]=(0,S.useState)(!1),[N,P]=(0,S.useState)([]),[F,I]=(0,S.useState)(null),De=(0,S.useRef)(null),Oe=(0,S.useRef)(!0),ke=(0,S.useRef)([]),L=(0,S.useRef)(null),R=(0,S.useRef)(!1),z=(0,S.useMemo)(()=>ve(n),[n]),B=(0,S.useMemo)(()=>z?n.get(z)??null:null,[n,z]),V=B?.capabilities?.input_image??!1,H=z?ae.get(z)??0:0,U=z?ee.get(z)??0:0,W=z?p.get(z)??null:null,Ae=O.some(e=>e.status===`uploading`),je=O.filter(le),G=(0,S.useSyncExternalStore)(be,ye,ye),K=A===null?null:G[A]??null,q=K!==null&&E===K.text&&se(O,K),J=B?.state??x?.state??null,Y=(0,S.useCallback)(async e=>{let t=e.pendingMessageTimestamp??Date.now(),n=ie(e.content,e.parts,t);Ee(!0),P(e=>[...e,n]);try{let n=await ge({content:e.content,parts:e.parts});return n.status===`command_executed`?P(n=>h(n,{content:e.content,timestamp:t})):n.message_id&&P(r=>r.map(r=>r.timestamp===t&&r.content===e.content?{...r,message_id:n.message_id}:r)),xe(e.history),e.restoreDraft&&d(e.restoreDraft.images),!0}catch(n){return P(n=>h(n,{content:e.content,timestamp:t})),e.restoreDraft&&(D(e.restoreDraft.input),k(e.restoreDraft.images),j(e.restoreDraft.historyCursor)),r.error(n instanceof Error?n.message:`Failed to send message`),!1}finally{Ee(!1)}},[]),X=(0,S.useCallback)((e,t)=>{j(t),D(e?.text??``),k(e?a(e):[])},[]),Me=(0,S.useCallback)(e=>{j(null),D(e)},[]);(0,S.useEffect)(()=>{ke.current=O},[O]),(0,S.useEffect)(()=>{L.current=F},[F]),(0,S.useEffect)(()=>()=>{d(ke.current)},[]),(0,S.useEffect)(()=>{H&&(P([]),I(null),C(e=>e&&{...e,history:u(e.history)}),T(Date.now()))},[H]),(0,S.useEffect)(()=>{U&&(P([]),W&&(C(e=>e&&{...e,history:W}),T(Date.now())))},[U,W]),(0,S.useEffect)(()=>{let e=L.current;!e||e.send_failed||e.target_id!==z||J!==e.target_state&&I({...e,target_state:J})},[z,J]),(0,S.useEffect)(()=>{let e=L.current;!e||e.send_failed||!z||e.target_id!==z||J!==`idle`||M||R.current||(R.current=!0,I(null),Y({content:e.content,parts:e.parts??[],history:e.history_entry,pendingMessageTimestamp:e.timestamp}).then(t=>{R.current=!1,t||I({...e,send_failed:!0,target_state:`error`})}).catch(()=>{R.current=!1,I({...e,send_failed:!0,target_state:`error`})}))},[z,J,M,Y]),(0,S.useEffect)(()=>{if(!i||!z){C(null);return}let e=new AbortController,t=!1;return(async()=>{s(z);try{let n=await g(z,e.signal);if(t||!n)return;C(n),T(Date.now()),c(z)}catch{!t&&!e.signal.aborted&&r.error(`Failed to load Assistant history`)}})(),()=>{t=!0,e.abort()}},[H,U,z,s,c,i]);let Z=(0,S.useMemo)(()=>z?oe({history:W??x?.history??[],incremental:o.get(z),deltas:_.get(z),fetchedAt:w||Date.now()}):[],[o,W,x,w,_,z]);(0,S.useEffect)(()=>{if(!z||N.length===0)return;let e=Z.filter(e=>e.type===`ReceivedMessage`&&e.from_id===`human`&&(!!e.content||!!e.message_id||!!e.parts?.length));e.length!==0&&P(t=>e.reduce((e,t)=>h(e,{content:t.content??b(t.parts,t.content),messageId:t.message_id}),t))},[z,Z,N.length]);let Q=(0,S.useMemo)(()=>[...Z,...F?[{...F}]:[],...N.map(e=>({...e}))],[Z,N,F]),$=(0,S.useMemo)(()=>{let e=N.length+ +!!F,t=z?_.get(z)??[]:[],n=i&&(e>0||B?.state===`running`||B?.state===`sleeping`||v.has(z??``)||t.length>0),r=[...Q].map((e,t)=>({item:e,index:t})).reverse().find(({item:e})=>e.type===`PendingHumanMessage`?!0:e.type===`ReceivedMessage`&&e.from_id===`human`&&ue(e.parts,e.content).length>0)?.index,a=r===void 0?[]:Q.slice(r+1),o=a.some(e=>e.type===`AssistantText`&&ue(e.parts,e.content).length>0),s=[...a].reverse().find(e=>e.type===`ToolCall`&&e.streaming===!0),c=(z?v.get(z)??null:null)??s?.tool_name??null;return{running:n,runningHint:n&&r!==void 0&&!o?{label:c?`Running tools...`:`Thinking...`,toolName:c}:null}},[v,z,B?.state,i,N.length,F,_,Q]);(0,S.useLayoutEffect)(()=>{let e=De.current;!e||!Oe.current||(e.scrollTop=e.scrollHeight)},[t,$.runningHint?`${$.runningHint.label}:${$.runningHint.toolName??``}`:``,Q]),(0,S.useLayoutEffect)(()=>{let e=De.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(()=>{Oe.current&&(e.scrollTop=e.scrollHeight)});return t.observe(e),()=>{t.disconnect()}},[]);let Ne=e=>{Oe.current=ne(e.currentTarget)},Pe=async(e={})=>{let t=E.trim();if(!t&&je.length===0||Ae||M)return;let n=f(t,je),i=E,a=O,o=A,s=Date.now(),c=t||b(n),l={text:i,images:ce(a),timestamp:s},u=e.deferWhenBusy&&z&&L.current?.target_id===z&&(J===`error`||J===`terminated`);if(e.deferWhenBusy&&z&&(J===`running`||J===`sleeping`||u)){I(re({content:c,historyEntry:l,historyScope:`assistant`,parts:n,targetId:z,targetState:J,timestamp:s})),j(null),D(``),k([]),d(a);return}if(J===`terminated`){r.error(`Resolve the current chat before sending`);return}j(null),D(``),k([]),await Y({content:c,parts:n,history:l,pendingMessageTimestamp:s,restoreDraft:{input:i,images:a,historyCursor:o}})},Fe=(0,S.useCallback)(async e=>{if(j(null),!V){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);k(e=>[...e,...n]),await Promise.all(n.map(async(e,n)=>{let i=t[n];if(i)try{let t=await l(i);k(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),k(t=>t.filter(t=>t.id!==e.id)),r.error(t instanceof Error?t.message:`Failed to upload image`)}}))},[V]),Ie=(0,S.useCallback)(e=>{j(null),k(t=>{let n=t.find(t=>t.id===e);return n&&m(n),t.filter(t=>t.id!==e)})},[]),Le=(0,S.useCallback)((e,t)=>{if(G.length===0)return!1;let n=t.start,r=t.end,i=E.length===0&&O.length===0,a=typeof n==`number`&&typeof r==`number`&&n===r&&(n===0||n===E.length);if(!i&&!(K!==null&&q&&a))return!1;if(A===null){if(e!==-1)return!1;let t=G.length-1;return X(G[t]??null,t),!0}if(e===-1){let e=Math.max(A-1,0);return X(G[e]??null,e),!0}if(A>=G.length-1)return X(null,null),!0;let o=A+1;return X(G[o]??null,o),!0},[K,O,A,E,G,q,X]),Re=async()=>{if(!(!z||Se)){Ce(!0);try{await de(z),P([]),I(null),s(z),C(await g(z)),T(Date.now()),c(z)}catch(e){r.error(e instanceof Error?e.message:`Failed to clear assistant chat`)}finally{Ce(!1)}}},ze=(0,S.useCallback)(async()=>{if(z&&!(B?.state!==`running`&&B?.state!==`sleeping`)){await he(z);for(let e=0;e<25;e+=1){let e=await g(z);if(!e)break;if(C(e),T(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`)}},[z,B?.state]),Be=async e=>{if(!(!z||!e||we)){Te(e);try{try{await ze(),await _e(e)}catch(e){r.error(e instanceof Error?e.message:`Failed to retry Assistant message`);return}s(z);try{let e=await g(z);e&&(C(e),T(Date.now()),c(z))}catch{return}}finally{Te(null)}}},Ve=(0,S.useCallback)(async()=>{if(!z)return;await he(z),P([]),s(z);let e=await g(z);e&&(C(e),T(Date.now()),c(z))},[z,s,c]);return{addImages:Fe,connected:i,draftImages:O,handleKeyDown:e=>{if(e.key===`Tab`&&!e.shiftKey){(E.trim()||je.length>0)&&(e.preventDefault(),Pe({deferWhenBusy:!0}));return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Pe())},hasUploadingImages:Ae,input:E,isBrowsingInputHistory:q,navigateInputHistory:Le,onMessagesScroll:Ne,removeImage:Ie,retryMessage:Be,retryingMessageId:we,scrollRef:De,clearing:Se,sending:M,clearChat:Re,cancelPendingSend:(0,S.useCallback)(e=>{I(t=>t?.id===e?null:t)},[]),sendPendingSend:(0,S.useCallback)(async e=>{let t=L.current;!t||t.id!==e||!z||t.target_id!==z||M||R.current||J===`terminated`||(I(null),await Y({content:t.content,parts:t.parts??[],history:t.history_entry,pendingMessageTimestamp:t.timestamp})||I({...t,send_failed:!0,target_state:`error`}))},[z,J,M,Y]),sendMessage:Pe,setInput:Me,stopAssistant:Ve,supportsInputImage:V,timelineItems:Q,assistantActivity:$}}var E=n();function D({onOpenDetails:e}){let{agents:t}=y(),[n,a]=(0,S.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:de,sendPendingSend:_,setInput:fe,stopAssistant:b,supportsInputImage:pe=!1,timelineItems:me}=T({bottomInset:o}),he=Array.from(t.values()).find(e=>e.node_type===`assistant`)?.role_name??null;return(0,E.jsxs)(`div`,{className:v(`relative flex h-full flex-col overflow-hidden bg-surface-overlay text-foreground`),children:[(0,E.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-0`,style:{background:`var(--shell-surface-sweep)`}}),(0,E.jsx)(`div`,{"aria-hidden":`true`,className:`pointer-events-none absolute inset-x-0 top-0 h-px`,style:{background:`var(--shell-hairline)`}}),(0,E.jsx)(`div`,{"aria-hidden":`true`,className:v(`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,E.jsx)(O,{connected:ne,onClearChat:()=>void d(),onOpenDetails:e,roleName:he,clearing:te}),(0,E.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,E.jsx)(ae,{allowHumanMessageRetry:!0,bottomInset:o,items:me,nodes:t,onRetryHumanMessage:e=>void le(e),onCancelPendingSend:ee,onSendPendingSend:e=>void _(e),onScroll:ce,retryImageInputEnabled:pe,retryingMessageId:h,runningHint:u.runningHint,scrollRef:g}),(0,E.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,E.jsx)(`div`,{className:`mx-auto w-full max-w-3xl`,children:(0,E.jsx)(c,{busy:u.running,disabled:!f.trim()&&re.length===0||oe||ue,commandsEnabled:!0,images:re,imageInputEnabled:pe,input:f,onAddImages:e=>void l(e),onChange:fe,onNavigateHistory:se,onKeyDown:ie,onRemoveImage:m,onSend:()=>void de(),onStop:()=>{a(!0),b().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 O({clearing:e,connected:t,onClearChat:n,onOpenDetails:r,roleName:i}){return(0,E.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,E.jsxs)(`div`,{className:`flex min-w-[220px] flex-1 items-center gap-2`,children:[(0,E.jsx)(`div`,{className:`shrink-0 text-[14px] font-semibold leading-6 text-foreground`,children:`Assistant`}),i?(0,E.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,E.jsx)(k,{connected:t})]}),(0,E.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,E.jsx)(x,{type:`button`,size:`sm`,variant:`outline`,disabled:e,onClick:n,children:e?`Clearing...`:`Clear Chat`}),(0,E.jsx)(x,{type:`button`,size:`sm`,variant:`outline`,disabled:!r,onClick:r,children:`Assistant Details`})]})]})}function k({connected:e}){return(0,E.jsx)(`span`,{className:v(`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 A(){let{agents:e}=y(),t=C(e),[n,r]=(0,S.useState)(!1);return(0,E.jsx)(`div`,{className:`flex h-full flex-col min-h-0`,children:n&&t?(0,E.jsx)(`div`,{className:`h-full overflow-hidden p-6`,children:(0,E.jsx)(`div`,{className:`h-full overflow-hidden rounded-xl border border-border bg-surface-overlay/90 shadow-md`,children:(0,E.jsx)(p,{agent:t,onClose:()=>r(!1)})})}):(0,E.jsx)(D,{onOpenDetails:t?()=>r(!0):void 0})})}export{A as AssistantPage};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{en as r,et as i,q as a,ut as o}from"./ui-vendor-C5pJa8N7.js";import{Y as s,r as c,rt as l,ut as u}from"./index-C9HuekJm.js";import{a as d,o as f}from"./surface-pWwG5ogx.js";import{c as p,n as m,r as h,s as g}from"./PageScaffold-f6g2l7XN.js";async function _(){return s(`/api/settings/telegram`,{errorMessage:`Failed to fetch Telegram settings`})}async function v(e){return s(`/api/settings/telegram`,{method:`PATCH`,body:e,errorMessage:`Failed to save Telegram settings`})}async function y(e){return s(`/api/settings/telegram/approve/${e}`,{method:`POST`,errorMessage:`Failed to approve Telegram chat`})}async function b(e){return s(`/api/settings/telegram/pending/${e}`,{method:`DELETE`,errorMessage:`Failed to remove pending Telegram chat`})}async function x(e){return s(`/api/settings/telegram/chat/${e}`,{method:`DELETE`,errorMessage:`Failed to remove Telegram chat`})}var S=e(t(),1);function C(e,t=`auto`){return typeof e!=`number`||!Number.isFinite(e)?null:t===`milliseconds`?e:t===`seconds`?e*1e3:e>0xe8d4a51000?e:e*1e3}function w(e,t={}){let{fallback:n=`Unknown`,format:r,unit:i=`auto`}=t,a=C(e,i);if(a===null)return n;let o=new Date(a);return r?new Intl.DateTimeFormat(void 0,r).format(o):o.toLocaleString()}var T=n();function E(e){return e?w(e,{fallback:`—`,unit:`seconds`}):`—`}function D(e){return e.display_name.trim()?e.display_name.trim():e.username?.trim()?`@${e.username.trim()}`:`Unknown chat`}function O(){let{data:e,isLoading:t,mutate:n}=p(`telegramSettings`,_),[s,C]=(0,S.useState)(!1),[w,O]=(0,S.useState)(``),[k,A]=(0,S.useState)(!1),j=(0,S.useMemo)(()=>!!e?.bot_token,[e?.bot_token]),M=async()=>{if(e){C(!0);try{let e={};k&&(e.bot_token=w.trim()),n((await v(e)).telegram,!1),O(``),A(!1),a.success(`Telegram settings saved`)}catch{a.error(`Failed to save Telegram settings`)}finally{C(!1)}}},N=async e=>{try{n((await y(e)).telegram,!1),a.success(`Telegram chat approved`)}catch{a.error(`Failed to approve Telegram chat`)}},P=async e=>{try{n((await b(e)).telegram,!1),a.success(`Pending Telegram chat removed`)}catch{a.error(`Failed to remove pending Telegram chat`)}},F=async e=>{try{n((await x(e)).telegram,!1),a.success(`Approved Telegram chat removed`)}catch{a.error(`Failed to remove approved Telegram chat`)}};return t||!e?(0,T.jsx)(c,{label:`Loading channels...`,textClassName:`text-[13px]`}):(0,T.jsx)(m,{children:(0,T.jsx)(`div`,{className:`h-full min-h-0 overflow-y-auto pr-2 scrollbar-none pt-6`,children:(0,T.jsxs)(`div`,{className:`mx-auto max-w-[680px] pb-10`,children:[(0,T.jsx)(h,{title:`Channels`}),(0,T.jsxs)(g,{className:`mt-6 space-y-8`,children:[(0,T.jsxs)(`div`,{className:`flex items-start justify-between gap-4`,children:[(0,T.jsx)(`div`,{children:(0,T.jsx)(`h2`,{className:`text-lg font-medium text-foreground`,children:`Telegram`})}),(0,T.jsx)(f,{tone:j?`running`:`idle`,children:j?`Configured`:`Not configured`})]}),(0,T.jsxs)(`section`,{children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Bot Token`}),(0,T.jsx)(f,{tone:j?`running`:`idle`,children:j?`Saved`:`Missing`})]}),(0,T.jsxs)(`div`,{className:`mt-3`,children:[(0,T.jsx)(l,{value:w,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,T.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Leave empty to keep the current token.`}):null]})]}),(0,T.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Pending Private Chats`}),(0,T.jsxs)(f,{tone:`muted`,className:`px-2 py-0.5`,children:[e.pending_chats.length,` waiting`]})]}),e.pending_chats.length===0?(0,T.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No pending chats.`}):(0,T.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.pending_chats.map(e=>(0,T.jsx)(d,{as:`div`,padding:`sm`,className:`px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:D(e)}),(0,T.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,T.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,T.jsxs)(`span`,{children:[`First seen: `,E(e.first_seen_at)]})]})]}),(0,T.jsxs)(`div`,{className:`flex shrink-0 items-center gap-1.5`,children:[(0,T.jsxs)(u,{type:`button`,variant:`outline`,size:`xs`,onClick:()=>void N(e.chat_id),children:[(0,T.jsx)(r,{className:`size-3.5`}),`Approve`]}),(0,T.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,T.jsx)(i,{className:`size-3.5`})})]})]})},e.chat_id))})]}),(0,T.jsxs)(`section`,{className:`border-t border-border pt-8`,children:[(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,T.jsx)(`label`,{className:`text-[13px] font-medium text-foreground/80`,children:`Approved Private Chats`}),(0,T.jsxs)(f,{tone:`muted`,className:`px-2 py-0.5`,children:[e.approved_chats.length,` active`]})]}),e.approved_chats.length===0?(0,T.jsx)(`p`,{className:`mt-4 text-[13px] text-muted-foreground`,children:`No approved chats yet.`}):(0,T.jsx)(`div`,{className:`mt-4 space-y-2`,children:e.approved_chats.map(e=>(0,T.jsx)(d,{as:`div`,padding:`sm`,className:`group px-4 py-3.5 transition-colors hover:bg-accent/20`,children:(0,T.jsxs)(`div`,{className:`flex items-center justify-between gap-4`,children:[(0,T.jsxs)(`div`,{className:`min-w-0`,children:[(0,T.jsx)(`p`,{className:`text-[13px] font-medium text-foreground`,children:D(e)}),(0,T.jsxs)(`div`,{className:`mt-1 flex items-center gap-3 text-[11px] text-muted-foreground`,children:[(0,T.jsxs)(`span`,{className:`font-mono`,children:[`ID: `,e.chat_id]}),e.username?(0,T.jsxs)(`span`,{children:[`@`,e.username]}):null,(0,T.jsxs)(`span`,{children:[`Approved: `,E(e.approved_at)]})]})]}),(0,T.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,T.jsx)(i,{className:`size-3.5`})})]})},e.chat_id))})]}),(0,T.jsx)(`div`,{className:`flex justify-end border-t border-border pt-6`,children:(0,T.jsxs)(u,{type:`button`,size:`sm`,onClick:()=>void M(),disabled:s,className:`text-[13px]`,children:[(0,T.jsx)(o,{className:`size-4`}),s?`Saving...`:`Save Changes`]})})]})]})})})}export{O as ChannelsPage};
|
|
@@ -1 +0,0 @@
|
|
|
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{Ft as i}from"./ui-vendor-C5pJa8N7.js";import{a,ft as o,i as s,o as c,s as l,ut as u}from"./index-C9HuekJm.js";import{a as d}from"./surface-pWwG5ogx.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:o(`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:o(`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:o(`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)(c,{delayDuration:150,children:(0,$.jsxs)(s,{children:[(0,$.jsx)(l,{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)(a,{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:o(r?`border-t border-border pt-8`:`mb-10`,t),children:[(0,$.jsx)(Ae,{title:i}),(0,$.jsx)(`div`,{className:o(`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:o(`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:o(`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};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{d as t,l as n}from"./graph-vendor-DRq_-6fV.js";import{Ft as r,q as i,ut as a}from"./ui-vendor-C5pJa8N7.js";import{Y as o,a as s,i as c,nt as l,o as u,r as d,s as f,ut as p}from"./index-C9HuekJm.js";import{a as m,o as h}from"./surface-pWwG5ogx.js";import{c as g,n as _,r as v}from"./PageScaffold-f6g2l7XN.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)(``),[u,f]=(0,x.useState)(!1);(0,x.useEffect)(()=>{e&&(o(e.custom_prompt),c(e.custom_post_prompt))},[e]);let w=async()=>{f(!0);try{n(await b({custom_prompt:r,custom_post_prompt:s}),!1),i.success(`Prompts saved`)}catch{i.error(`Failed to save prompts`)}finally{f(!1)}};return t?(0,S.jsx)(d,{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:u,size:`sm`,className:`text-[13px]`,children:[(0,S.jsx)(a,{className:`size-4`}),u?`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)(h,{tone:`neutral`,className:`px-2 py-0.5`,children:[r.length,` chars`]})]})}),(0,S.jsx)(m,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(l,{"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)(h,{tone:`neutral`,className:`px-2 py-0.5`,children:[s.length,` chars`]})]})}),(0,S.jsx)(m,{as:`div`,padding:`none`,className:`relative flex min-h-0 flex-1 p-1`,children:(0,S.jsx)(l,{"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)(u,{delayDuration:150,children:(0,S.jsxs)(c,{children:[(0,S.jsx)(f,{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)(s,{className:`max-w-xs`,children:t})]})});export{w as PromptsPage};
|