@hotmeshio/long-tail 0.1.4 → 0.1.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 +1 -1
- package/build/examples/seed.js +1 -1
- package/build/examples/workflows/basic-echo/activities.d.ts +2 -2
- package/build/examples/workflows/basic-echo/activities.js +7 -7
- package/build/examples/workflows/basic-echo/index.js +1 -1
- package/build/examples/workflows/kitchen-sink/index.js +2 -2
- package/build/index.d.ts +11 -10
- package/build/index.js +13 -12
- package/build/lib/db/index.d.ts +18 -0
- package/build/{services → lib}/db/index.js +9 -0
- package/build/{services → lib}/db/migrate.js +3 -3
- package/build/{services → lib}/telemetry/honeycomb.d.ts +2 -2
- package/build/{services → lib}/telemetry/honeycomb.js +2 -2
- package/build/modules/defaults.d.ts +2 -0
- package/build/modules/defaults.js +3 -1
- package/build/routes/controlplane.js +1 -1
- package/build/routes/dba.js +4 -0
- package/build/routes/docs.d.ts +2 -0
- package/build/routes/docs.js +87 -0
- package/build/routes/escalations/bulk.js +120 -202
- package/build/routes/escalations/resolve.js +1 -1
- package/build/routes/escalations/single.js +1 -1
- package/build/routes/files.js +1 -1
- package/build/routes/index.js +2 -0
- package/build/routes/insight.js +2 -1
- package/build/routes/mcp.js +3 -2
- package/build/routes/oauth.js +1 -1
- package/build/routes/settings.js +4 -4
- package/build/routes/workflows/discovery.js +3 -3
- package/build/routes/workflows/invocation.js +1 -1
- package/build/routes/yaml-workflows/crud.js +1 -1
- package/build/routes/yaml-workflows/deployment.js +25 -0
- package/build/services/auth/bot-api-key.js +1 -1
- package/build/services/auth/index.d.ts +4 -0
- package/build/services/auth/index.js +17 -0
- package/build/services/auth/service-token.js +1 -1
- package/build/services/config/provider.js +1 -1
- package/build/services/config/read.js +1 -1
- package/build/services/config/write.js +1 -1
- package/build/services/controlplane/index.js +3 -4
- package/build/services/controlplane/quorum-bridge.js +2 -2
- package/build/services/cron/index.js +4 -5
- package/build/services/dba.d.ts +4 -0
- package/build/services/dba.js +3 -6
- package/build/services/escalation/bulk.js +1 -1
- package/build/services/escalation/crud.js +1 -1
- package/build/services/escalation/queries.js +1 -1
- package/build/services/export/client.js +2 -5
- package/build/services/export/index.js +14 -2
- package/build/services/hotmesh-utils.js +1 -1
- package/build/services/iam/bots.js +6 -12
- package/build/services/iam/context.d.ts +1 -1
- package/build/services/iam/context.js +5 -5
- package/build/services/iam/credentials.js +1 -1
- package/build/services/iam/ephemeral.js +8 -15
- package/build/services/iam/principal.js +3 -10
- package/build/services/iam/resolve.js +1 -1
- package/build/services/iam/sql.d.ts +10 -0
- package/build/services/iam/sql.js +42 -0
- package/build/services/insight/index.d.ts +1 -0
- package/build/services/insight/index.js +4 -6
- package/build/services/interceptor/activities/escalation.js +1 -1
- package/build/services/interceptor/activities/task.js +9 -6
- package/build/services/interceptor/activities/workflow.js +4 -5
- package/build/services/interceptor/activity-interceptor.d.ts +1 -1
- package/build/services/interceptor/activity-interceptor.js +5 -5
- package/build/services/interceptor/completion.js +1 -1
- package/build/services/interceptor/escalation.js +1 -1
- package/build/services/interceptor/index.js +4 -4
- package/build/services/interceptor/lifecycle.js +1 -1
- package/build/services/maintenance/index.js +4 -5
- package/build/services/mcp/adapter.js +1 -16
- package/build/services/mcp/client/connection.d.ts +1 -1
- package/build/services/mcp/client/connection.js +2 -2
- package/build/services/mcp/client/tools.js +1 -1
- package/build/services/mcp/db-server/index.js +1 -1
- package/build/services/mcp/db-server/tools.js +17 -4
- package/build/services/mcp/db.js +1 -1
- package/build/services/mcp/playwright-server/index.js +1 -1
- package/build/services/mcp/playwright-server/lifecycle.js +1 -1
- package/build/services/mcp/playwright-server/schemas.d.ts +2 -2
- package/build/services/mcp/playwright-server/tools.js +1 -1
- package/build/services/mcp/server.js +1 -1
- package/build/services/mcp/sql.d.ts +6 -0
- package/build/services/mcp/sql.js +34 -1
- package/build/services/mcp/workflow-compiler-server.js +1 -1
- package/build/services/mcp/workflow-server.js +1 -1
- package/build/services/mcp-runs/execution-builder.js +8 -6
- package/build/services/mcp-runs/queries.js +2 -2
- package/build/services/mcp-runs/sql.d.ts +4 -1
- package/build/services/mcp-runs/sql.js +23 -2
- package/build/services/namespace/index.js +1 -1
- package/build/services/oauth/db.js +9 -37
- package/build/services/oauth/index.js +1 -1
- package/build/services/oauth/providers/registry.js +1 -1
- package/build/services/oauth/sql.d.ts +7 -0
- package/build/services/oauth/sql.js +32 -0
- package/build/services/orchestrator/index.js +3 -3
- package/build/services/role/index.js +1 -1
- package/build/services/task/crud.js +1 -1
- package/build/services/task/process.js +1 -1
- package/build/services/task/resolve.js +1 -1
- package/build/services/user/auth.js +1 -1
- package/build/services/user/crud.js +1 -1
- package/build/services/user/rbac.js +1 -1
- package/build/services/user/roles.js +1 -1
- package/build/services/user/sql.d.ts +2 -0
- package/build/services/user/sql.js +3 -1
- package/build/services/yaml-workflow/db-utils.js +1 -1
- package/build/services/yaml-workflow/db.js +1 -1
- package/build/services/yaml-workflow/deployer-helpers.js +1 -1
- package/build/services/yaml-workflow/deployer.js +4 -4
- package/build/services/yaml-workflow/generator.js +1 -1
- package/build/services/yaml-workflow/input-analyzer-helpers.d.ts +6 -0
- package/build/services/yaml-workflow/input-analyzer-helpers.js +36 -7
- package/build/services/yaml-workflow/input-analyzer.js +16 -3
- package/build/services/yaml-workflow/pipeline/analyze.js +1 -1
- package/build/services/yaml-workflow/pipeline/build/dag.js +10 -5
- package/build/services/yaml-workflow/pipeline/compile/llm-call.js +1 -1
- package/build/services/yaml-workflow/pipeline/extract.js +5 -3
- package/build/services/yaml-workflow/pipeline/index.d.ts +5 -0
- package/build/services/yaml-workflow/pipeline/index.js +22 -0
- package/build/services/yaml-workflow/pipeline/validate.js +2 -2
- package/build/services/yaml-workflow/workers/callbacks.js +1 -1
- package/build/services/yaml-workflow/workers/events.js +2 -2
- package/build/services/yaml-workflow/workers/register.js +8 -8
- package/build/start/adapters.js +7 -7
- package/build/start/index.js +4 -4
- package/build/start/server.js +1 -1
- package/build/start/workers.d.ts +1 -2
- package/build/start/workers.js +8 -7
- package/build/system/activities/claude-code.js +1 -1
- package/build/system/activities/file-storage.js +1 -1
- package/build/system/activities/knowledge.d.ts +58 -0
- package/build/system/activities/knowledge.js +128 -0
- package/build/system/activities/sql.d.ts +9 -0
- package/build/system/activities/sql.js +41 -0
- package/build/system/activities/triage/context.js +1 -1
- package/build/system/activities/triage/discovery.d.ts +2 -14
- package/build/system/activities/triage/discovery.js +5 -161
- package/build/system/activities/triage/llm.d.ts +1 -8
- package/build/system/activities/triage/llm.js +2 -28
- package/build/system/activities/triage/tools.d.ts +1 -17
- package/build/system/activities/triage/tools.js +8 -167
- package/build/system/index.js +5 -4
- package/build/system/mcp-servers/admin/escalations.d.ts +5 -0
- package/build/system/mcp-servers/admin/escalations.js +149 -0
- package/build/system/mcp-servers/admin/index.d.ts +31 -0
- package/build/system/mcp-servers/admin/index.js +80 -0
- package/build/system/mcp-servers/admin/maintenance.d.ts +5 -0
- package/build/system/mcp-servers/admin/maintenance.js +58 -0
- package/build/system/mcp-servers/admin/mcp-servers.d.ts +5 -0
- package/build/system/mcp-servers/admin/mcp-servers.js +146 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +411 -0
- package/build/system/mcp-servers/admin/schemas.js +177 -0
- package/build/system/mcp-servers/admin/tasks.d.ts +5 -0
- package/build/system/mcp-servers/admin/tasks.js +112 -0
- package/build/system/mcp-servers/admin/users.d.ts +5 -0
- package/build/system/mcp-servers/admin/users.js +167 -0
- package/build/system/mcp-servers/admin/workflow-config.d.ts +9 -0
- package/build/system/mcp-servers/admin/workflow-config.js +118 -0
- package/build/system/mcp-servers/admin/workflows.d.ts +6 -0
- package/build/system/mcp-servers/admin/workflows.js +138 -0
- package/build/system/mcp-servers/admin/yaml-workflows.d.ts +8 -0
- package/build/system/mcp-servers/admin/yaml-workflows.js +237 -0
- package/build/system/mcp-servers/claude-code.js +1 -1
- package/build/system/mcp-servers/db-query/index.js +1 -1
- package/build/system/mcp-servers/db-query/tools.js +17 -4
- package/build/system/mcp-servers/docs.d.ts +5 -0
- package/build/system/mcp-servers/docs.js +147 -0
- package/build/system/mcp-servers/file-storage.js +1 -1
- package/build/system/mcp-servers/http-fetch.js +1 -1
- package/build/system/mcp-servers/human-queue.js +1 -1
- package/build/system/mcp-servers/knowledge.d.ts +4 -0
- package/build/system/mcp-servers/knowledge.js +137 -0
- package/build/system/mcp-servers/oauth.js +1 -1
- package/build/system/mcp-servers/playwright/browser-lifecycle.js +1 -1
- package/build/system/mcp-servers/playwright/index.js +1 -1
- package/build/system/mcp-servers/playwright/schemas.d.ts +19 -8
- package/build/system/mcp-servers/playwright/schemas.js +3 -0
- package/build/system/mcp-servers/playwright/tools-navigation.js +22 -9
- package/build/system/mcp-servers/playwright/tools-run-script.js +20 -3
- package/build/system/mcp-servers/playwright/vision-helper.d.ts +12 -0
- package/build/system/mcp-servers/playwright/vision-helper.js +81 -0
- package/build/system/mcp-servers/playwright-cli/helpers.js +2 -2
- package/build/system/mcp-servers/playwright-cli/index.js +1 -1
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +28 -28
- package/build/system/mcp-servers/playwright-cli/schemas.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-auth.js +1 -1
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +4 -2
- package/build/system/mcp-servers/translation.d.ts +14 -0
- package/build/system/mcp-servers/translation.js +130 -0
- package/build/system/mcp-servers/vision-prompts.d.ts +2 -0
- package/build/system/mcp-servers/vision-prompts.js +9 -0
- package/build/system/mcp-servers/{document-vision.d.ts → vision.d.ts} +3 -4
- package/build/system/mcp-servers/vision.js +221 -0
- package/build/system/mcp-servers/workflow-compiler.js +1 -1
- package/build/system/mcp-servers/workflow.js +1 -1
- package/build/system/seed/index.js +13 -2
- package/build/system/seed/server-definitions.d.ts +1954 -322
- package/build/system/seed/server-definitions.js +65 -34
- package/build/system/seed/tool-manifests-admin.d.ts +1645 -0
- package/build/system/seed/tool-manifests-admin.js +45 -0
- package/build/system/seed/tool-manifests-browser.d.ts +1 -1
- package/build/system/seed/tool-manifests-browser.js +3 -3
- package/build/system/seed/tool-manifests-data.d.ts +62 -21
- package/build/system/seed/tool-manifests-data.js +55 -17
- package/build/system/seed/tool-manifests-knowledge.d.ts +171 -0
- package/build/system/seed/tool-manifests-knowledge.js +94 -0
- package/build/system/workflows/mcp-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-query/activities/discovery.d.ts +2 -20
- package/build/system/workflows/mcp-query/activities/discovery.js +5 -163
- package/build/system/workflows/mcp-query/activities/llm.d.ts +1 -7
- package/build/system/workflows/mcp-query/activities/llm.js +2 -27
- package/build/system/workflows/mcp-query/activities/tool-executor.d.ts +0 -4
- package/build/system/workflows/mcp-query/activities/tool-executor.js +2 -106
- package/build/system/workflows/mcp-query/activities/tool-loader.d.ts +0 -9
- package/build/system/workflows/mcp-query/activities/tool-loader.js +2 -87
- package/build/system/workflows/mcp-query/index.js +55 -5
- package/build/system/workflows/mcp-query/prompts.d.ts +1 -2
- package/build/system/workflows/mcp-query/prompts.js +5 -32
- package/build/system/workflows/mcp-query/strategy-advisors.d.ts +3 -14
- package/build/system/workflows/mcp-query/strategy-advisors.js +4 -107
- package/build/system/workflows/mcp-query/types.d.ts +2 -10
- package/build/system/workflows/mcp-query/types.js +0 -1
- package/build/system/workflows/mcp-query-router/index.js +1 -1
- package/build/system/workflows/mcp-triage/index.d.ts +2 -2
- package/build/system/workflows/mcp-triage/index.js +39 -7
- package/build/system/workflows/mcp-triage/prompts.js +7 -14
- package/build/system/workflows/mcp-triage-deterministic/index.js +1 -1
- package/build/system/workflows/mcp-triage-router/index.js +1 -1
- package/build/system/workflows/shared/discovery.d.ts +35 -0
- package/build/system/workflows/shared/discovery.js +175 -0
- package/build/system/workflows/shared/index.d.ts +7 -0
- package/build/system/workflows/shared/index.js +18 -0
- package/build/system/workflows/shared/llm-caller.d.ts +8 -0
- package/build/system/workflows/shared/llm-caller.js +31 -0
- package/build/system/workflows/shared/prompts.d.ts +2 -0
- package/build/system/workflows/shared/prompts.js +32 -0
- package/build/system/workflows/shared/strategy-advisors.d.ts +14 -0
- package/build/system/workflows/shared/strategy-advisors.js +109 -0
- package/build/system/workflows/shared/tool-executor.d.ts +11 -0
- package/build/system/workflows/shared/tool-executor.js +111 -0
- package/build/system/workflows/shared/tool-loader.d.ts +19 -0
- package/build/system/workflows/shared/tool-loader.js +94 -0
- package/build/system/workflows/shared/types.d.ts +9 -0
- package/build/system/workflows/shared/types.js +2 -0
- package/build/system/workflows/tool-result-guard.d.ts +14 -0
- package/build/system/workflows/tool-result-guard.js +78 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/user.d.ts +2 -0
- package/build/vitest.config.d.ts +1 -1
- package/build/vitest.integration.config.d.ts +1 -1
- package/build/workers/index.js +2 -8
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js +2 -0
- package/dashboard/dist/assets/AdminDashboard-CTyAMUJR.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-BMXV3Q4l.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-C51nKFEu.js +2 -0
- package/dashboard/dist/assets/{BotPicker-D6FYW1Gt.js.map → BotPicker-C51nKFEu.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-BSyfd8uL.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-Cxk4wvjT.js.map → CollapsibleSection-BSyfd8uL.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-CBdhia5T.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-FSXyKjaB.js.map → ConfirmDeleteModal-CBdhia5T.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-dGlewBCS.js +2 -0
- package/dashboard/dist/assets/{CopyableId-CBdxWfp8.js.map → CopyableId-dGlewBCS.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-CoBNFSAu.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-BataWFj8.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-CAninCbl.js.map → CustomDurationPicker-BataWFj8.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js +2 -0
- package/dashboard/dist/assets/DataTable-B3uf5CCo.js.map +1 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js +2 -0
- package/dashboard/dist/assets/ElapsedCell-G5oSwTpT.js.map +1 -0
- package/dashboard/dist/assets/EmptyState-BChBJNGS.js +2 -0
- package/dashboard/dist/assets/{EmptyState-2CmV-IaS.js.map → EmptyState-BChBJNGS.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-CxUv8xjG.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-GXYFPASS.js.map → EscalationsOverview-CxUv8xjG.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-CVt8B0BZ.js +2 -0
- package/dashboard/dist/assets/{EventTable-B01oJf6Y.js.map → EventTable-CVt8B0BZ.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-CShf0oe7.js +2 -0
- package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CShf0oe7.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-CbaZRnJl.js +2 -0
- package/dashboard/dist/assets/{McpOverview-JkvRcX2e.js.map → McpOverview-CbaZRnJl.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-CGoR9XK6.js.map +1 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js +2 -0
- package/dashboard/dist/assets/McpQueryPage-BjXoYQuU.js.map +1 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DLkA5Aar.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-DCh9n11D.js.map +1 -0
- package/dashboard/dist/assets/Modal-CI5RBPOQ.js +2 -0
- package/dashboard/dist/assets/{Modal-B4rbIVAn.js.map → Modal-CI5RBPOQ.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Dc80suXd.js.map +1 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js +2 -0
- package/dashboard/dist/assets/PageHeader-SMD9qtOO.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-TikLQsTp.js.map +1 -0
- package/dashboard/dist/assets/PriorityBadge-CQ0EsLTA.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-CQ0EsLTA.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-B2GKuGzk.js.map +1 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js +2 -0
- package/dashboard/dist/assets/ProcessesListPage-CTjI3Wn6.js.map +1 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js +2 -0
- package/dashboard/dist/assets/RefreshButton-BcQDObrv.js.map +1 -0
- package/dashboard/dist/assets/RolePill-Crj4TH5p.js +2 -0
- package/dashboard/dist/assets/{RolePill-BTPa8L-P.js.map → RolePill-Crj4TH5p.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js +2 -0
- package/dashboard/dist/assets/RolesPage-C_RInUwS.js.map +1 -0
- package/dashboard/dist/assets/RowActions-Cp5HyK_w.js +2 -0
- package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-Cp5HyK_w.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-BhyWtofX.js.map +1 -0
- package/dashboard/dist/assets/StatCard-BKZLSgNV.js +2 -0
- package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-BKZLSgNV.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BYNGGZK5.js.map +1 -0
- package/dashboard/dist/assets/StickyPagination-CTosgiU2.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CTosgiU2.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-ylG5Ps1s.js.map +1 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-C9pDGdD2.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-BtJbZTT0.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill-awmtb0qw.js.map → TaskQueuePill-BtJbZTT0.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-DtFLUEhg.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-C_QF23c1.js.map → TasksListPage-DtFLUEhg.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js +2 -0
- package/dashboard/dist/assets/TimeAgo-WuM6xImZ.js.map +1 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js +2 -0
- package/dashboard/dist/assets/TimestampCell-IVL_-Upy.js.map +1 -0
- package/dashboard/dist/assets/UserName-DU9qeg13.js +2 -0
- package/dashboard/dist/assets/{UserName-DaP4YAKr.js.map → UserName-DU9qeg13.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-DOocX81f.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-Diw8iWBP.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DDtUIrTy.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-CPuvA4t3.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-D9OzzQqw.js.map → WorkflowsOverview-CPuvA4t3.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-DlwwkluN.js.map +1 -0
- package/dashboard/dist/assets/{bots-BkKVMbUW.js → bots-BPiZXf2h.js} +2 -2
- package/dashboard/dist/assets/{bots-BkKVMbUW.js.map → bots-BPiZXf2h.js.map} +1 -1
- package/dashboard/dist/assets/constants-BHkpVaqx.js +2 -0
- package/dashboard/dist/assets/constants-BHkpVaqx.js.map +1 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js +2 -0
- package/dashboard/dist/assets/escalation-DTY_OKRh.js.map +1 -0
- package/dashboard/dist/assets/escalation-columns-C91fHSkp.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-D6aqStaY.js.map → escalation-columns-C91fHSkp.js.map} +1 -1
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js +2 -0
- package/dashboard/dist/assets/helpers-DBUZ9pnG.js.map +1 -0
- package/dashboard/dist/assets/index-BOeA-gfK.js +17 -0
- package/dashboard/dist/assets/{index-X85K5bHC.js.map → index-BOeA-gfK.js.map} +1 -1
- package/dashboard/dist/assets/index-BZ6K_kmL.js +3 -0
- package/dashboard/dist/assets/index-BZ6K_kmL.js.map +1 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js +2 -0
- package/dashboard/dist/assets/index-Bpm0yeoi.js.map +1 -0
- package/dashboard/dist/assets/index-BtOwLI0K.js +2 -0
- package/dashboard/dist/assets/{index-DTPzZr_X.js.map → index-BtOwLI0K.js.map} +1 -1
- package/dashboard/dist/assets/index-CBF3ZvRZ.js +6 -0
- package/dashboard/dist/assets/index-CBF3ZvRZ.js.map +1 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js +2 -0
- package/dashboard/dist/assets/index-CDWOfCmi.js.map +1 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js +2 -0
- package/dashboard/dist/assets/index-Ce6sL__n.js.map +1 -0
- package/dashboard/dist/assets/index-DSzSoku1.js +283 -0
- package/dashboard/dist/assets/index-DSzSoku1.js.map +1 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js +2 -0
- package/dashboard/dist/assets/index-D_qEAYrg.js.map +1 -0
- package/dashboard/dist/assets/index-gCy9XX3W.css +1 -0
- package/dashboard/dist/assets/mcp-BzVpaaKF.js +2 -0
- package/dashboard/dist/assets/{mcp-blCW6IL7.js.map → mcp-BzVpaaKF.js.map} +1 -1
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js +2 -0
- package/dashboard/dist/assets/mcp-query-wTuxTTCV.js.map +1 -0
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js → mcp-runs-DmXYJD19.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-ChPbpvXK.js.map → mcp-runs-DmXYJD19.js.map} +1 -1
- package/dashboard/dist/assets/namespaces-DoGa7jc7.js +2 -0
- package/dashboard/dist/assets/{namespaces-BgbaC3ow.js.map → namespaces-DoGa7jc7.js.map} +1 -1
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js → roles-wCdQ2Z7k.js} +2 -2
- package/dashboard/dist/assets/{roles-ZNrqqnQl.js.map → roles-wCdQ2Z7k.js.map} +1 -1
- package/dashboard/dist/assets/settings-DDe_L7JT.js +2 -0
- package/dashboard/dist/assets/{settings-eBRSE0mQ.js.map → settings-DDe_L7JT.js.map} +1 -1
- package/dashboard/dist/assets/tasks-3Hih8Bt7.js +2 -0
- package/dashboard/dist/assets/{tasks-tRqClPns.js.map → tasks-3Hih8Bt7.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js → useFilterParams-BUyLHcx_.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-BaXUAkYK.js.map → useFilterParams-BUyLHcx_.js.map} +1 -1
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js → useNatsEvents-DeGKHFTX.js} +2 -2
- package/dashboard/dist/assets/{useNatsEvents-Xr43X1fG.js.map → useNatsEvents-DeGKHFTX.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js → useYamlActivityEvents-B5dHec6Y.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-BO51u8tm.js.map → useYamlActivityEvents-B5dHec6Y.js.map} +1 -1
- package/dashboard/dist/assets/{users-tMvNyOo8.js → users-BTagPmGW.js} +2 -2
- package/dashboard/dist/assets/{users-tMvNyOo8.js.map → users-BTagPmGW.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-ZTAKVwGc.js → vendor-icons-DCLlGYO9.js} +112 -57
- package/dashboard/dist/assets/vendor-icons-DCLlGYO9.js.map +1 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
- package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js → workflows-B20dR3NE.js} +2 -2
- package/dashboard/dist/assets/{workflows-Cc4VHcrp.js.map → workflows-B20dR3NE.js.map} +1 -1
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js +2 -0
- package/dashboard/dist/assets/yaml-workflows-CaLPMQha.js.map +1 -0
- package/dashboard/dist/index.html +5 -5
- package/docs/api/dba.md +81 -0
- package/docs/api/escalations.md +575 -0
- package/docs/api/exports.md +170 -0
- package/docs/api/maintenance.md +93 -0
- package/docs/api/mcp-runs.md +128 -0
- package/docs/api/mcp-servers.md +195 -0
- package/docs/api/namespaces.md +48 -0
- package/docs/api/roles.md +390 -0
- package/docs/api/service-accounts.md +188 -0
- package/docs/api/settings.md +33 -0
- package/docs/api/tasks.md +167 -0
- package/docs/api/users.md +180 -0
- package/docs/api/workflows.md +616 -0
- package/docs/api/yaml-workflows.md +312 -0
- package/docs/architecture.md +221 -0
- package/docs/auth.md +181 -0
- package/docs/cloud.md +272 -0
- package/docs/compilation.md +136 -0
- package/docs/contributing.md +56 -0
- package/docs/dashboard.md +145 -0
- package/docs/data.md +478 -0
- package/docs/escalation-strategies.md +264 -0
- package/docs/events.md +251 -0
- package/docs/iam.md +222 -0
- package/docs/img/01-login.png +0 -0
- package/docs/img/02-dashboard-home.png +0 -0
- package/docs/img/03-processes-list.png +0 -0
- package/docs/img/04-escalations-list.png +0 -0
- package/docs/img/05-mcp-servers.png +0 -0
- package/docs/img/06-mcp-pipelines.png +0 -0
- package/docs/img/07-workflows-list.png +0 -0
- package/docs/img/compilation/01-query-submit.png +0 -0
- package/docs/img/compilation/02-mcp-servers.png +0 -0
- package/docs/img/compilation/03-query-completed.png +0 -0
- package/docs/img/compilation/04-wizard-original.png +0 -0
- package/docs/img/compilation/05-wizard-timeline.png +0 -0
- package/docs/img/compilation/06-wizard-profile.png +0 -0
- package/docs/img/compilation/07-wizard-deploy.png +0 -0
- package/docs/img/compilation/08-wizard-test-modal.png +0 -0
- package/docs/img/compilation/09-wizard-test-compare.png +0 -0
- package/docs/img/compilation/10-wizard-verify.png +0 -0
- package/docs/logging.md +110 -0
- package/docs/maintenance.md +221 -0
- package/docs/mcp.md +715 -0
- package/docs/oauth-and-delegation.md +469 -0
- package/docs/telemetry.md +144 -0
- package/docs/workflows.md +695 -0
- package/lib/db/schemas/015_knowledge.sql +23 -0
- package/package.json +8 -9
- package/build/services/db/index.d.ts +0 -3
- package/build/services/mcp/vision-server.d.ts +0 -15
- package/build/services/mcp/vision-server.js +0 -214
- package/build/system/mcp-servers/document-vision.js +0 -228
- package/build/system/mcp-servers/prompts.d.ts +0 -4
- package/build/system/mcp-servers/prompts.js +0 -10
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js +0 -2
- package/dashboard/dist/assets/AdminDashboard-jfacvOC7.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-BglLDoT8.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-D6FYW1Gt.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-Cxk4wvjT.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-FSXyKjaB.js +0 -2
- package/dashboard/dist/assets/CopyableId-CBdxWfp8.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-Ikzsot0w.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-CAninCbl.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js +0 -2
- package/dashboard/dist/assets/DataTable-BDn1WBHS.js.map +0 -1
- package/dashboard/dist/assets/EmptyState-2CmV-IaS.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-GXYFPASS.js +0 -2
- package/dashboard/dist/assets/EventTable-B01oJf6Y.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js +0 -2
- package/dashboard/dist/assets/Field-DuFBAYhu.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
- package/dashboard/dist/assets/McpOverview-JkvRcX2e.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-CUMqhQdS.js.map +0 -1
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js +0 -2
- package/dashboard/dist/assets/McpQueryPage-DRRhw4nN.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CmPs5EvE.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-Dl5Y2u6k.js.map +0 -1
- package/dashboard/dist/assets/Modal-B4rbIVAn.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-B56il28q.js.map +0 -1
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js +0 -2
- package/dashboard/dist/assets/PageHeader-CpWFly5S.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-CMLq4M7D.js.map +0 -1
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-CZ_HF06v.js.map +0 -1
- package/dashboard/dist/assets/RolePill-BTPa8L-P.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js +0 -2
- package/dashboard/dist/assets/RolesPage-9grZW7yR.js.map +0 -1
- package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js +0 -4
- package/dashboard/dist/assets/SimpleMarkdown-CBlvaWP4.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js +0 -2
- package/dashboard/dist/assets/StatusBadge-TlC4jiig.js.map +0 -1
- package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-7SiwATsZ.js.map +0 -1
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-CbPVTakt.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-awmtb0qw.js +0 -2
- package/dashboard/dist/assets/TasksListPage-C_QF23c1.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js +0 -2
- package/dashboard/dist/assets/TimeAgo-UPG6DoH8.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js +0 -2
- package/dashboard/dist/assets/TimestampCell-DoWMKg6w.js.map +0 -1
- package/dashboard/dist/assets/UserName-DaP4YAKr.js +0 -2
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js +0 -5
- package/dashboard/dist/assets/VersionHistory-Bt7WBr6m.js.map +0 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DjtAQ3hy.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CCDSVaQj.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-D8z9uBNB.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-D9OzzQqw.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js +0 -3
- package/dashboard/dist/assets/YamlWorkflowDetailPage-DrDvvP62.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-COqiNCQK.js.map +0 -1
- package/dashboard/dist/assets/constants-CgaZfe5d.js +0 -2
- package/dashboard/dist/assets/constants-CgaZfe5d.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-D6aqStaY.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js +0 -2
- package/dashboard/dist/assets/escalation-qalymbKB.js.map +0 -1
- package/dashboard/dist/assets/format-gXZXQ-HJ.js +0 -2
- package/dashboard/dist/assets/format-gXZXQ-HJ.js.map +0 -1
- package/dashboard/dist/assets/helpers-0gSleuzT.js +0 -2
- package/dashboard/dist/assets/helpers-0gSleuzT.js.map +0 -1
- package/dashboard/dist/assets/index-BWvMHed7.js +0 -6
- package/dashboard/dist/assets/index-BWvMHed7.js.map +0 -1
- package/dashboard/dist/assets/index-BaszoPO_.css +0 -1
- package/dashboard/dist/assets/index-Cn2jyj9A.js +0 -2
- package/dashboard/dist/assets/index-Cn2jyj9A.js.map +0 -1
- package/dashboard/dist/assets/index-D8VH6K8B.js +0 -54
- package/dashboard/dist/assets/index-D8VH6K8B.js.map +0 -1
- package/dashboard/dist/assets/index-D9SYwJsi.js +0 -3
- package/dashboard/dist/assets/index-D9SYwJsi.js.map +0 -1
- package/dashboard/dist/assets/index-DTPzZr_X.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js +0 -2
- package/dashboard/dist/assets/index-D_6AB5BE.js.map +0 -1
- package/dashboard/dist/assets/index-S9Ks2Lj2.js +0 -2
- package/dashboard/dist/assets/index-S9Ks2Lj2.js.map +0 -1
- package/dashboard/dist/assets/index-X85K5bHC.js +0 -17
- package/dashboard/dist/assets/index-rjmgHlSH.js +0 -2
- package/dashboard/dist/assets/index-rjmgHlSH.js.map +0 -1
- package/dashboard/dist/assets/mcp-blCW6IL7.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js +0 -2
- package/dashboard/dist/assets/mcp-query-DoAyPbjC.js.map +0 -1
- package/dashboard/dist/assets/namespaces-BgbaC3ow.js +0 -2
- package/dashboard/dist/assets/settings-eBRSE0mQ.js +0 -2
- package/dashboard/dist/assets/tasks-tRqClPns.js +0 -2
- package/dashboard/dist/assets/vendor-icons-ZTAKVwGc.js.map +0 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js +0 -22
- package/dashboard/dist/assets/vendor-react-Cw8Gy8NJ.js.map +0 -1
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js +0 -2
- package/dashboard/dist/assets/yaml-workflows-BL4V5CQy.js.map +0 -1
- /package/build/{services → lib}/db/migrate.d.ts +0 -0
- /package/build/{services → lib}/events/index.d.ts +0 -0
- /package/build/{services → lib}/events/index.js +0 -0
- /package/build/{services → lib}/events/memory.d.ts +0 -0
- /package/build/{services → lib}/events/memory.js +0 -0
- /package/build/{services → lib}/events/nats.d.ts +0 -0
- /package/build/{services → lib}/events/nats.js +0 -0
- /package/build/{services → lib}/events/publish.d.ts +0 -0
- /package/build/{services → lib}/events/publish.js +0 -0
- /package/build/{services → lib}/events/socketio.d.ts +0 -0
- /package/build/{services → lib}/events/socketio.js +0 -0
- /package/build/{services → lib}/logger/index.d.ts +0 -0
- /package/build/{services → lib}/logger/index.js +0 -0
- /package/build/{services → lib}/logger/pino.d.ts +0 -0
- /package/build/{services → lib}/logger/pino.js +0 -0
- /package/build/{services → lib}/storage/index.d.ts +0 -0
- /package/build/{services → lib}/storage/index.js +0 -0
- /package/build/{services → lib}/storage/local.d.ts +0 -0
- /package/build/{services → lib}/storage/local.js +0 -0
- /package/build/{services → lib}/storage/s3.d.ts +0 -0
- /package/build/{services → lib}/storage/s3.js +0 -0
- /package/build/{services → lib}/storage/types.d.ts +0 -0
- /package/build/{services → lib}/storage/types.js +0 -0
- /package/build/{services → lib}/telemetry/index.d.ts +0 -0
- /package/build/{services → lib}/telemetry/index.js +0 -0
- /package/{services → lib}/db/README.md +0 -0
- /package/{services → lib}/db/schemas/001_schema.sql +0 -0
- /package/{services → lib}/db/schemas/002_seed.sql +0 -0
- /package/{services → lib}/db/schemas/003_workflow_discovery.sql +0 -0
- /package/{services → lib}/db/schemas/004_query_router.sql +0 -0
- /package/{services → lib}/db/schemas/005_triage_router.sql +0 -0
- /package/{services → lib}/db/schemas/006_oauth.sql +0 -0
- /package/{services → lib}/db/schemas/007_security.sql +0 -0
- /package/{services → lib}/db/schemas/008_bot_accounts.sql +0 -0
- /package/{services → lib}/db/schemas/009_audit_trail.sql +0 -0
- /package/{services → lib}/db/schemas/010_credential_providers.sql +0 -0
- /package/{services → lib}/db/schemas/011_system_workflow_configs.sql +0 -0
- /package/{services → lib}/db/schemas/012_drop_modality.sql +0 -0
- /package/{services → lib}/db/schemas/013_execute_as.sql +0 -0
- /package/{services → lib}/db/schemas/014_ephemeral_credentials.sql +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-S9Ks2Lj2.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Bot\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBots,\n useDeleteBot,\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\n// ── Detail Panel (right sidebar) ─────────────────────────────────\n\nfunction BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a bot to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n\n// ── API Keys Section ─────────────────────────────────────────────\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: ['mcp:tool:call'] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\n// ── Roles Section ────────────────────────────────────────────────\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\n// ── Bots Page ────────────────────────────────────────────────────\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Bot',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit bot\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete bot\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Bot\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6\">\n <div>\n <DataTable\n columns={columns}\n data={bots}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No bots yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <BotDetailPanel bot={activeBot} />\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Bot\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2, User, Bot } from 'lucide-react';\nimport { useUsers, useDeleteUser, useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport { useRoles } from '../../../api/roles';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\n// ── Role Panel (right sidebar) ─────────────────────────────────\n\nfunction RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n addRole.mutate(\n { userId: user.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ── Tab toggle ─────────────────────────────────────────────────\n\ntype AccountTab = 'users' | 'service-accounts';\n\nfunction AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n\n// ── Accounts Page (wrapper) ────────────────────────────────────\n\nexport function UsersPage() {\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = tabParam === 'service-accounts' ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n actions={<AccountTabToggle active={activeTab} onChange={handleTabChange} />}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\n// ── User Accounts Panel ────────────────────────────────────────\n\nfunction UserAccountsPanel() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n // Keep selected user in sync with refreshed data\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.email && (\n <p className=\"text-xs text-text-tertiary\">{row.email}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimeAgo date={row.created_at} />,\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6\">\n {/* Left — users table */}\n <div>\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <RolePanel user={activeUser} />\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsx","Modal","jsxs","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","statusDot","BotDetailPanel","ApiKeysSection","RolesSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","TimeAgo","Trash2","Plus","ConfirmDeleteModal","Fragment","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","isLoading","useBots","total","bots","activeBot","b","columns","row","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","DataTable","StickyPagination","statusOptions","RolePanel","useAddUserRole","useRemoveUserRole","AccountTabToggle","active","onChange","btn","tab","icon","label","User","Bot","UsersPage","searchParams","setSearchParams","useSearchParams","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","FilterBar","FilterSelect","v"],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{c as H,i as K,u as M,j as X,b as Z}from"./workflows-Cc4VHcrp.js";import{D as ee}from"./DataTable-BDn1WBHS.js";import{C as te}from"./ConfirmDeleteModal-FSXyKjaB.js";import{F as se,b as I}from"./FilterBar-Ck4K4rzu.js";import{R as re,a as T}from"./RowActions-Dg-Fsm5O.js";import{u as ae}from"./useFilterParams-BaXUAkYK.js";import{P as U}from"./PageHeader-CpWFly5S.js";import{R as ne}from"./RolePill-BTPa8L-P.js";import{T as oe}from"./TaskQueuePill-awmtb0qw.js";import{W as le}from"./WorkflowPill-CCDSVaQj.js";import{q as ie,x as ce,y as ue,U as L,X as B,C as Q,z,d as $}from"./vendor-icons-ZTAKVwGc.js";import{b as V,d as de,e as xe}from"./vendor-react-Cw8Gy8NJ.js";import{u as me}from"./roles-ZNrqqnQl.js";import{B as pe}from"./BotPicker-D6FYW1Gt.js";import"./index-D8VH6K8B.js";import"./EmptyState-2CmV-IaS.js";import"./Modal-B4rbIVAn.js";import"./bots-BkKVMbUW.js";function he(t,r){const o=r.toLowerCase();return t.workflow_type.toLowerCase().includes(o)||(t.description??"").toLowerCase().includes(o)}function Je(){const t=V(),{data:r,isLoading:o}=H(),d=K(),{filters:a,setFilter:l}=ae({filters:{search:"",queue:"",role:"",tier:""}}),[c,w]=x.useState(a.search),[p,y]=x.useState(null);x.useEffect(()=>{if(c===a.search)return;const s=setTimeout(()=>l("search",c),300);return()=>clearTimeout(s)},[c,l,a.search]);const i=r??[],m=x.useMemo(()=>[...new Set(i.map(s=>s.task_queue).filter(Boolean))].sort(),[i]),u=x.useMemo(()=>[...new Set(i.flatMap(s=>s.roles??[]))].sort(),[i]),n=x.useMemo(()=>{let s=i;return a.search&&(s=s.filter(h=>he(h,a.search))),a.queue&&(s=s.filter(h=>h.task_queue===a.queue)),a.role&&(s=s.filter(h=>(h.roles??[]).includes(a.role))),a.tier==="certified"&&(s=s.filter(h=>h.registered)),a.tier==="durable"&&(s=s.filter(h=>!h.registered)),s},[i,a]),N=[{key:"workflow_type",label:"Workflow",render:s=>e.jsxs("div",{className:"min-w-0",children:[e.jsx(le,{type:s.workflow_type}),s.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 truncate",children:s.description})]})},{key:"task_queue",label:"Queue",render:s=>s.task_queue?e.jsx(oe,{queue:s.task_queue}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"whitespace-nowrap"},{key:"registered",label:"Tier",render:s=>s.registered?e.jsxs("span",{className:"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-medium bg-accent/10 text-accent",children:[e.jsx(ie,{className:"w-3 h-3"}),"Certified"]}):e.jsx("span",{className:"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-surface-sunken text-text-tertiary",children:"Durable"}),className:"whitespace-nowrap"},{key:"roles",label:"Roles",render:s=>s.registered?e.jsxs("div",{className:"flex gap-1 flex-wrap",children:[(s.roles??[]).map(h=>e.jsx(ne,{role:h},h)),(!s.roles||s.roles.length===0)&&e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})},{key:"actions",label:"",render:s=>e.jsx(re,{children:s.registered?e.jsx(T,{icon:ce,title:"De-certify workflow",onClick:()=>y(s.workflow_type),colorClass:"text-text-tertiary hover:text-status-warning"}):e.jsx(T,{icon:ue,title:"Certify workflow",onClick:()=>t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`),colorClass:"text-text-tertiary hover:text-status-success"})}),className:"w-16 text-right"}],C=()=>{p&&d.mutate(p,{onSuccess:()=>y(null)})},_=s=>{s.registered?t(`/workflows/registry/${encodeURIComponent(s.workflow_type)}`):t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`)};return e.jsxs("div",{children:[e.jsx(U,{title:"Workflow Registry",actions:e.jsx("button",{onClick:()=>t("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"})}),e.jsxs(se,{children:[e.jsx("input",{type:"text",placeholder:"Search workflow type...",value:c,onChange:s=>w(s.target.value),className:"input text-[11px] py-1 px-2 w-56"}),e.jsx(I,{label:"Queue",value:a.queue,onChange:s=>l("queue",s),options:m.map(s=>({value:s,label:s}))}),e.jsx(I,{label:"Tier",value:a.tier,onChange:s=>l("tier",s),options:[{value:"certified",label:"Certified"},{value:"durable",label:"Durable"}]}),e.jsx(I,{label:"Role",value:a.role,onChange:s=>l("role",s),options:u.map(s=>({value:s,label:s}))})]}),e.jsx(ee,{columns:N,data:n,keyFn:s=>s.workflow_type,onRowClick:_,isLoading:o,emptyMessage:"No workflows found"}),e.jsx(te,{open:!!p,onClose:()=>y(null),onConfirm:C,title:"De-certify Workflow",description:e.jsxs(e.Fragment,{children:["Remove certification from ",e.jsx("span",{className:"font-mono font-medium text-text-primary",children:p}),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]}),isPending:d.isPending,error:d.error})]})}function fe({steps:t,currentStep:r,onStepClick:o}){return e.jsx("div",{className:"flex items-center justify-center gap-1 pb-4 border-b border-surface-border mb-4",children:t.map((d,a)=>{const l=a<r,c=a===r,w=!!o;return e.jsxs("div",{className:"flex items-center gap-1",children:[a>0&&e.jsx("div",{className:`w-4 h-px ${l?"bg-accent":"bg-surface-border"}`}),e.jsxs("button",{type:"button",onClick:w?()=>o(a):void 0,className:`flex items-center gap-1 ${w?"cursor-pointer":"cursor-default"}`,children:[e.jsx("span",{className:`w-5 h-5 rounded-full text-[10px] font-semibold flex items-center justify-center shrink-0 transition-colors ${c?"bg-accent text-text-inverse":l?"bg-accent-muted text-accent":"bg-surface-sunken text-text-tertiary"} ${w&&!c?"hover:bg-accent-muted hover:text-accent":""}`,children:a+1}),e.jsx("span",{className:`text-[10px] font-semibold uppercase tracking-wider whitespace-nowrap transition-colors ${c?"text-text-primary":"text-text-tertiary"} ${w&&!c?"hover:text-text-primary":""}`,children:d})]})]},d)})})}function S(t){return t.split(",").map(r=>r.trim()).filter(Boolean)}const O={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:""};function we(t){return{workflow_type:t.workflow_type,description:t.description??"",task_queue:t.task_queue??"",default_role:t.default_role,invocable:t.invocable,roles:(t.roles??[]).join(", "),invocation_roles:(t.invocation_roles??[]).join(", "),consumes:(t.consumes??[]).join(", "),envelope_schema:t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):"",resolver_schema:t.resolver_schema?JSON.stringify(t.resolver_schema,null,2):"",cron_schedule:t.cron_schedule??"",execute_as:t.execute_as??""}}const F=["Identity","Escalation","Invocation & Schemas"];function P(t){if(!t.trim())return!0;try{return JSON.parse(t),!0}catch{return!1}}function A(t,r){return t===1?!!r.workflow_type.trim():t===3?P(r.envelope_schema)&&P(r.resolver_schema):!0}const b="block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",j="text-[10px] text-text-tertiary mt-2 leading-relaxed",J="input font-mono text-[11px] w-full leading-relaxed tabular-nums";function W({selected:t,onChange:r,single:o,placeholder:d}){const{data:a}=me(),l=(a==null?void 0:a.roles)??[],[c,w]=x.useState(!1),p=x.useRef(null);x.useEffect(()=>{const u=n=>{p.current&&!p.current.contains(n.target)&&w(!1)};return document.addEventListener("mousedown",u),()=>document.removeEventListener("mousedown",u)},[]);const y=u=>{o?(r(t.includes(u)?[]:[u]),w(!1)):r(t.includes(u)?t.filter(n=>n!==u):[...t,u])},i=u=>{r(t.filter(n=>n!==u))},m=d??(o?"Select role...":"Add roles...");return e.jsxs("div",{ref:p,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>w(!c),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[t.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:m}),t.map(u=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(L,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),u,e.jsx("span",{role:"button",onClick:n=>{n.stopPropagation(),i(u)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(B,{className:"w-2.5 h-2.5"})})]},u)),e.jsx(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${c?"rotate-180":""}`})]}),c&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"}):l.map(u=>{const n=t.includes(u);return e.jsxs("button",{type:"button",onClick:()=>y(u),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${n?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(L,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:u}),n&&e.jsx(z,{className:"w-3 h-3 shrink-0"})]},u)})})]})}function ve({options:t,selected:r,onChange:o,placeholder:d}){const[a,l]=x.useState(!1),c=x.useRef(null);x.useEffect(()=>{const i=m=>{c.current&&!c.current.contains(m.target)&&l(!1)};return document.addEventListener("mousedown",i),()=>document.removeEventListener("mousedown",i)},[]);const w=i=>{o(r.includes(i)?r.filter(m=>m!==i):[...r,i])},p=i=>{o(r.filter(m=>m!==i))},y=d??"Add workflows...";return e.jsxs("div",{ref:c,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>l(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[r.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:y}),r.map(i=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsx($,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),i,e.jsx("span",{role:"button",onClick:m=>{m.stopPropagation(),p(i)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(B,{className:"w-2.5 h-2.5"})})]},i)),e.jsx(Q,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`})]}),a&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:t.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"}):t.map(i=>{const m=r.includes(i);return e.jsxs("button",{type:"button",onClick:()=>w(i),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${m?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx($,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:i}),m&&e.jsx(z,{className:"w-3 h-3 shrink-0"})]},i)})})]})}function R(t){return S(t)}function D(t){return t.join(", ")}function ke({form:t,set:r,editing:o,durableTypes:d=[]}){const a=!o&&d.length>0;return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Workflow Type"}),a&&!t.workflow_type?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register as certified:"}),e.jsx("div",{className:"grid gap-1",children:d.map(l=>e.jsx("button",{onClick:()=>r("workflow_type",l),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:l},l))}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"or"}),e.jsx("input",{type:"text",onChange:l=>r("workflow_type",l.target.value),placeholder:"Enter a workflow type manually",className:"input font-mono text-xs flex-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",value:t.workflow_type,onChange:l=>r("workflow_type",l.target.value),disabled:o,placeholder:"reviewContent",className:"input font-mono text-xs w-full"}),!o&&t.workflow_type&&d.length>0&&e.jsx("button",{onClick:()=>r("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"})]}),e.jsx("p",{className:j,children:"Registering a durable workflow makes it certified — the interceptor wraps every execution so failures escalate instead of throwing."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Description"}),e.jsx("input",{type:"text",value:t.description,onChange:l=>r("description",l.target.value),placeholder:"AI-powered content moderation with human escalation",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Task Queue"}),e.jsx("input",{type:"text",value:t.task_queue,onChange:l=>r("task_queue",l.target.value),placeholder:"lt-review",className:"input font-mono text-xs w-full"}),e.jsx("p",{className:j,children:"Durable task queue this workflow listens on"})]})]})}function ge({form:t,set:r}){const{data:o}=M(),d=(o??[]).map(a=>a.workflow_type).filter(a=>a!==t.workflow_type);return e.jsxs("div",{className:"space-y-5",children:[e.jsx("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Configure how escalations are routed and who can interact with this workflow."}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Default Escalation Role"}),e.jsx(W,{selected:R(t.default_role),onChange:a=>r("default_role",a[0]??""),single:!0,placeholder:"Select escalation role..."}),e.jsx("p",{className:j,children:"When this workflow escalates, assign to users with this role"})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Escalation Roles"}),e.jsx(W,{selected:R(t.roles),onChange:a=>r("roles",D(a)),placeholder:"Select who can resolve escalations..."}),e.jsx("p",{className:j,children:"Users with any of these roles can claim and resolve escalations from this workflow."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Consumes"}),e.jsx(ve,{options:d,selected:R(t.consumes),onChange:a=>r("consumes",D(a)),placeholder:"Select workflow dependencies..."}),e.jsx("p",{className:j,children:"Output from these upstream workflows will be injected into the input envelope for this workflow."})]})]})}function je({form:t,set:r}){return e.jsxs("div",{className:"space-y-5",children:[e.jsx("div",{className:"flex gap-6 pt-1",children:e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:t.invocable,onChange:o=>r("invocable",o.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"})]})}),e.jsx("p",{className:j,children:"Allow this workflow to be started from the dashboard or API."}),t.invocable&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Run As"}),e.jsx(pe,{selected:t.execute_as,onChange:o=>r("execute_as",o)}),e.jsx("p",{className:j,children:"Choose a bot to execute this workflow under its identity and credentials. Default runs as the invoking user."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Invocation Roles"}),e.jsx(W,{selected:R(t.invocation_roles),onChange:o=>r("invocation_roles",D(o)),placeholder:"Select who can start this workflow..."}),e.jsx("p",{className:j,children:"Only users with these roles can start this workflow. Leave empty to allow all authenticated users."})]}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Envelope Schema"}),e.jsx("textarea",{value:t.envelope_schema,onChange:o=>r("envelope_schema",o.target.value),placeholder:`{
|
|
2
|
-
"data": {
|
|
3
|
-
"contentId": "example-123",
|
|
4
|
-
"content": "Text to review"
|
|
5
|
-
},
|
|
6
|
-
"metadata": {
|
|
7
|
-
"source": "dashboard"
|
|
8
|
-
}
|
|
9
|
-
}`,className:J,rows:8,spellCheck:!1}),e.jsxs("p",{className:j,children:["Pre-fills the JSON editor when invoking this workflow. Should include ",e.jsx("span",{className:"font-mono",children:"data"})," (workflow input) and optional ",e.jsx("span",{className:"font-mono",children:"metadata"})," (context)."]}),t.envelope_schema.trim()&&!P(t.envelope_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]}),!t.invocable&&e.jsx("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Enable ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Invocable"})," above to configure who can start this workflow and set an input template."]})}),e.jsxs("div",{children:[e.jsx("label",{className:b,children:"Resolver Schema"}),e.jsx("textarea",{value:t.resolver_schema,onChange:o=>r("resolver_schema",o.target.value),placeholder:`{
|
|
10
|
-
"approved": true,
|
|
11
|
-
"analysis": {
|
|
12
|
-
"confidence": 0.95,
|
|
13
|
-
"flags": [],
|
|
14
|
-
"summary": "Content meets guidelines"
|
|
15
|
-
}
|
|
16
|
-
}`,className:J,rows:8,spellCheck:!1}),e.jsx("p",{className:j,children:"The shape of data a human or AI provides when resolving an escalation from this workflow. Pre-fills the JSON editor in the escalation resolution form."}),t.resolver_schema.trim()&&!P(t.resolver_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]})}function Me(){const{workflowType:t}=de(),r=!t,o=V(),{data:d,isLoading:a}=M(),l=X(),c=(d==null?void 0:d.find(f=>f.workflow_type===t))??null,w=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]),{data:p}=Z({limit:500}),y=x.useMemo(()=>{const f=new Set((d??[]).map(v=>v.workflow_type));return[...new Set(((p==null?void 0:p.jobs)??[]).map(v=>v.entity))].filter(v=>!f.has(v)&&!w.has(v)).sort()},[d,p]),[i,m]=xe(),u=x.useMemo(()=>{if(!r)return O;const f=i.get("workflow_type")??"",g=i.get("task_queue")??"";return!f&&!g?O:{...O,workflow_type:f,task_queue:g}},[r,i]),[n,N]=x.useState(u),[C,_]=x.useState(""),[s,h]=x.useState(!1),k=parseInt(i.get("step")||"1",10),q=x.useCallback(f=>{m(g=>{const v=new URLSearchParams(g);return v.set("step",String(f)),v},{replace:!1})},[m]);x.useEffect(()=>{if(!s){if(r){N(u),h(!0);return}c&&(N(we(c)),h(!0))}},[c,r,s,u]);const E=(f,g)=>N(v=>({...v,[f]:g})),Y=()=>{if(!n.workflow_type.trim())return;_("");let f=null,g=null;try{n.envelope_schema.trim()&&(f=JSON.parse(n.envelope_schema))}catch{_("Invalid JSON in Envelope Schema");return}try{n.resolver_schema.trim()&&(g=JSON.parse(n.resolver_schema))}catch{_("Invalid JSON in Resolver Schema");return}l.mutate({workflow_type:n.workflow_type.trim(),description:n.description.trim()||null,task_queue:n.task_queue.trim()||null,default_role:n.default_role.trim()||"reviewer",invocable:n.invocable,roles:S(n.roles),invocation_roles:S(n.invocation_roles),consumes:S(n.consumes),envelope_schema:f,resolver_schema:g,cron_schedule:n.cron_schedule.trim()||null,execute_as:n.execute_as.trim()||null},{onSuccess:()=>{o("/workflows/registry")}})};if(a)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(!r&&!c)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Config not found."});const G=k===F.length;return e.jsxs("div",{children:[e.jsx(U,{title:r?"Register Workflow":(c==null?void 0:c.workflow_type)??""}),e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(fe,{steps:F,currentStep:k-1,onStepClick:f=>q(f+1)}),e.jsxs("div",{className:"min-h-[360px] py-2",children:[k===1&&e.jsx(ke,{form:n,set:E,editing:!!c,durableTypes:y}),k===2&&e.jsx(ge,{form:n,set:E}),k===3&&e.jsx(je,{form:n,set:E})]}),(C||l.error)&&e.jsx("p",{className:"text-xs text-status-error mt-4",children:C||l.error.message}),e.jsxs("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsx("div",{children:k>1&&e.jsx("button",{onClick:()=>q(k-1),className:"btn-secondary text-xs",children:"Back"})}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx("button",{onClick:()=>o("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"}),G?e.jsx("button",{onClick:Y,disabled:!A(k,n)||l.isPending,className:"btn-primary text-xs",children:l.isPending?"Saving...":c?"Save":"Create"}):e.jsx("button",{onClick:()=>q(k+1),disabled:!A(k,n),className:"btn-primary text-xs",children:"Next"})]})]})]})]})}export{Me as WorkflowConfigDetailPage,Je as WorkflowConfigsPage};
|
|
17
|
-
//# sourceMappingURL=index-X85K5bHC.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as p,j as e}from"./vendor-query-B2UbickB.js";import{a as A,b as q,c as U,d as B,u as G,e as W,f as H,g as K}from"./mcp-blCW6IL7.js";import{E as V}from"./EmptyState-2CmV-IaS.js";import{C as Y}from"./ConfirmDeleteModal-FSXyKjaB.js";import{P as T}from"./PageHeader-CpWFly5S.js";import{F as Q,a as X,b as M}from"./FilterBar-Ck4K4rzu.js";import{S as Z}from"./StickyPagination-F9FZsRy9.js";import{u as ee}from"./useFilterParams-BaXUAkYK.js";import{M as z}from"./Modal-B4rbIVAn.js";import{J as te}from"./index-D8VH6K8B.js";import{o as E,K as se,t as re,P as I,u as ne,D as ae,G as oe,l as ie,H as le}from"./vendor-icons-ZTAKVwGc.js";import{L as F}from"./vendor-react-Cw8Gy8NJ.js";import{R as ce,a as k}from"./RowActions-Dg-Fsm5O.js";import{S as de}from"./StatusBadge-TlC4jiig.js";const L={name:"",description:"",transport_type:"stdio",transport_config:"{}",auto_connect:!1};function D(t){return{name:t.name,description:t.description??"",transport_type:t.transport_type,transport_config:JSON.stringify(t.transport_config,null,2),auto_connect:t.auto_connect}}function xe({open:t,onClose:n,editing:s}){const l=A(),o=q(),[r,m]=p.useState(s?D(s):L),[g,h]=p.useState(""),[x,v]=p.useState(s);s!==x&&(v(s),m(s?D(s):L),h(""));const d=()=>{h("");let c;try{c=JSON.parse(r.transport_config)}catch{h("Invalid JSON in transport config");return}if(s)o.mutate({id:s.id,name:r.name.trim(),description:r.description.trim()||void 0,transport_type:r.transport_type,transport_config:c,auto_connect:r.auto_connect},{onSuccess:n});else{if(!r.name.trim())return;l.mutate({name:r.name.trim(),description:r.description.trim()||void 0,transport_type:r.transport_type,transport_config:c,auto_connect:r.auto_connect},{onSuccess:n})}},i=l.isPending||o.isPending,j=l.error||o.error,b=(c,y)=>m(w=>({...w,[c]:y}));return e.jsx(z,{open:t,onClose:n,title:s?`Edit — ${s.name}`:"Register MCP Server",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name"}),e.jsx("input",{type:"text",value:r.name,onChange:c=>b("name",c.target.value),placeholder:"e.g., vision-server",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:r.description,onChange:c=>b("description",c.target.value),placeholder:"Optional description",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Transport Type"}),e.jsxs("select",{value:r.transport_type,onChange:c=>b("transport_type",c.target.value),className:"select text-xs w-full",children:[e.jsx("option",{value:"stdio",children:"stdio"}),e.jsx("option",{value:"sse",children:"sse"})]})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Transport Config (JSON)"}),e.jsx("textarea",{value:r.transport_config,onChange:c=>b("transport_config",c.target.value),className:"input font-mono text-xs w-full",rows:6,spellCheck:!1}),g&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:g})]}),e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:r.auto_connect,onChange:c=>b("auto_connect",c.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary",children:"Auto-connect on startup"})]}),j&&e.jsx("p",{className:"text-xs text-status-error",children:j.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:n,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:!r.name.trim()||i,className:"btn-primary text-xs",children:i?"Saving...":s?"Save":"Register"})]})]})})}function ue(t){if(!(t!=null&&t.properties))return{};const n={};for(const[s,l]of Object.entries(t.properties)){const o=l;o.default!==void 0?n[s]=o.default:o.type==="string"?n[s]="":o.type==="number"||o.type==="integer"?n[s]=0:o.type==="boolean"?n[s]=!1:o.type==="object"?n[s]={}:o.type==="array"?n[s]=[]:n[s]=null}return n}function pe({open:t,onClose:n,serverId:s,serverName:l,tool:o}){const r=U(),[m,g]=p.useState(JSON.stringify(ue(o.inputSchema),null,2)),[h,x]=p.useState(""),v=!!r.data||!!r.error,d=()=>{x(""),r.reset();let i;try{i=JSON.parse(m)}catch{x("Invalid JSON");return}r.mutate({serverId:s,toolName:o.name,arguments:i})};return e.jsx(z,{open:t,onClose:n,title:`${l} / ${o.name}`,maxWidth:"max-w-2xl",children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:o.description}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Request"}),e.jsx("textarea",{value:m,onChange:i=>g(i.target.value),className:"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary",rows:8,spellCheck:!1}),h&&e.jsx("p",{className:"text-xs text-status-error mt-1",children:h})]}),r.isPending&&e.jsxs("div",{className:"animate-pulse",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"}),e.jsx("div",{className:"h-20 bg-surface-sunken rounded-md"})]}),r.data?e.jsxs("div",{className:"space-y-2",children:[e.jsx(te,{data:r.data,label:"Response"}),(()=>{var c;const i=(c=r.data)==null?void 0:c.result,j=i==null?void 0:i.job_id,b=(i==null?void 0:i.namespace)||"longtail";return j?e.jsxs(F,{to:`/mcp/executions/${encodeURIComponent(j)}?namespace=${encodeURIComponent(b)}`,className:"inline-flex items-center gap-1.5 text-xs text-accent hover:underline",children:[e.jsx(E,{size:12}),"View Execution Details"]}):null})()]}):null,r.error?e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Response"}),(()=>{const i=r.error instanceof Error?r.error.message:"";return i.startsWith("No credential found for provider")?e.jsxs("div",{className:"bg-status-warning/10 border border-status-warning/30 rounded-md px-4 py-3 flex items-start gap-3",children:[e.jsx(se,{size:16,className:"text-status-warning mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-text-primary mb-1",children:"Credential required"}),e.jsx("p",{className:"text-xs text-text-secondary mb-2",children:i}),e.jsxs(F,{to:"/credentials",className:"text-xs text-accent hover:underline inline-flex items-center gap-1",children:["Go to Credentials",e.jsx(E,{size:10})]})]})]}):e.jsx("div",{className:"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2",children:e.jsx("p",{className:"text-xs text-status-error",children:i||"Tool call failed"})})})()]}):null,e.jsxs("div",{className:"flex justify-end gap-3 pt-2 border-t border-surface-border",children:[e.jsx("button",{onClick:n,className:"btn-ghost text-xs",children:"Close"}),e.jsx("button",{onClick:d,disabled:r.isPending,className:"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5",children:r.isPending?"Running...":v?e.jsxs(e.Fragment,{children:[e.jsx(re,{size:12})," Re-run"]}):e.jsxs(e.Fragment,{children:[e.jsx(I,{size:12})," Run"]})})]})]})})}function me(t){var n,s;return!!((n=t.metadata)!=null&&n.builtin)||!!((s=t.transport_config)!=null&&s.builtin)}function fe(t,n){var o;if(!n)return!0;const s=n.toLowerCase();return t.name.toLowerCase().includes(s)||(o=t.description)!=null&&o.toLowerCase().includes(s)||(t.tags??[]).some(r=>r.toLowerCase().includes(s))?!0:(t.tool_manifest??[]).some(r=>{var m;return r.name.toLowerCase().includes(s)||((m=r.description)==null?void 0:m.toLowerCase().includes(s))})}function he(t,n){if(!n)return t;const s=n.toLowerCase();return t.filter(l=>{var o;return l.name.toLowerCase().includes(s)||((o=l.description)==null?void 0:o.toLowerCase().includes(s))})}function ge({serverId:t,credentialProviders:n}){const{data:s}=B(t);if(n.length===0||!s)return null;const l=s.missing.length===0;return e.jsx("span",{className:`inline-block w-2 h-2 rounded-full shrink-0 ${l?"bg-status-success":"bg-status-warning"}`,title:l?"All credentials registered":`Missing: ${s.missing.join(", ")}`})}function je({server:t,expanded:n,onToggle:s,onEdit:l,onDelete:o,onTryTool:r,connect:m,disconnect:g,visibleTools:h}){const x=t.tool_manifest??[],v=me(t);return e.jsxs(e.Fragment,{children:[e.jsxs("tr",{onClick:x.length>0?s:void 0,className:`group/row border-b transition-colors duration-100 ${x.length>0?"cursor-pointer row-hover":""}`,children:[e.jsx("td",{className:"px-6 py-3.5",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`transition-transform duration-150 ${n?"rotate-90":""} ${x.length===0?"opacity-0":"text-text-tertiary"}`,children:e.jsx(ne,{size:14})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-sm text-text-primary font-medium",children:t.name}),(t.tags??[]).length>0&&e.jsx("div",{className:"flex flex-wrap gap-1 mt-0.5",children:t.tags.map(d=>e.jsx("span",{className:"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded",children:d},d))})]})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(de,{status:t.status}),e.jsx(ge,{serverId:t.id,credentialProviders:t.credential_providers??[]})]})}),e.jsx("td",{className:"px-6 py-3.5 w-28",children:v?null:e.jsxs(ce,{children:[t.status==="connected"?e.jsx(k,{icon:ae,title:"Disconnect server",onClick:()=>g.mutate(t.id)}):e.jsx(k,{icon:oe,title:"Connect server",onClick:()=>m.mutate(t.id),colorClass:"text-text-tertiary hover:text-status-success"}),e.jsx(k,{icon:ie,title:"Edit server",onClick:l}),e.jsx(k,{icon:le,title:"Delete server",onClick:o,colorClass:"text-text-tertiary hover:text-status-error"})]})}),e.jsx("td",{className:"w-12 text-center",children:e.jsx("span",{className:"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent",children:x.length})})]}),h.length>0&&e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:"p-0 border-0",children:e.jsx("div",{className:"grid transition-[grid-template-rows] duration-200 ease-in-out",style:{gridTemplateRows:n?"1fr":"0fr"},children:e.jsxs("div",{className:"overflow-hidden",children:[h.map(d=>e.jsxs("div",{onClick:()=>r(d),className:"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30",children:[e.jsxs("div",{className:"flex-1 pl-14 pr-6 py-2 min-w-0",children:[e.jsx("code",{className:"text-xs font-mono text-accent-primary",children:d.name}),d.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5 line-clamp-1",children:d.description})]}),e.jsx("div",{className:"w-28 px-6 py-2 shrink-0"}),e.jsx("div",{className:"w-28 px-6 py-2 flex justify-end shrink-0",children:e.jsx("button",{onClick:i=>{i.stopPropagation(),r(d)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent",title:"Try tool",children:e.jsx(I,{className:"w-[18px] h-[18px]",strokeWidth:1.5})})})]},d.name)),e.jsx("div",{className:"h-1 bg-surface-sunken/20"})]})})})})]})}function Fe(){const{filters:t,setFilter:n,pagination:s}=ee({filters:{status:"",search:"",tag:""}}),{data:l,isLoading:o}=G({status:t.status||void 0,search:t.search||void 0,tags:t.tag||void 0}),r=W(),m=H(),g=K(),[h,x]=p.useState(!1),[v,d]=p.useState(null),[i,j]=p.useState(null),[b,c]=p.useState(new Set),[y,w]=p.useState(null),N=(l==null?void 0:l.servers)??[],P=(l==null?void 0:l.total)??0,J=p.useMemo(()=>{const a=new Set;for(const u of N)for(const f of u.tags??[])a.add(f);return[...a].sort().map(u=>({value:u,label:u}))},[N]),S=p.useMemo(()=>t.search?N.filter(a=>fe(a,t.search)):N,[N,t.search]);p.useEffect(()=>{if(!t.search)return;const a=t.search.toLowerCase(),u=S.filter(f=>(f.tool_manifest??[]).some(C=>{var R;return C.name.toLowerCase().includes(a)||((R=C.description)==null?void 0:R.toLowerCase().includes(a))})).map(f=>f.id);u.length>0&&c(f=>{const _=new Set(f);for(const C of u)_.add(C);return _})},[t.search,S]);const O=a=>{c(u=>{const f=new Set(u);return f.has(a)?f.delete(a):f.add(a),f})},$=()=>{i&&g.mutate(i.id,{onSuccess:()=>j(null)})};return o?e.jsxs("div",{children:[e.jsx(T,{title:"MCP Server Tools"}),e.jsx("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,u)=>e.jsx("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsx("div",{className:"h-3 bg-surface-sunken rounded w-full"})},u))})]}):e.jsxs("div",{children:[e.jsx(T,{title:"MCP Server Tools",actions:e.jsx("button",{onClick:()=>{d(null),x(!0)},className:"btn-primary text-xs",children:"Register Server"})}),e.jsx("p",{className:"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed",children:"Registered MCP servers and their available tools. Each server exposes tools that can be used by the Pipeline Designer."}),e.jsxs(Q,{children:[e.jsx(X,{label:"Search",value:t.search,onChange:a=>n("search",a),placeholder:"Server or tool name..."}),e.jsx(M,{label:"Tag",value:t.tag,onChange:a=>n("tag",a),options:J}),e.jsx(M,{label:"Status",value:t.status,onChange:a=>n("status",a),options:[{value:"registered",label:"Registered"},{value:"connected",label:"Connected"},{value:"error",label:"Error"},{value:"disconnected",label:"Disconnected"}]})]}),S.length===0?e.jsx(V,{title:"No servers found"}):e.jsxs("table",{className:"w-full",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b",children:[e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Server / Tool"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28",children:"Status"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28"}),e.jsx("th",{className:"sticky top-[2.75rem] z-10 bg-surface w-12"})]})}),e.jsx("tbody",{children:S.map(a=>e.jsx(je,{server:a,expanded:b.has(a.id),onToggle:()=>O(a.id),onEdit:()=>{d(a),x(!0)},onDelete:()=>j(a),onTryTool:u=>w({serverId:a.id,serverName:a.name,tool:u}),connect:r,disconnect:m,visibleTools:he(a.tool_manifest??[],t.search)},a.id))})]}),e.jsx(Z,{page:s.page,totalPages:s.totalPages(P),onPageChange:s.setPage,total:P,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(xe,{open:h,onClose:()=>{x(!1),d(null)},editing:v}),e.jsx(Y,{open:!!i,onClose:()=>j(null),onConfirm:$,title:"Delete MCP Server",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:i==null?void 0:i.name}),"? This will remove the server registration."]}),isPending:g.isPending,error:g.error}),y&&e.jsx(pe,{open:!!y,onClose:()=>w(null),serverId:y.serverId,serverName:y.serverName,tool:y.tool})]})}export{Fe as McpServersPage};
|
|
2
|
-
//# sourceMappingURL=index-rjmgHlSH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-rjmgHlSH.js","sources":["../../src/pages/mcp/servers/ServerFormModal.tsx","../../src/pages/mcp/TryToolModal.tsx","../../src/pages/mcp/servers/helpers.ts","../../src/pages/mcp/servers/ServerRow.tsx","../../src/pages/mcp/servers/McpServersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateMcpServer, useUpdateMcpServer } from '../../../api/mcp';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { McpServerRecord } from '../../../api/types';\n\n// ── Server Form Modal ─────────────────────────────────────────────────────────\n\ninterface ServerFormState {\n name: string;\n description: string;\n transport_type: string;\n transport_config: string;\n auto_connect: boolean;\n}\n\nconst EMPTY_FORM: ServerFormState = {\n name: '',\n description: '',\n transport_type: 'stdio',\n transport_config: '{}',\n auto_connect: false,\n};\n\nfunction serverToForm(s: McpServerRecord): ServerFormState {\n return {\n name: s.name,\n description: s.description ?? '',\n transport_type: s.transport_type,\n transport_config: JSON.stringify(s.transport_config, null, 2),\n auto_connect: s.auto_connect,\n };\n}\n\nexport function ServerFormModal({\n open,\n onClose,\n editing,\n}: {\n open: boolean;\n onClose: () => void;\n editing: McpServerRecord | null;\n}) {\n const createServer = useCreateMcpServer();\n const updateServer = useUpdateMcpServer();\n const [form, setForm] = useState<ServerFormState>(\n editing ? serverToForm(editing) : EMPTY_FORM,\n );\n const [jsonError, setJsonError] = useState('');\n\n const [prevEditing, setPrevEditing] = useState(editing);\n if (editing !== prevEditing) {\n setPrevEditing(editing);\n setForm(editing ? serverToForm(editing) : EMPTY_FORM);\n setJsonError('');\n }\n\n const handleSave = () => {\n setJsonError('');\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(form.transport_config);\n } catch {\n setJsonError('Invalid JSON in transport config');\n return;\n }\n\n if (editing) {\n updateServer.mutate(\n {\n id: editing.id,\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.transport_type,\n transport_config: config,\n auto_connect: form.auto_connect,\n },\n { onSuccess: onClose },\n );\n } else {\n if (!form.name.trim()) return;\n createServer.mutate(\n {\n name: form.name.trim(),\n description: form.description.trim() || undefined,\n transport_type: form.transport_type,\n transport_config: config,\n auto_connect: form.auto_connect,\n },\n { onSuccess: onClose },\n );\n }\n };\n\n const isPending = createServer.isPending || updateServer.isPending;\n const error = createServer.error || updateServer.error;\n\n const set = (field: keyof ServerFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={editing ? `Edit — ${editing.name}` : 'Register MCP Server'}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"e.g., vision-server\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Optional description\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Transport Type\n </label>\n <select\n value={form.transport_type}\n onChange={(e) => set('transport_type', e.target.value)}\n className=\"select text-xs w-full\"\n >\n <option value=\"stdio\">stdio</option>\n <option value=\"sse\">sse</option>\n </select>\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Transport Config (JSON)\n </label>\n <textarea\n value={form.transport_config}\n onChange={(e) => set('transport_config', e.target.value)}\n className=\"input font-mono text-xs w-full\"\n rows={6}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.auto_connect}\n onChange={(e) => set('auto_connect', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary\">Auto-connect on startup</span>\n </label>\n\n {error && (\n <p className=\"text-xs text-status-error\">{(error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={!form.name.trim() || isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Saving...' : editing ? 'Save' : 'Register'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { RotateCcw, Play, ExternalLink, KeyRound } from 'lucide-react';\nimport { useCallMcpTool } from '../../api/mcp';\nimport { Modal } from '../../components/common/modal/Modal';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport type { McpToolManifest } from '../../api/types';\n\ninterface TryToolModalProps {\n open: boolean;\n onClose: () => void;\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n}\n\nfunction buildSkeleton(schema: Record<string, any>): Record<string, any> {\n if (!schema?.properties) return {};\n const result: Record<string, any> = {};\n for (const [key, prop] of Object.entries(schema.properties)) {\n const p = prop as any;\n if (p.default !== undefined) result[key] = p.default;\n else if (p.type === 'string') result[key] = '';\n else if (p.type === 'number' || p.type === 'integer') result[key] = 0;\n else if (p.type === 'boolean') result[key] = false;\n else if (p.type === 'object') result[key] = {};\n else if (p.type === 'array') result[key] = [];\n else result[key] = null;\n }\n return result;\n}\n\nexport function TryToolModal({ open, onClose, serverId, serverName, tool }: TryToolModalProps) {\n const callTool = useCallMcpTool();\n const [argsJson, setArgsJson] = useState(\n JSON.stringify(buildSkeleton(tool.inputSchema), null, 2),\n );\n const [jsonError, setJsonError] = useState('');\n\n const hasResult = !!callTool.data || !!callTool.error;\n\n const handleRun = () => {\n setJsonError('');\n callTool.reset();\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(argsJson);\n } catch {\n setJsonError('Invalid JSON');\n return;\n }\n callTool.mutate({ serverId, toolName: tool.name, arguments: parsed });\n };\n\n return (\n <Modal open={open} onClose={onClose} title={`${serverName} / ${tool.name}`} maxWidth=\"max-w-2xl\">\n <div className=\"flex flex-col gap-4\">\n {/* Tool description */}\n <p className=\"text-xs text-text-secondary\">{tool.description}</p>\n\n {/* Request */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Request\n </label>\n <textarea\n value={argsJson}\n onChange={(e) => setArgsJson(e.target.value)}\n className=\"w-full bg-surface-sunken border border-surface-border rounded-md px-3 py-2 font-mono text-xs text-text-primary focus:outline-none focus:ring-1 focus:ring-inset focus:ring-accent-primary\"\n rows={8}\n spellCheck={false}\n />\n {jsonError && <p className=\"text-xs text-status-error mt-1\">{jsonError}</p>}\n </div>\n\n {/* Response */}\n {callTool.isPending && (\n <div className=\"animate-pulse\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Response</p>\n <div className=\"h-20 bg-surface-sunken rounded-md\" />\n </div>\n )}\n {callTool.data ? (\n <div className=\"space-y-2\">\n <JsonViewer data={callTool.data as Record<string, unknown>} label=\"Response\" />\n {(() => {\n const res = (callTool.data as any)?.result;\n const jobId = res?.job_id;\n const ns = res?.namespace || 'longtail';\n return jobId ? (\n <Link\n to={`/mcp/executions/${encodeURIComponent(jobId)}?namespace=${encodeURIComponent(ns)}`}\n className=\"inline-flex items-center gap-1.5 text-xs text-accent hover:underline\"\n >\n <ExternalLink size={12} />\n View Execution Details\n </Link>\n ) : null;\n })()}\n </div>\n ) : null}\n {callTool.error ? (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">Response</p>\n {(() => {\n const msg = callTool.error instanceof Error ? callTool.error.message : '';\n const isMissingCred = msg.startsWith('No credential found for provider');\n if (isMissingCred) {\n return (\n <div className=\"bg-status-warning/10 border border-status-warning/30 rounded-md px-4 py-3 flex items-start gap-3\">\n <KeyRound size={16} className=\"text-status-warning mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary mb-1\">Credential required</p>\n <p className=\"text-xs text-text-secondary mb-2\">{msg}</p>\n <Link\n to=\"/credentials\"\n className=\"text-xs text-accent hover:underline inline-flex items-center gap-1\"\n >\n Go to Credentials\n <ExternalLink size={10} />\n </Link>\n </div>\n </div>\n );\n }\n return (\n <div className=\"bg-status-error/10 border border-status-error/20 rounded-md px-3 py-2\">\n <p className=\"text-xs text-status-error\">{msg || 'Tool call failed'}</p>\n </div>\n );\n })()}\n </div>\n ) : null}\n\n {/* Actions — pinned at bottom */}\n <div className=\"flex justify-end gap-3 pt-2 border-t border-surface-border\">\n <button\n onClick={onClose}\n className=\"btn-ghost text-xs\"\n >\n Close\n </button>\n <button\n onClick={handleRun}\n disabled={callTool.isPending}\n className=\"btn-primary text-xs disabled:opacity-50 inline-flex items-center gap-1.5\"\n >\n {callTool.isPending ? (\n 'Running...'\n ) : hasResult ? (\n <><RotateCcw size={12} /> Re-run</>\n ) : (\n <><Play size={12} /> Run</>\n )}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { McpServerRecord, McpToolManifest } from '../../../api/types';\n\nexport function isBuiltIn(row: McpServerRecord): boolean {\n return !!(row.metadata as Record<string, unknown> | null)?.builtin\n || !!(row.transport_config as Record<string, unknown> | null)?.builtin;\n}\n\n/** Check if a server or any of its tools match the search term */\nexport function matchesSearch(server: McpServerRecord, search: string): boolean {\n if (!search) return true;\n const q = search.toLowerCase();\n if (server.name.toLowerCase().includes(q)) return true;\n if (server.description?.toLowerCase().includes(q)) return true;\n if ((server.tags ?? []).some((t) => t.toLowerCase().includes(q))) return true;\n const tools = (server.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n\n/** Filter tools within a server that match the search term */\nexport function filterTools(tools: McpToolManifest[], search: string): McpToolManifest[] {\n if (!search) return tools;\n const q = search.toLowerCase();\n return tools.filter(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n}\n","import { ChevronRight, Pencil, Trash2, Plug, Unplug, Play } from 'lucide-react';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport {\n useConnectMcpServer,\n useDisconnectMcpServer,\n useCredentialStatus,\n} from '../../../api/mcp';\nimport { StatusBadge } from '../../../components/common/display/StatusBadge';\n\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { isBuiltIn } from './helpers';\n\nfunction CredentialDot({ serverId, credentialProviders }: { serverId: string; credentialProviders: string[] }) {\n const { data } = useCredentialStatus(serverId);\n if (credentialProviders.length === 0) return null;\n if (!data) return null;\n const ok = data.missing.length === 0;\n return (\n <span\n className={`inline-block w-2 h-2 rounded-full shrink-0 ${ok ? 'bg-status-success' : 'bg-status-warning'}`}\n title={ok ? 'All credentials registered' : `Missing: ${data.missing.join(', ')}`}\n />\n );\n}\n\nexport function ServerRow({\n server,\n expanded,\n onToggle,\n onEdit,\n onDelete,\n onTryTool,\n connect,\n disconnect,\n visibleTools,\n}: {\n server: McpServerRecord;\n expanded: boolean;\n onToggle: () => void;\n onEdit: () => void;\n onDelete: () => void;\n onTryTool: (tool: McpToolManifest) => void;\n connect: ReturnType<typeof useConnectMcpServer>;\n disconnect: ReturnType<typeof useDisconnectMcpServer>;\n visibleTools: McpToolManifest[];\n}) {\n const allTools = (server.tool_manifest ?? []) as McpToolManifest[];\n const builtin = isBuiltIn(server);\n\n return (\n <>\n {/* Server header row */}\n <tr\n onClick={allTools.length > 0 ? onToggle : undefined}\n className={`group/row border-b transition-colors duration-100 ${\n allTools.length > 0 ? 'cursor-pointer row-hover' : ''\n }`}\n >\n {/* Name + tags */}\n <td className=\"px-6 py-3.5\">\n <div className=\"flex items-center gap-2\">\n <span className={`transition-transform duration-150 ${expanded ? 'rotate-90' : ''} ${allTools.length === 0 ? 'opacity-0' : 'text-text-tertiary'}`}>\n <ChevronRight size={14} />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm text-text-primary font-medium\">{server.name}</p>\n {(server.tags ?? []).length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-0.5\">\n {server.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-block px-1.5 py-0 text-[9px] font-medium text-text-tertiary bg-surface-sunken rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n </td>\n\n {/* Status */}\n <td className=\"px-6 py-3.5 w-28\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={server.status} />\n <CredentialDot serverId={server.id} credentialProviders={server.credential_providers ?? []} />\n </div>\n </td>\n\n {/* Actions */}\n <td className=\"px-6 py-3.5 w-28\">\n {builtin ? null : (\n <RowActionGroup>\n {server.status === 'connected' ? (\n <RowAction\n icon={Unplug}\n title=\"Disconnect server\"\n onClick={() => disconnect.mutate(server.id)}\n />\n ) : (\n <RowAction\n icon={Plug}\n title=\"Connect server\"\n onClick={() => connect.mutate(server.id)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction\n icon={Pencil}\n title=\"Edit server\"\n onClick={onEdit}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete server\"\n onClick={onDelete}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n )}\n </td>\n\n {/* Tool count badge — aligned with child row hover icons */}\n <td className=\"w-12 text-center\">\n <span className=\"inline-flex items-center justify-center w-5 h-5 rounded-full border border-accent/30 text-[10px] font-medium text-accent\">\n {allTools.length}\n </span>\n </td>\n </tr>\n\n {/* Expanded tool rows — description below name, aligned to outer columns */}\n {visibleTools.length > 0 && (\n <tr>\n <td colSpan={4} className=\"p-0 border-0\">\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-in-out\"\n style={{ gridTemplateRows: expanded ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n {visibleTools.map((tool) => (\n <div\n key={tool.name}\n onClick={() => onTryTool(tool)}\n className=\"group/row flex items-center cursor-pointer hover:bg-surface-hover/50 transition-colors border-b border-surface-border/30\"\n >\n {/* Tool name + description below */}\n <div className=\"flex-1 pl-14 pr-6 py-2 min-w-0\">\n <code className=\"text-xs font-mono text-accent-primary\">{tool.name}</code>\n {tool.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-1\">{tool.description}</p>\n )}\n </div>\n {/* Status — empty for tools */}\n <div className=\"w-28 px-6 py-2 shrink-0\" />\n {/* Try — hover-reveal icon */}\n <div className=\"w-28 px-6 py-2 flex justify-end shrink-0\">\n <button\n onClick={(e) => { e.stopPropagation(); onTryTool(tool); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-accent\"\n title=\"Try tool\"\n >\n <Play className=\"w-[18px] h-[18px]\" strokeWidth={1.5} />\n </button>\n </div>\n </div>\n ))}\n <div className=\"h-1 bg-surface-sunken/20\" />\n </div>\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport {\n useMcpServers,\n useConnectMcpServer,\n useDisconnectMcpServer,\n useDeleteMcpServer,\n} from '../../../api/mcp';\nimport { EmptyState } from '../../../components/common/display/EmptyState';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport type { McpServerRecord, McpToolManifest } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { ServerFormModal } from './ServerFormModal';\nimport { TryToolModal } from '../../mcp/TryToolModal';\nimport { matchesSearch, filterTools } from './helpers';\nimport { ServerRow } from './ServerRow';\n\nexport function McpServersPage() {\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '', search: '', tag: '' },\n });\n\n const { data, isLoading } = useMcpServers({\n status: filters.status || undefined,\n search: filters.search || undefined,\n tags: filters.tag || undefined,\n });\n const connect = useConnectMcpServer();\n const disconnect = useDisconnectMcpServer();\n const deleteServer = useDeleteMcpServer();\n\n const [showForm, setShowForm] = useState(false);\n const [editing, setEditing] = useState<McpServerRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<McpServerRecord | null>(null);\n const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: McpToolManifest;\n } | null>(null);\n\n const servers = data?.servers ?? [];\n const total = data?.total ?? 0;\n\n // Derive unique tags from current result set for the filter dropdown\n const tagOptions = useMemo(() => {\n const allTags = new Set<string>();\n for (const s of servers) {\n for (const t of s.tags ?? []) allTags.add(t);\n }\n return [...allTags].sort().map((t) => ({ value: t, label: t }));\n }, [servers]);\n\n // Client-side search filtering for tool-level matches within expanded rows\n const filteredServers = useMemo(() => {\n if (!filters.search) return servers;\n return servers.filter((s) => matchesSearch(s, filters.search));\n }, [servers, filters.search]);\n\n // Auto-expand servers whose tools match the search (so results are visible)\n useEffect(() => {\n if (!filters.search) return;\n const q = filters.search.toLowerCase();\n const idsToExpand = filteredServers\n .filter((s) => {\n const tools = (s.tool_manifest ?? []) as McpToolManifest[];\n return tools.some(\n (t) => t.name.toLowerCase().includes(q) || t.description?.toLowerCase().includes(q),\n );\n })\n .map((s) => s.id);\n if (idsToExpand.length > 0) {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n for (const id of idsToExpand) next.add(id);\n return next;\n });\n }\n }, [filters.search, filteredServers]);\n\n const toggleExpand = (id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteServer.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n if (isLoading) {\n return (\n <div>\n <PageHeader title=\"MCP Server Tools\" />\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n <PageHeader\n title=\"MCP Server Tools\"\n actions={\n <button\n onClick={() => {\n setEditing(null);\n setShowForm(true);\n }}\n className=\"btn-primary text-xs\"\n >\n Register Server\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6 max-w-2xl leading-relaxed\">\n Registered MCP servers and their available tools. Each server exposes tools that can be used by the Pipeline Designer.\n </p>\n\n <FilterBar>\n <FilterInput\n label=\"Search\"\n value={filters.search}\n onChange={(v) => setFilter('search', v)}\n placeholder=\"Server or tool name...\"\n />\n <FilterSelect\n label=\"Tag\"\n value={filters.tag}\n onChange={(v) => setFilter('tag', v)}\n options={tagOptions}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'registered', label: 'Registered' },\n { value: 'connected', label: 'Connected' },\n { value: 'error', label: 'Error' },\n { value: 'disconnected', label: 'Disconnected' },\n ]}\n />\n </FilterBar>\n\n {filteredServers.length === 0 ? (\n <EmptyState title=\"No servers found\" />\n ) : (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Server / Tool\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\">\n Status\n </th>\n <th className=\"sticky top-[2.75rem] z-10 bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary w-28\" />\n <th className=\"sticky top-[2.75rem] z-10 bg-surface w-12\" />\n </tr>\n </thead>\n <tbody>\n {filteredServers.map((server) => (\n <ServerRow\n key={server.id}\n server={server}\n expanded={expandedIds.has(server.id)}\n onToggle={() => toggleExpand(server.id)}\n onEdit={() => {\n setEditing(server);\n setShowForm(true);\n }}\n onDelete={() => setConfirmDelete(server)}\n onTryTool={(tool) =>\n setTryTool({\n serverId: server.id,\n serverName: server.name,\n tool,\n })\n }\n connect={connect}\n disconnect={disconnect}\n visibleTools={filterTools(\n (server.tool_manifest ?? []) as McpToolManifest[],\n filters.search,\n )}\n />\n ))}\n </tbody>\n </table>\n )}\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n {/* Create / Edit modal */}\n <ServerFormModal\n open={showForm}\n onClose={() => {\n setShowForm(false);\n setEditing(null);\n }}\n editing={editing}\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete MCP Server\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">{confirmDelete?.name}</span>?\n This will remove the server registration.\n </>\n }\n isPending={deleteServer.isPending}\n error={deleteServer.error as Error | null}\n />\n\n {/* Try tool modal */}\n {tryTool && (\n <TryToolModal\n open={!!tryTool}\n onClose={() => setTryTool(null)}\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n />\n )}\n </div>\n );\n}\n"],"names":["EMPTY_FORM","serverToForm","s","ServerFormModal","open","onClose","editing","createServer","useCreateMcpServer","updateServer","useUpdateMcpServer","form","setForm","useState","jsonError","setJsonError","prevEditing","setPrevEditing","handleSave","config","isPending","error","set","field","value","f","jsx","Modal","jsxs","e","buildSkeleton","schema","result","key","prop","p","TryToolModal","serverId","serverName","tool","callTool","useCallMcpTool","argsJson","setArgsJson","hasResult","handleRun","parsed","JsonViewer","res","_a","jobId","ns","Link","ExternalLink","msg","KeyRound","Fragment","RotateCcw","Play","isBuiltIn","row","_b","matchesSearch","server","search","q","t","filterTools","tools","CredentialDot","credentialProviders","data","useCredentialStatus","ok","ServerRow","expanded","onToggle","onEdit","onDelete","onTryTool","connect","disconnect","visibleTools","allTools","builtin","ChevronRight","tag","StatusBadge","RowActionGroup","RowAction","Unplug","Plug","Pencil","Trash2","McpServersPage","filters","setFilter","pagination","useFilterParams","isLoading","useMcpServers","useConnectMcpServer","useDisconnectMcpServer","deleteServer","useDeleteMcpServer","showForm","setShowForm","setEditing","confirmDelete","setConfirmDelete","expandedIds","setExpandedIds","tryTool","setTryTool","servers","total","tagOptions","useMemo","allTags","filteredServers","useEffect","idsToExpand","prev","next","id","toggleExpand","handleDelete","PageHeader","_","i","FilterBar","FilterInput","v","FilterSelect","EmptyState","StickyPagination","ConfirmDeleteModal"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as c,b as u,c as n}from"./vendor-query-B2UbickB.js";import{a as t}from"./index-D8VH6K8B.js";function i(e={}){const s=new URLSearchParams;e.status&&s.set("status",e.status),e.search&&s.set("search",e.search),e.tags&&s.set("tags",e.tags);const r=s.toString();return c({queryKey:["mcpServers",e],queryFn:()=>t(`/mcp/servers${r?`?${r}`:""}`)})}function m(){const e=u();return n({mutationFn:s=>t("/mcp/servers",{method:"POST",body:JSON.stringify(s)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function y(){const e=u();return n({mutationFn:({id:s,...r})=>t(`/mcp/servers/${s}`,{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function p(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function S(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}/connect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function v(){const e=u();return n({mutationFn:s=>t(`/mcp/servers/${s}/disconnect`,{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:["mcpServers"]})}})}function d(e){return c({queryKey:["mcpCredentialStatus",e],queryFn:()=>t(`/mcp/servers/${e}/credential-status`),enabled:!!e,staleTime:3e4})}function l(){return n({mutationFn:({serverId:e,toolName:s,arguments:r})=>t(`/mcp/servers/${e}/tools/${s}/call`,{method:"POST",body:JSON.stringify({arguments:r})})})}export{m as a,y as b,l as c,d,S as e,v as f,p as g,i as u};
|
|
2
|
-
//# sourceMappingURL=mcp-blCW6IL7.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as a,c as y,u}from"./vendor-query-B2UbickB.js";import{a as r}from"./index-D8VH6K8B.js";const s=["mcpQueryJobs"];function l(){const e=a();return y({mutationFn:t=>r("/insight/mcp-query",{method:"POST",body:JSON.stringify({...t,wait:!1,direct:!0})}),onSuccess:()=>{e.invalidateQueries({queryKey:s,refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function m(){const e=a();return y({mutationFn:t=>r("/insight/mcp-query",{method:"POST",body:JSON.stringify({...t,wait:!1})}),onSuccess:()=>{e.invalidateQueries({queryKey:s,refetchType:"all"}),e.invalidateQueries({queryKey:["jobs"],refetchType:"all"})}})}function p(e={}){const t=new URLSearchParams;return t.set("entity","mcpQuery,mcpTriage"),e.limit&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),e.search&&t.set("search",e.search),e.status&&t.set("status",e.status),t.set("sort_by","created_at"),t.set("order","desc"),u({queryKey:[...s,e],queryFn:()=>r(`/workflow-states/jobs?${t}`)})}function f(e){return u({queryKey:["mcpQueryExecution",e],queryFn:()=>r(`/workflow-states/${e}/execution`),enabled:!!e,refetchInterval:t=>{var n;const i=(n=t.state.data)==null?void 0:n.status;return i==="completed"||i==="failed"?!1:3e3}})}function b(e){return u({queryKey:["mcpQueryResult",e],queryFn:()=>r(`/workflows/${e}/result`),enabled:!!e,retry:!1})}function d(e){return u({queryKey:["mcpQueryDescribe",e.prompt],queryFn:()=>r("/insight/mcp-query/describe",{method:"POST",body:JSON.stringify({prompt:e.prompt,result_title:e.resultTitle,result_summary:e.resultSummary})}),enabled:!!e.prompt,staleTime:1/0,gcTime:30*6e4})}function q(e){return u({queryKey:["yamlWorkflowForSource",e],queryFn:()=>r(`/yaml-workflows?source_workflow_id=${e}&limit=5`),enabled:!!e})}export{m as a,p as b,f as c,b as d,q as e,d as f,l as u};
|
|
2
|
-
//# sourceMappingURL=mcp-query-DoAyPbjC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-query-DoAyPbjC.js","sources":["../../src/api/mcp-query.ts"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTJob, WorkflowExecution } from './types';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface McpQuerySubmitResult {\n workflow_id: string;\n status: string;\n prompt: string;\n}\n\n// ── Query keys ──────────────────────────────────────────────────────────────\n\nexport const MCP_QUERY_JOBS_KEY = ['mcpQueryJobs'] as const;\n\n// ── Hooks ───────────────────────────────────────────────────────────────────\n\n/**\n * Submit a DIRECT mcpQuery (bypasses router — always dynamic MCP orchestration).\n * Used by the MCP Queries list page where the user explicitly wants a new dynamic seed run.\n */\nexport function useSubmitMcpQuery() {\n const queryClient = useQueryClient();\n return useMutation<McpQuerySubmitResult, Error, { prompt: string; tags?: string[] }>({\n mutationFn: (params) =>\n apiFetch<McpQuerySubmitResult>('/insight/mcp-query', {\n method: 'POST',\n body: JSON.stringify({ ...params, wait: false, direct: true }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: MCP_QUERY_JOBS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\n/**\n * Submit via mcpQueryRouter (checks for deterministic match first).\n * Used by the Verify panel (Panel 6) to test end-to-end routing.\n */\nexport function useSubmitMcpQueryRouted() {\n const queryClient = useQueryClient();\n return useMutation<McpQuerySubmitResult, Error, { prompt: string; tags?: string[] }>({\n mutationFn: (params) =>\n apiFetch<McpQuerySubmitResult>('/insight/mcp-query', {\n method: 'POST',\n body: JSON.stringify({ ...params, wait: false }),\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: MCP_QUERY_JOBS_KEY, refetchType: 'all' });\n queryClient.invalidateQueries({ queryKey: ['jobs'], refetchType: 'all' });\n },\n });\n}\n\n/**\n * List mcpQuery workflow executions (system-level durable workflows).\n * Filters to entity=mcpQuery on the long-tail-system task queue.\n */\nexport function useMcpQueryJobs(filters: {\n limit?: number;\n offset?: number;\n search?: string;\n status?: string;\n} = {}) {\n const params = new URLSearchParams();\n params.set('entity', 'mcpQuery,mcpTriage');\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n params.set('sort_by', 'created_at');\n params.set('order', 'desc');\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: [...MCP_QUERY_JOBS_KEY, filters],\n queryFn: () => apiFetch(`/workflow-states/jobs?${params}`),\n });\n}\n\n/**\n * Get execution timeline for an mcpQuery workflow.\n */\nexport function useMcpQueryExecution(workflowId: string | undefined) {\n return useQuery<WorkflowExecution>({\n queryKey: ['mcpQueryExecution', workflowId],\n queryFn: () => apiFetch(`/workflow-states/${workflowId}/execution`),\n enabled: !!workflowId,\n refetchInterval: (query) => {\n // Poll while running, stop when completed\n const status = query.state.data?.status;\n if (status === 'completed' || status === 'failed') return false;\n return 3000;\n },\n });\n}\n\n/**\n * Get the result data from a completed mcpQuery workflow.\n */\nexport function useMcpQueryResult(workflowId: string | undefined) {\n return useQuery<{ workflowId: string; result: { type: string; data: Record<string, unknown> } }>({\n queryKey: ['mcpQueryResult', workflowId],\n queryFn: () => apiFetch(`/workflows/${workflowId}/result`),\n enabled: !!workflowId,\n retry: false,\n });\n}\n\n/**\n * Generate a workflow description and tags from the original prompt + result.\n * Uses an LLM to produce a concise, catalog-style description.\n */\nexport function useDescribeMcpQuery(params: {\n prompt: string | undefined;\n resultTitle: string | undefined;\n resultSummary: string | undefined;\n}) {\n return useQuery<{ tool_name?: string; description: string; tags: string[] }>({\n queryKey: ['mcpQueryDescribe', params.prompt],\n queryFn: () =>\n apiFetch<{ tool_name?: string; description: string; tags: string[] }>('/insight/mcp-query/describe', {\n method: 'POST',\n body: JSON.stringify({\n prompt: params.prompt,\n result_title: params.resultTitle,\n result_summary: params.resultSummary,\n }),\n }),\n enabled: !!params.prompt,\n staleTime: Infinity,\n gcTime: 30 * 60_000,\n });\n}\n\n/**\n * Find a YAML workflow compiled from a specific mcpQuery execution.\n */\nexport function useYamlWorkflowForSource(sourceWorkflowId: string | undefined) {\n return useQuery<{ workflows: Array<{\n id: string; name: string; status: string; graph_topic: string;\n description?: string; tags?: string[]; app_id?: string;\n input_schema?: Record<string, unknown>;\n activity_manifest?: Array<{\n activity_id: string; title: string; type: string;\n tool_source: string; mcp_tool_name?: string;\n }>;\n original_prompt?: string;\n }> }>({\n queryKey: ['yamlWorkflowForSource', sourceWorkflowId],\n queryFn: () => apiFetch(`/yaml-workflows?source_workflow_id=${sourceWorkflowId}&limit=5`),\n enabled: !!sourceWorkflowId,\n });\n}\n"],"names":["MCP_QUERY_JOBS_KEY","useSubmitMcpQuery","queryClient","useQueryClient","useMutation","params","apiFetch","useSubmitMcpQueryRouted","useMcpQueryJobs","filters","useQuery","useMcpQueryExecution","workflowId","query","status","_a","useMcpQueryResult","useDescribeMcpQuery","useYamlWorkflowForSource","sourceWorkflowId"],"mappings":"gGAcO,MAAMA,EAAqB,CAAC,cAAc,EAQ1C,SAASC,GAAoB,CAClC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAA8E,CACnF,WAAaC,GACXC,EAA+B,qBAAsB,CACnD,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,GAAGD,EAAQ,KAAM,GAAO,OAAQ,EAAA,CAAM,CAAA,CAC9D,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAUF,EAAoB,YAAa,MAAO,EAClFE,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH,CAMO,SAASK,GAA0B,CACxC,MAAML,EAAcC,EAAA,EACpB,OAAOC,EAA8E,CACnF,WAAaC,GACXC,EAA+B,qBAAsB,CACnD,OAAQ,OACR,KAAM,KAAK,UAAU,CAAE,GAAGD,EAAQ,KAAM,GAAO,CAAA,CAChD,EACH,UAAW,IAAM,CACfH,EAAY,kBAAkB,CAAE,SAAUF,EAAoB,YAAa,MAAO,EAClFE,EAAY,kBAAkB,CAAE,SAAU,CAAC,MAAM,EAAG,YAAa,MAAO,CAC1E,CAAA,CACD,CACH,CAMO,SAASM,EAAgBC,EAK5B,GAAI,CACN,MAAMJ,EAAS,IAAI,gBACnB,OAAAA,EAAO,IAAI,SAAU,oBAAoB,EACrCI,EAAQ,OAAOJ,EAAO,IAAI,QAAS,OAAOI,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWJ,EAAO,IAAI,SAAU,OAAOI,EAAQ,MAAM,CAAC,EACzEA,EAAQ,QAAQJ,EAAO,IAAI,SAAUI,EAAQ,MAAM,EACnDA,EAAQ,QAAQJ,EAAO,IAAI,SAAUI,EAAQ,MAAM,EACvDJ,EAAO,IAAI,UAAW,YAAY,EAClCA,EAAO,IAAI,QAAS,MAAM,EAEnBK,EAA2C,CAChD,SAAU,CAAC,GAAGV,EAAoBS,CAAO,EACzC,QAAS,IAAMH,EAAS,yBAAyBD,CAAM,EAAE,CAAA,CAC1D,CACH,CAKO,SAASM,EAAqBC,EAAgC,CACnE,OAAOF,EAA4B,CACjC,SAAU,CAAC,oBAAqBE,CAAU,EAC1C,QAAS,IAAMN,EAAS,oBAAoBM,CAAU,YAAY,EAClE,QAAS,CAAC,CAACA,EACX,gBAAkBC,GAAU,OAE1B,MAAMC,GAASC,EAAAF,EAAM,MAAM,OAAZ,YAAAE,EAAkB,OACjC,OAAID,IAAW,aAAeA,IAAW,SAAiB,GACnD,GACT,CAAA,CACD,CACH,CAKO,SAASE,EAAkBJ,EAAgC,CAChE,OAAOF,EAA0F,CAC/F,SAAU,CAAC,iBAAkBE,CAAU,EACvC,QAAS,IAAMN,EAAS,cAAcM,CAAU,SAAS,EACzD,QAAS,CAAC,CAACA,EACX,MAAO,EAAA,CACR,CACH,CAMO,SAASK,EAAoBZ,EAIjC,CACD,OAAOK,EAAsE,CAC3E,SAAU,CAAC,mBAAoBL,EAAO,MAAM,EAC5C,QAAS,IACPC,EAAsE,8BAA+B,CACnG,OAAQ,OACR,KAAM,KAAK,UAAU,CACnB,OAAQD,EAAO,OACf,aAAcA,EAAO,YACrB,eAAgBA,EAAO,aAAA,CACxB,CAAA,CACF,EACH,QAAS,CAAC,CAACA,EAAO,OAClB,UAAW,IACX,OAAQ,GAAK,GAAA,CACd,CACH,CAKO,SAASa,EAAyBC,EAAsC,CAC7E,OAAOT,EASD,CACJ,SAAU,CAAC,wBAAyBS,CAAgB,EACpD,QAAS,IAAMb,EAAS,sCAAsCa,CAAgB,UAAU,EACxF,QAAS,CAAC,CAACA,CAAA,CACZ,CACH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{u as n}from"./vendor-query-B2UbickB.js";import{a}from"./index-D8VH6K8B.js";function c(s){const e=new URLSearchParams;return s.status&&e.set("status",s.status),s.lt_type&&e.set("lt_type",s.lt_type),s.workflow_type&&e.set("workflow_type",s.workflow_type),s.origin_id&&e.set("origin_id",s.origin_id),s.limit&&e.set("limit",String(s.limit)),s.offset!==void 0&&e.set("offset",String(s.offset)),n({queryKey:["tasks",s],queryFn:()=>a(`/tasks?${e}`)})}function y(s){return n({queryKey:["tasks",s],queryFn:()=>a(`/tasks/${s}`),enabled:!!s})}function k(s){return n({queryKey:["tasks","children",s],queryFn:()=>a(`/tasks?parent_workflow_id=${encodeURIComponent(s)}&limit=50`),enabled:!!s})}function p(s){return n({queryKey:["tasks","byWorkflow",s],queryFn:async()=>{const e=await a(`/tasks?workflow_id=${encodeURIComponent(s)}&limit=1`);return e.tasks.length>0?e.tasks[0]:(await a(`/tasks?parent_workflow_id=${encodeURIComponent(s)}&limit=1`)).tasks[0]??null},enabled:!!s})}function m(s){const e=new URLSearchParams;return s!=null&&s.limit&&e.set("limit",String(s.limit)),(s==null?void 0:s.offset)!==void 0&&e.set("offset",String(s.offset)),s!=null&&s.workflow_type&&e.set("workflow_type",s.workflow_type),s!=null&&s.status&&e.set("status",s.status),s!=null&&s.search&&e.set("search",s.search),n({queryKey:["processes",s],queryFn:()=>a(`/tasks/processes?${e}`)})}function r(s){return n({queryKey:["processes",s],queryFn:()=>a(`/tasks/processes/${encodeURIComponent(s)}`),enabled:!!s})}export{r as a,p as b,c,y as d,k as e,m as u};
|
|
2
|
-
//# sourceMappingURL=tasks-tRqClPns.js.map
|