@hotmeshio/long-tail 0.1.3 → 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 +118 -173
- 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 +12 -10
- package/build/index.js +15 -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/register-tool.d.ts +11 -0
- package/build/services/mcp/register-tool.js +15 -0
- 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
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as n,j as o}from"./index-DSzSoku1.js";import{c as m}from"./tasks-3Hih8Bt7.js";import{d}from"./useNatsEvents-DeGKHFTX.js";import{u}from"./mcp-BzVpaaKF.js";import{P as c}from"./PageHeaderWithStats-TikLQsTp.js";import"./vendor-query-DLp59M9_.js";import"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-DCLlGYO9.js";function N(){var e;d();const{data:a}=m({limit:1}),{data:t}=n({status:"pending",limit:1}),{data:s}=u(),r=((e=s==null?void 0:s.servers)==null?void 0:e.filter(l=>l.status==="connected").length)??0,i=s?`${r}/${s.total}`:"—";return o.jsxDEV("div",{children:o.jsxDEV(c,{title:"Admin",stats:[{label:"Tasks",value:(a==null?void 0:a.total)??"—"},{label:"Pending Escalations",value:(t==null?void 0:t.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:i},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:19,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/admin/AdminDashboard.tsx",lineNumber:18,columnNumber:5},this)}export{N as AdminDashboard};
|
|
2
|
+
//# sourceMappingURL=AdminDashboard-CTyAMUJR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminDashboard-CTyAMUJR.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useNatsEvents';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsxDEV","PageHeaderWithStats"],"mappings":"kUAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,gBACG,MAAA,CACC,SAAAM,EAAAA,OAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,EAPF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAQA,EATF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,k as $,e as re,l as me,m as ce,n as de,o as ue,p as pe,q as be,r as he}from"./index-DSzSoku1.js";import{a as i}from"./vendor-query-DLp59M9_.js";import{d as Ne}from"./useNatsEvents-DeGKHFTX.js";import{u as xe}from"./roles-wCdQ2Z7k.js";import{u as ge}from"./useFilterParams-BUyLHcx_.js";import{D as fe}from"./DataTable-B3uf5CCo.js";import{S as ve}from"./StickyPagination-CTosgiU2.js";import{M as O}from"./Modal-CI5RBPOQ.js";import{P as Ee}from"./PageHeader-SMD9qtOO.js";import{P as ke}from"./constants-BHkpVaqx.js";import{u as U,C as G}from"./CustomDurationPicker-BataWFj8.js";import{u as Ae}from"./users-BTagPmGW.js";import{E as Be,a as ye}from"./escalation-columns-C91fHSkp.js";import{R as De,a as je}from"./RowActions-Cp5HyK_w.js";import{R as Ce}from"./RefreshButton-BcQDObrv.js";import{w as Ve}from"./vendor-icons-DCLlGYO9.js";import{c as Pe}from"./vendor-react-Co3Y8ikm.js";import"./EmptyState-BChBJNGS.js";import"./settings-DDe_L7JT.js";import"./FilterBar-CShf0oe7.js";import"./PriorityBadge-CQ0EsLTA.js";import"./RolePill-Crj4TH5p.js";import"./WorkflowPill-Diw8iWBP.js";import"./TimestampCell-IVL_-Upy.js";import"./escalation-DTY_OKRh.js";const Se=s=>s.isPriorityPending||s.isClaimPending||s.isAssignPending||s.isEscalatePending||s.isTriagePending;function Me(s){const t=Se(s),c=U();return e.jsxDEV("div",{className:"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4",children:[e.jsxDEV("span",{className:"text-xs font-medium text-accent",children:[s.selectedCount," selected"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:29,columnNumber:7},this),e.jsxDEV("div",{className:"w-px h-5 bg-surface-border"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:33,columnNumber:7},this),e.jsxDEV("select",{onChange:a=>{a.target.value&&(s.onSetPriority(parseInt(a.target.value)),a.target.value="")},disabled:t,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsxDEV("option",{value:"",disabled:!0,children:"Priority..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:46,columnNumber:9},this),ke.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:48,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:36,columnNumber:7},this),e.jsxDEV("select",{onChange:a=>{a.target.value&&(s.onClaim(parseInt(a.target.value)),a.target.value="")},disabled:t,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsxDEV("option",{value:"",disabled:!0,children:"Claim for..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:63,columnNumber:9},this),c.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:65,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:53,columnNumber:7},this),e.jsxDEV("button",{onClick:s.onAssign,disabled:t,className:"btn-secondary text-xs py-1.5",children:s.isAssignPending?"Assigning...":"Assign to..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:70,columnNumber:7},this),s.availableRoles.length>0&&e.jsxDEV("select",{onChange:a=>{a.target.value&&(s.onEscalate(a.target.value),a.target.value="")},disabled:t,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsxDEV("option",{value:"",disabled:!0,children:"Escalate to..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:90,columnNumber:11},this),s.availableRoles.map(a=>e.jsxDEV("option",{value:a,children:a},a,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:92,columnNumber:13},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:80,columnNumber:9},this),e.jsxDEV("button",{onClick:s.onTriage,disabled:t,className:"btn-secondary text-xs py-1.5",children:s.isTriagePending?"Triaging...":"Triage"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:98,columnNumber:7},this),e.jsxDEV("div",{className:"flex-1"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:106,columnNumber:7},this),e.jsxDEV("button",{onClick:s.onClearSelection,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:109,columnNumber:7},this),t&&e.jsxDEV("span",{className:"text-xs text-text-tertiary animate-pulse",children:"Processing..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:117,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkActionBar.tsx",lineNumber:28,columnNumber:5},this)}function Te({open:s,onClose:t,selectedCount:c,selectedRoles:a,onSubmit:E,isPending:n}){const{isSuperAdmin:N}=$(),r=U(),[g,d]=i.useState("user"),[p,k]=i.useState(null),[B,T]=i.useState(""),[A,w]=i.useState("30"),[m,b]=i.useState(0),z=i.useCallback(l=>b(l),[]),V=!N&&a.length===1?a[0]:void 0,{data:f,isLoading:y}=Ae({role:V,status:"active",limit:200}),D=i.useMemo(()=>{const l=(f==null?void 0:f.users)??[];if(!B.trim())return l;const x=B.toLowerCase();return l.filter(j=>{var h,R;return((h=j.display_name)==null?void 0:h.toLowerCase().includes(x))||((R=j.email)==null?void 0:R.toLowerCase().includes(x))})},[f==null?void 0:f.users,B]),P=()=>{d("user"),k(null),T(""),w("30"),b(0),t()},_=l=>{k(l),d("duration")},S=()=>{d("user")},I=()=>{if(!p)return;const l=A==="custom"?m:parseInt(A);!l||l<=0||E(p.id,l)};return e.jsxDEV(O,{open:s,onClose:P,title:"Assign Escalations",children:e.jsxDEV("div",{className:"space-y-4",children:[g==="user"&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:["Select a user to assign"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:c},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:89,columnNumber:15},this)," ","escalation(s) to:"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:87,columnNumber:13},this),e.jsxDEV("input",{type:"text",value:B,onChange:l=>T(l.target.value),placeholder:"Search by name or email...",className:"input text-xs w-full",autoFocus:!0},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:95,columnNumber:13},this),e.jsxDEV("div",{className:"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border",children:[y&&e.jsxDEV("p",{className:"text-xs text-text-tertiary p-3",children:"Loading users..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:106,columnNumber:17},this),!y&&D.length===0&&e.jsxDEV("p",{className:"text-xs text-text-tertiary p-3",children:"No users found"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:111,columnNumber:17},this),D.map(l=>e.jsxDEV("button",{onClick:()=>_(l),className:"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors",children:[e.jsxDEV("p",{className:"text-xs font-medium text-text-primary",children:l.display_name||l.external_id},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:121,columnNumber:19},this),l.email&&e.jsxDEV("p",{className:"text-[10px] text-text-tertiary",children:l.email},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:125,columnNumber:21},this)]},l.id,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:116,columnNumber:17},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:104,columnNumber:13},this),e.jsxDEV("div",{className:"flex justify-end pt-2",children:e.jsxDEV("button",{onClick:P,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:134,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:133,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:86,columnNumber:11},this),g==="duration"&&p&&e.jsxDEV(e.Fragment,{children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:["Assign to"," ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:p.display_name||p.external_id},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:145,columnNumber:15},this)," ","for:"]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:143,columnNumber:13},this),e.jsxDEV("select",{value:A,onChange:l=>{w(l.target.value),b(0)},className:"select w-full text-sm",children:[r.map(l=>e.jsxDEV("option",{value:l.value,children:l.label},l.value,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:157,columnNumber:17},this)),e.jsxDEV("option",{value:"custom",children:"Other..."},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:161,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:151,columnNumber:13},this),A==="custom"&&e.jsxDEV(G,{onChange:z,autoFocus:!0},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:164,columnNumber:15},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:S,className:"btn-secondary text-xs",children:"Back"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:168,columnNumber:15},this),e.jsxDEV("button",{onClick:I,disabled:n,className:"btn-primary text-xs",children:n?"Assigning...":"Assign"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:171,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:167,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:142,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:84,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkAssignModal.tsx",lineNumber:83,columnNumber:5},this)}function we({open:s,onClose:t,selectedCount:c,onSubmit:a,isPending:E}){const[n,N]=i.useState(""),r=()=>{a(n||void 0)};return e.jsxDEV(O,{open:s,onClose:t,title:"Submit for AI Triage",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:c},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:29,columnNumber:18},this)," escalation(s) for AI triage? The triage orchestrator will take over resolution."]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:28,columnNumber:9},this),e.jsxDEV("div",{children:[e.jsxDEV("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsxDEV("span",{className:"text-text-tertiary",children:"(optional)"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:35,columnNumber:25},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:34,columnNumber:11},this),e.jsxDEV("input",{type:"text",value:n,onChange:g=>N(g.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:37,columnNumber:11},this),e.jsxDEV("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:44,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:33,columnNumber:9},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:t,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:50,columnNumber:11},this),e.jsxDEV("button",{onClick:r,disabled:E,className:"btn-primary text-xs",children:E?"Submitting...":"Submit for Triage"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:53,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:49,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:27,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/BulkTriageModal.tsx",lineNumber:26,columnNumber:5},this)}function M(s,t,c){return a=>{s.mutate(a,{onSuccess:()=>{t(),c==null||c()}})}}function _e(s){const t=()=>[...s.selectedIds];return{handleSetPriority:r=>{M(s.setPriority,s.clearSelection)({ids:t(),priority:r})},handleBulkClaim:r=>{M(s.bulkClaim,s.clearSelection)({ids:t(),durationMinutes:r})},handleBulkEscalate:r=>{M(s.bulkEscalate,s.clearSelection)({ids:t(),targetRole:r})},handleBulkTriage:r=>{M(s.bulkTriage,s.clearSelection,s.closeTriageModal)({ids:t(),hint:r})},handleBulkAssign:(r,g)=>{M(s.bulkAssign,s.clearSelection,s.closeAssignModal)({ids:t(),targetUserId:r,durationMinutes:g})}}}function na(){Ne();const s=Pe(),{user:t,isSuperAdmin:c}=$(),{filters:a,setFilter:E,pagination:n,sort:N,setSort:r}=ge({filters:{role:"",type:"",priority:"",status:"available"}}),g=U(),[d,p]=i.useState(null),[k,B]=i.useState("30"),[T,A]=i.useState(0),w=i.useCallback(o=>A(o),[]),[m,b]=i.useState(new Set),[z,V]=i.useState(!1),[f,y]=i.useState(!1),D=re(),P=me(),_=ce(),S=de(),I=ue(),l=pe(),{data:x}=xe(),{data:j}=be();i.useEffect(()=>{b(new Set)},[a.role,a.type,a.priority,a.status,n.page,n.pageSize]);const h=a.status||"",R=h==="available"||h==="claimed"?"pending":h==="resolved"?"resolved":void 0,{data:C,isLoading:Y,error:F,refetch:J,isFetching:K}=he({status:R,role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:n.pageSize,offset:n.offset,sort_by:N.sort_by||void 0,order:N.sort_by?N.order:void 0}),H=new Date,L=(C==null?void 0:C.escalations)??[],v=h==="available"?L.filter(o=>!o.assigned_to||!o.assigned_until||new Date(o.assigned_until)<=H):h==="claimed"?L.filter(o=>o.assigned_to&&o.assigned_until&&new Date(o.assigned_until)>H):L,q=h==="available"||h==="claimed"?v.length:(C==null?void 0:C.total)??0,Q=c||(t==null?void 0:t.roles.some(o=>o.type==="admin")),W=i.useMemo(()=>{const o=new Set;for(const u of v)m.has(u.id)&&o.add(u.role);return[...o]},[v,m]),X=i.useCallback(()=>b(new Set),[]),Z=()=>{if(!d)return;const o=k==="custom"?T:parseInt(k);!o||o<=0||D.mutate({id:d.id,durationMinutes:o},{onSuccess:()=>{p(null),s(`/escalations/detail/${d.id}`)}})},{handleSetPriority:ee,handleBulkClaim:ae,handleBulkEscalate:se,handleBulkTriage:oe,handleBulkAssign:le}=_e({selectedIds:m,clearSelection:X,setPriority:P,bulkClaim:_,bulkEscalate:I,bulkTriage:l,bulkAssign:S,closeTriageModal:()=>V(!1),closeAssignModal:()=>y(!1)}),te=o=>{const u=new Set(m);u.has(o)?u.delete(o):u.add(o),b(u)},ie=()=>{m.size===v.length?b(new Set):b(new Set(v.map(o=>o.id)))},ne=[Q?{key:"select",label:e.jsxDEV("input",{type:"checkbox",checked:v.length>0&&m.size===v.length,onChange:ie,className:"rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:156,columnNumber:9},this),render:o=>e.jsxDEV("input",{type:"checkbox",checked:m.has(o.id),onChange:u=>{u.stopPropagation(),te(o.id)},onClick:u=>u.stopPropagation(),className:"rounded"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:164,columnNumber:9},this),className:"w-10"}:{key:"spacer",label:"",render:()=>null,className:"w-10"},...Be,{key:"actions",label:"",render:o=>e.jsxDEV(De,{children:e.jsxDEV(je,{icon:Ve,title:"Claim escalation",onClick:()=>p(o)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:188,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:187,columnNumber:9},this),className:"w-16 text-right"}];return e.jsxDEV("div",{children:[e.jsxDEV(Ee,{title:"All Escalations"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:201,columnNumber:7},this),e.jsxDEV(ye,{filters:a,setFilter:E,roles:(x==null?void 0:x.roles)??[],types:(j==null?void 0:j.types)??[],showStatus:!0,actions:e.jsxDEV(Ce,{onClick:()=>J(),isFetching:K},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:209,columnNumber:18},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:203,columnNumber:7},this),m.size>0&&e.jsxDEV(Me,{selectedCount:m.size,onClearSelection:()=>b(new Set),onSetPriority:ee,onClaim:ae,onAssign:()=>y(!0),onEscalate:se,onTriage:()=>V(!0),isPriorityPending:P.isPending,isClaimPending:_.isPending,isAssignPending:S.isPending,isEscalatePending:I.isPending,isTriagePending:l.isPending,availableRoles:(x==null?void 0:x.roles)??[]},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:213,columnNumber:9},this),F&&e.jsxDEV("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:F.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${F.message}`},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:231,columnNumber:9},this),e.jsxDEV(fe,{columns:ne,data:v,keyFn:o=>o.id,onRowClick:o=>s(`/escalations/detail/${o.id}`,{state:{from:"/escalations/available"}}),isLoading:Y,emptyMessage:F?"Unable to load data":"No available escalations",sort:N,onSort:r},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:238,columnNumber:7},this),e.jsxDEV(ve,{page:n.page,totalPages:n.totalPages(q),onPageChange:n.setPage,total:q,pageSize:n.pageSize,onPageSizeChange:n.setPageSize},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:249,columnNumber:7},this),e.jsxDEV(O,{open:!!d,onClose:()=>p(null),title:"Claim Escalation",children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsxDEV("span",{className:"font-medium text-text-primary",children:d==null?void 0:d.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:265,columnNumber:19},this)," for:"]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:264,columnNumber:11},this),e.jsxDEV("select",{value:k,onChange:o=>{B(o.target.value),A(0)},className:"select w-full text-sm",children:[g.map(o=>e.jsxDEV("option",{value:o.value,children:o.label},o.value,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:273,columnNumber:15},this)),e.jsxDEV("option",{value:"custom",children:"Other..."},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:275,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:267,columnNumber:11},this),k==="custom"&&e.jsxDEV(G,{onChange:w,autoFocus:!0},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:278,columnNumber:13},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:()=>p(null),className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:281,columnNumber:13},this),e.jsxDEV("button",{onClick:Z,className:"btn-primary text-xs",disabled:D.isPending,children:D.isPending?"Claiming...":"Claim"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:284,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:280,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:263,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:258,columnNumber:7},this),e.jsxDEV(we,{open:z,onClose:()=>V(!1),selectedCount:m.size,onSubmit:oe,isPending:l.isPending},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:295,columnNumber:7},this),e.jsxDEV(Te,{open:f,onClose:()=>y(!1),selectedCount:m.size,selectedRoles:W,onSubmit:le,isPending:S.isPending},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:303,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/AvailableEscalationsPage.tsx",lineNumber:200,columnNumber:5},this)}export{na as AvailableEscalationsPage};
|
|
2
|
+
//# sourceMappingURL=AvailableEscalationsPage-BMXV3Q4l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvailableEscalationsPage-BMXV3Q4l.js","sources":["../../src/components/common/modal/BulkActionBar.tsx","../../src/components/common/modal/BulkAssignModal.tsx","../../src/components/common/modal/BulkTriageModal.tsx","../../src/pages/operator/helpers.ts","../../src/pages/operator/AvailableEscalationsPage.tsx"],"sourcesContent":["import { PRIORITY_OPTIONS } from '../../../lib/constants';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\n\ninterface BulkActionBarProps {\n selectedCount: number;\n onClearSelection: () => void;\n onSetPriority: (priority: 1 | 2 | 3 | 4) => void;\n onClaim: (durationMinutes: number) => void;\n onAssign: () => void;\n onEscalate: (targetRole: string) => void;\n onTriage: () => void;\n isPriorityPending: boolean;\n isClaimPending: boolean;\n isAssignPending: boolean;\n isEscalatePending: boolean;\n isTriagePending: boolean;\n availableRoles: string[];\n}\n\nconst anyPending = (props: BulkActionBarProps) =>\n props.isPriorityPending || props.isClaimPending || props.isAssignPending || props.isEscalatePending || props.isTriagePending;\n\nexport function BulkActionBar(props: BulkActionBarProps) {\n const disabled = anyPending(props);\n const claimDurations = useClaimDurations();\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 px-4 py-3 bg-accent/5 border border-accent/20 rounded-lg mb-4\">\n <span className=\"text-xs font-medium text-accent\">\n {props.selectedCount} selected\n </span>\n\n <div className=\"w-px h-5 bg-surface-border\" />\n\n {/* Priority */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onSetPriority(parseInt(e.target.value) as 1 | 2 | 3 | 4);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Priority...</option>\n {PRIORITY_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Claim */}\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onClaim(parseInt(e.target.value));\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Claim for...</option>\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n\n {/* Assign */}\n <button\n onClick={props.onAssign}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isAssignPending ? 'Assigning...' : 'Assign to...'}\n </button>\n\n {/* Escalate */}\n {props.availableRoles.length > 0 && (\n <select\n onChange={(e) => {\n if (!e.target.value) return;\n props.onEscalate(e.target.value);\n e.target.value = '';\n }}\n disabled={disabled}\n className=\"select text-xs py-1.5\"\n defaultValue=\"\"\n >\n <option value=\"\" disabled>Escalate to...</option>\n {props.availableRoles.map((role) => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n )}\n\n {/* Triage */}\n <button\n onClick={props.onTriage}\n disabled={disabled}\n className=\"btn-secondary text-xs py-1.5\"\n >\n {props.isTriagePending ? 'Triaging...' : 'Triage'}\n </button>\n\n <div className=\"flex-1\" />\n\n {/* Clear */}\n <button\n onClick={props.onClearSelection}\n className=\"text-xs text-text-tertiary hover:text-text-primary transition-colors\"\n >\n Clear\n </button>\n\n {disabled && (\n <span className=\"text-xs text-text-tertiary animate-pulse\">Processing...</span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Modal } from './Modal';\nimport { CustomDurationPicker } from '../form/CustomDurationPicker';\nimport { useUsers } from '../../../api/users';\nimport { useAuth } from '../../../hooks/useAuth';\nimport { useClaimDurations } from '../../../hooks/useClaimDurations';\nimport type { LTUserRecord } from '../../../api/types';\n\ninterface BulkAssignModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n /** Distinct roles of the selected escalations; scopes user list for admins */\n selectedRoles: string[];\n onSubmit: (targetUserId: string, durationMinutes: number) => void;\n isPending: boolean;\n}\n\nexport function BulkAssignModal({\n open,\n onClose,\n selectedCount,\n selectedRoles,\n onSubmit,\n isPending,\n}: BulkAssignModalProps) {\n const { isSuperAdmin } = useAuth();\n const claimDurations = useClaimDurations();\n const [step, setStep] = useState<'user' | 'duration'>('user');\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [search, setSearch] = useState('');\n const [duration, setDuration] = useState('30');\n const [customMinutes, setCustomMinutes] = useState(0);\n const onCustomChange = useCallback((m: number) => setCustomMinutes(m), []);\n\n // Admins with a single role: scope to that role. Otherwise show all active users.\n const roleFilter =\n !isSuperAdmin && selectedRoles.length === 1 ? selectedRoles[0] : undefined;\n\n const { data: usersData, isLoading: usersLoading } = useUsers({\n role: roleFilter,\n status: 'active',\n limit: 200,\n });\n\n const filteredUsers = useMemo(() => {\n const users = usersData?.users ?? [];\n if (!search.trim()) return users;\n const q = search.toLowerCase();\n return users.filter(\n (u) =>\n u.display_name?.toLowerCase().includes(q) ||\n u.email?.toLowerCase().includes(q),\n );\n }, [usersData?.users, search]);\n\n const handleClose = () => {\n setStep('user');\n setSelectedUser(null);\n setSearch('');\n setDuration('30');\n setCustomMinutes(0);\n onClose();\n };\n\n const handleSelectUser = (user: LTUserRecord) => {\n setSelectedUser(user);\n setStep('duration');\n };\n\n const handleBack = () => {\n setStep('user');\n };\n\n const handleSubmit = () => {\n if (!selectedUser) return;\n const minutes = duration === 'custom' ? customMinutes : parseInt(duration);\n if (!minutes || minutes <= 0) return;\n onSubmit(selectedUser.id, minutes);\n };\n\n return (\n <Modal open={open} onClose={handleClose} title=\"Assign Escalations\">\n <div className=\"space-y-4\">\n {step === 'user' && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Select a user to assign{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedCount}\n </span>{' '}\n escalation(s) to:\n </p>\n\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search by name or email...\"\n className=\"input text-xs w-full\"\n autoFocus\n />\n\n <div className=\"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border\">\n {usersLoading && (\n <p className=\"text-xs text-text-tertiary p-3\">\n Loading users...\n </p>\n )}\n {!usersLoading && filteredUsers.length === 0 && (\n <p className=\"text-xs text-text-tertiary p-3\">\n No users found\n </p>\n )}\n {filteredUsers.map((user) => (\n <button\n key={user.id}\n onClick={() => handleSelectUser(user)}\n className=\"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors\"\n >\n <p className=\"text-xs font-medium text-text-primary\">\n {user.display_name || user.external_id}\n </p>\n {user.email && (\n <p className=\"text-[10px] text-text-tertiary\">\n {user.email}\n </p>\n )}\n </button>\n ))}\n </div>\n\n <div className=\"flex justify-end pt-2\">\n <button onClick={handleClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n </div>\n </>\n )}\n\n {step === 'duration' && selectedUser && (\n <>\n <p className=\"text-sm text-text-secondary\">\n Assign to{' '}\n <span className=\"font-medium text-text-primary\">\n {selectedUser.display_name || selectedUser.external_id}\n </span>{' '}\n for:\n </p>\n\n <select\n value={duration}\n onChange={(e) => { setDuration(e.target.value); setCustomMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {duration === 'custom' && (\n <CustomDurationPicker onChange={onCustomChange} autoFocus />\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={handleBack} className=\"btn-secondary text-xs\">\n Back\n </button>\n <button\n onClick={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Assigning...' : 'Assign'}\n </button>\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { Modal } from './Modal';\n\ninterface BulkTriageModalProps {\n open: boolean;\n onClose: () => void;\n selectedCount: number;\n onSubmit: (hint?: string) => void;\n isPending: boolean;\n}\n\nexport function BulkTriageModal({\n open,\n onClose,\n selectedCount,\n onSubmit,\n isPending,\n}: BulkTriageModalProps) {\n const [hint, setHint] = useState('');\n\n const handleSubmit = () => {\n onSubmit(hint || undefined);\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Submit for AI Triage\">\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Submit <span className=\"font-medium text-text-primary\">{selectedCount}</span> escalation(s)\n for AI triage? The triage orchestrator will take over resolution.\n </p>\n\n <div>\n <label className=\"text-xs font-medium text-text-secondary block mb-1\">\n Triage hint <span className=\"text-text-tertiary\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={hint}\n onChange={(e) => setHint(e.target.value)}\n placeholder=\"e.g., image_orientation\"\n className=\"input text-xs font-mono w-full\"\n />\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n Guides the triage workflow on what remediation to apply\n </p>\n </div>\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={handleSubmit}\n disabled={isPending}\n className=\"btn-primary text-xs\"\n >\n {isPending ? 'Submitting...' : 'Submit for Triage'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import type { UseMutationResult } from '@tanstack/react-query';\n\n/**\n * Create a bulk-action handler that calls a mutation and clears selection on success.\n */\nfunction bulkHandler<TData, TVariables>(\n mutation: UseMutationResult<TData, Error, TVariables>,\n clearSelection: () => void,\n afterSuccess?: () => void,\n) {\n return (variables: TVariables) => {\n mutation.mutate(variables, {\n onSuccess: () => {\n clearSelection();\n afterSuccess?.();\n },\n });\n };\n}\n\nexport function createBulkHandlers(deps: {\n selectedIds: Set<string>;\n clearSelection: () => void;\n setPriority: UseMutationResult<{ updated: number }, Error, { ids: string[]; priority: 1 | 2 | 3 | 4 }>;\n bulkClaim: UseMutationResult<{ claimed: number; skipped: number }, Error, { ids: string[]; durationMinutes: number }>;\n bulkEscalate: UseMutationResult<{ updated: number }, Error, { ids: string[]; targetRole: string }>;\n bulkTriage: UseMutationResult<{ triaged: number }, Error, { ids: string[]; hint?: string }>;\n bulkAssign: UseMutationResult<{ assigned: number; skipped: number }, Error, { ids: string[]; targetUserId: string; durationMinutes: number }>;\n closeTriageModal: () => void;\n closeAssignModal: () => void;\n}) {\n const ids = () => [...deps.selectedIds];\n\n const handleSetPriority = (priority: 1 | 2 | 3 | 4) => {\n bulkHandler(\n deps.setPriority,\n deps.clearSelection,\n )({ ids: ids(), priority });\n };\n\n const handleBulkClaim = (durationMinutes: number) => {\n bulkHandler(\n deps.bulkClaim,\n deps.clearSelection,\n )({ ids: ids(), durationMinutes });\n };\n\n const handleBulkEscalate = (targetRole: string) => {\n bulkHandler(\n deps.bulkEscalate,\n deps.clearSelection,\n )({ ids: ids(), targetRole });\n };\n\n const handleBulkTriage = (hint?: string) => {\n bulkHandler(\n deps.bulkTriage,\n deps.clearSelection,\n deps.closeTriageModal,\n )({ ids: ids(), hint });\n };\n\n const handleBulkAssign = (targetUserId: string, durationMinutes: number) => {\n bulkHandler(\n deps.bulkAssign,\n deps.clearSelection,\n deps.closeAssignModal,\n )({ ids: ids(), targetUserId, durationMinutes });\n };\n\n return { handleSetPriority, handleBulkClaim, handleBulkEscalate, handleBulkTriage, handleBulkAssign };\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationListEvents } from '../../hooks/useNatsEvents';\nimport {\n useEscalations,\n useEscalationTypes,\n useClaimEscalation,\n useSetEscalationPriority,\n useBulkClaimEscalations,\n useBulkAssignEscalations,\n useBulkEscalateToRole,\n useBulkTriageEscalations,\n} from '../../api/escalations';\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 { Modal } from '../../components/common/modal/Modal';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { BulkActionBar } from '../../components/common/modal/BulkActionBar';\nimport { BulkAssignModal } from '../../components/common/modal/BulkAssignModal';\nimport { BulkTriageModal } from '../../components/common/modal/BulkTriageModal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport { useClaimDurations } from '../../hooks/useClaimDurations';\nimport { Lock } from 'lucide-react';\nimport { ESCALATION_COLUMNS, EscalationFilterBar } from './escalation-columns';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport { RefreshButton } from '../../components/common/data/RefreshButton';\nimport { createBulkHandlers } from './helpers';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { user, isSuperAdmin } = useAuth();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available' },\n });\n const claimDurations = useClaimDurations();\n const [claimTarget, setClaimTarget] = useState<LTEscalationRecord | null>(null);\n const [claimDuration, setClaimDuration] = useState('30');\n const [customClaimMinutes, setCustomClaimMinutes] = useState(0);\n const onCustomClaimChange = useCallback((m: number) => setCustomClaimMinutes(m), []);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [triageModalOpen, setTriageModalOpen] = useState(false);\n const [assignModalOpen, setAssignModalOpen] = useState(false);\n\n const claim = useClaimEscalation();\n const setPriority = useSetEscalationPriority();\n const bulkClaim = useBulkClaimEscalations();\n const bulkAssign = useBulkAssignEscalations();\n const bulkEscalate = useBulkEscalateToRole();\n const bulkTriage = useBulkTriageEscalations();\n const { data: rolesData } = useRoles();\n const { data: typesData } = useEscalationTypes();\n\n // Clear selections on filter/page changes\n useEffect(() => {\n setSelectedIds(new Set());\n }, [filters.role, filters.type, filters.priority, filters.status, pagination.page, pagination.pageSize]);\n\n // Map the UI status filter to the API status parameter\n const statusFilter = filters.status || '';\n const apiStatus = statusFilter === 'available' ? 'pending'\n : statusFilter === 'claimed' ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : undefined; // '' (All) → no filter\n\n const { data, isLoading, error: queryError, refetch, isFetching } = useEscalations({\n status: apiStatus,\n role: filters.role || undefined,\n type: filters.type || undefined,\n priority: filters.priority ? parseInt(filters.priority) : undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || undefined,\n order: sort.sort_by ? sort.order : undefined,\n });\n\n // Client-side filter for available/claimed based on claim expiry\n const now = new Date();\n const rawEscalations = data?.escalations ?? [];\n const escalations = statusFilter === 'available'\n ? rawEscalations.filter((e) => !e.assigned_to || !e.assigned_until || new Date(e.assigned_until) <= now)\n : statusFilter === 'claimed'\n ? rawEscalations.filter((e) => e.assigned_to && e.assigned_until && new Date(e.assigned_until) > now)\n : rawEscalations;\n const total = statusFilter === 'available' || statusFilter === 'claimed'\n ? escalations.length\n : data?.total ?? 0;\n const canBulkManage = isSuperAdmin || user?.roles.some((r) => r.type === 'admin');\n\n const selectedRoles = useMemo(() => {\n const roles = new Set<string>();\n for (const esc of escalations) {\n if (selectedIds.has(esc.id)) roles.add(esc.role);\n }\n return [...roles];\n }, [escalations, selectedIds]);\n\n const clearSelection = useCallback(() => setSelectedIds(new Set()), []);\n\n const handleClaim = () => {\n if (!claimTarget) return;\n const minutes = claimDuration === 'custom' ? customClaimMinutes : parseInt(claimDuration);\n if (!minutes || minutes <= 0) return;\n claim.mutate(\n { id: claimTarget.id, durationMinutes: minutes },\n {\n onSuccess: () => {\n setClaimTarget(null);\n navigate(`/escalations/detail/${claimTarget.id}`);\n },\n },\n );\n };\n\n const {\n handleSetPriority,\n handleBulkClaim,\n handleBulkEscalate,\n handleBulkTriage,\n handleBulkAssign,\n } = createBulkHandlers({\n selectedIds,\n clearSelection,\n setPriority,\n bulkClaim,\n bulkEscalate,\n bulkTriage,\n bulkAssign,\n closeTriageModal: () => setTriageModalOpen(false),\n closeAssignModal: () => setAssignModalOpen(false),\n });\n\n const toggleSelect = (id: string) => {\n const next = new Set(selectedIds);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n setSelectedIds(next);\n };\n\n const toggleAll = () => {\n if (selectedIds.size === escalations.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(escalations.map((e) => e.id)));\n }\n };\n\n const columns: Column<LTEscalationRecord>[] = [\n canBulkManage ? {\n key: 'select',\n label: (\n <input\n type=\"checkbox\"\n checked={escalations.length > 0 && selectedIds.size === escalations.length}\n onChange={toggleAll}\n className=\"rounded\"\n />\n ) as any,\n render: (row: LTEscalationRecord) => (\n <input\n type=\"checkbox\"\n checked={selectedIds.has(row.id)}\n onChange={(e) => {\n e.stopPropagation();\n toggleSelect(row.id);\n }}\n onClick={(e) => e.stopPropagation()}\n className=\"rounded\"\n />\n ),\n className: 'w-10',\n } : {\n key: 'spacer',\n label: '',\n render: () => null,\n className: 'w-10',\n },\n ...ESCALATION_COLUMNS,\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Lock}\n title=\"Claim escalation\"\n onClick={() => setClaimTarget(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"All Escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={<RefreshButton onClick={() => refetch()} isFetching={isFetching} />}\n />\n\n {selectedIds.size > 0 && (\n <BulkActionBar\n selectedCount={selectedIds.size}\n onClearSelection={() => setSelectedIds(new Set())}\n onSetPriority={handleSetPriority}\n onClaim={handleBulkClaim}\n onAssign={() => setAssignModalOpen(true)}\n onEscalate={handleBulkEscalate}\n onTriage={() => setTriageModalOpen(true)}\n isPriorityPending={setPriority.isPending}\n isClaimPending={bulkClaim.isPending}\n isAssignPending={bulkAssign.isPending}\n isEscalatePending={bulkEscalate.isPending}\n isTriagePending={bulkTriage.isPending}\n availableRoles={rolesData?.roles ?? []}\n />\n )}\n\n {queryError && (\n <div className=\"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error\">\n {(queryError as Error).message === 'Session expired'\n ? 'Your session has expired. Please log in again.'\n : `Failed to load escalations: ${(queryError as Error).message}`}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={escalations}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/escalations/detail/${row.id}`, { state: { from: '/escalations/available' } })}\n isLoading={isLoading}\n emptyMessage={queryError ? 'Unable to load data' : 'No available escalations'}\n sort={sort}\n onSort={setSort}\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 <Modal\n open={!!claimTarget}\n onClose={() => setClaimTarget(null)}\n title=\"Claim Escalation\"\n >\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Claim <span className=\"font-medium text-text-primary\">{claimTarget?.type}</span> for:\n </p>\n <select\n value={claimDuration}\n onChange={(e) => { setClaimDuration(e.target.value); setCustomClaimMinutes(0); }}\n className=\"select w-full text-sm\"\n >\n {claimDurations.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n <option value=\"custom\">Other...</option>\n </select>\n {claimDuration === 'custom' && (\n <CustomDurationPicker onChange={onCustomClaimChange} autoFocus />\n )}\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={() => setClaimTarget(null)} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleClaim}\n className=\"btn-primary text-xs\"\n disabled={claim.isPending}\n >\n {claim.isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n\n <BulkTriageModal\n open={triageModalOpen}\n onClose={() => setTriageModalOpen(false)}\n selectedCount={selectedIds.size}\n onSubmit={handleBulkTriage}\n isPending={bulkTriage.isPending}\n />\n\n <BulkAssignModal\n open={assignModalOpen}\n onClose={() => setAssignModalOpen(false)}\n selectedCount={selectedIds.size}\n selectedRoles={selectedRoles}\n onSubmit={handleBulkAssign}\n isPending={bulkAssign.isPending}\n />\n </div>\n );\n}\n"],"names":["anyPending","props","BulkActionBar","disabled","claimDurations","useClaimDurations","jsxDEV","e","PRIORITY_OPTIONS","opt","role","BulkAssignModal","open","onClose","selectedCount","selectedRoles","onSubmit","isPending","isSuperAdmin","useAuth","step","setStep","useState","selectedUser","setSelectedUser","search","setSearch","duration","setDuration","customMinutes","setCustomMinutes","onCustomChange","useCallback","m","roleFilter","usersData","usersLoading","useUsers","filteredUsers","useMemo","users","q","u","_a","_b","handleClose","handleSelectUser","user","handleBack","handleSubmit","minutes","Modal","Fragment","CustomDurationPicker","BulkTriageModal","hint","setHint","bulkHandler","mutation","clearSelection","afterSuccess","variables","createBulkHandlers","deps","ids","priority","durationMinutes","targetRole","targetUserId","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","claimTarget","setClaimTarget","claimDuration","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","onCustomClaimChange","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","apiStatus","data","isLoading","queryError","refetch","isFetching","useEscalations","now","rawEscalations","escalations","total","canBulkManage","r","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","RefreshButton","DataTable","StickyPagination"],"mappings":"soCAmBA,MAAMA,GAAcC,GAClBA,EAAM,mBAAqBA,EAAM,gBAAkBA,EAAM,iBAAmBA,EAAM,mBAAqBA,EAAM,gBAExG,SAASC,GAAcD,EAA2B,CACvD,MAAME,EAAWH,GAAWC,CAAK,EAC3BG,EAAiBC,EAAA,EAEvB,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kGACb,SAAA,CAAAA,EAAAA,OAAC,OAAA,CAAK,UAAU,kCACb,SAAA,CAAAL,EAAM,cAAc,WAAA,CAAA,EADvB,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAEAK,EAAAA,OAAC,MAAA,CAAI,UAAU,4BAAA,EAAf,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4C,EAG5CA,EAAAA,OAAC,SAAA,CACC,SAAWC,GAAM,CACVA,EAAE,OAAO,QACdN,EAAM,cAAc,SAASM,EAAE,OAAO,KAAK,CAAkB,EAC7DA,EAAE,OAAO,MAAQ,GACnB,EACA,SAAAJ,EACA,UAAU,wBACV,aAAa,GAEb,SAAA,CAAAG,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAG,SAAQ,GAAC,SAAA,eAA1B,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAqC,EACpCE,GAAiB,IAAKC,GACrBH,EAAAA,OAAC,SAAA,CAAuB,MAAOG,EAAI,MAAQ,SAAAA,EAAI,KAAA,EAAlCA,EAAI,MAAjB,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,CACtD,CAAA,CAAA,EAbH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAiBAH,EAAAA,OAAC,SAAA,CACC,SAAWC,GAAM,CACVA,EAAE,OAAO,QACdN,EAAM,QAAQ,SAASM,EAAE,OAAO,KAAK,CAAC,EACtCA,EAAE,OAAO,MAAQ,GACnB,EACA,SAAAJ,EACA,UAAU,wBACV,aAAa,GAEb,SAAA,CAAAG,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAG,SAAQ,GAAC,SAAA,gBAA1B,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsC,EACrCF,EAAe,IAAKK,GACnBH,EAAAA,OAAC,SAAA,CAAuB,MAAOG,EAAI,MAAQ,SAAAA,EAAI,KAAA,EAAlCA,EAAI,MAAjB,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAqD,CACtD,CAAA,CAAA,EAbH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAiBAH,EAAAA,OAAC,SAAA,CACC,QAASL,EAAM,SACf,SAAAE,EACA,UAAU,+BAET,SAAAF,EAAM,gBAAkB,eAAiB,cAAA,EAL5C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EASCA,EAAM,eAAe,OAAS,GAC7BK,EAAAA,OAAC,SAAA,CACC,SAAWC,GAAM,CACVA,EAAE,OAAO,QACdN,EAAM,WAAWM,EAAE,OAAO,KAAK,EAC/BA,EAAE,OAAO,MAAQ,GACnB,EACA,SAAAJ,EACA,UAAU,wBACV,aAAa,GAEb,SAAA,CAAAG,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAG,SAAQ,GAAC,SAAA,kBAA1B,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwC,EACvCL,EAAM,eAAe,IAAKS,YACxB,SAAA,CAAkB,MAAOA,EAAO,SAAAA,CAAA,EAApBA,EAAb,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsC,CACvC,CAAA,CAAA,EAbH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAkBFJ,EAAAA,OAAC,SAAA,CACC,QAASL,EAAM,SACf,SAAAE,EACA,UAAU,+BAET,SAAAF,EAAM,gBAAkB,cAAgB,QAAA,EAL3C,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAQAK,EAAAA,OAAC,MAAA,CAAI,UAAU,QAAA,EAAf,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAwB,EAGxBA,EAAAA,OAAC,SAAA,CACC,QAASL,EAAM,iBACf,UAAU,uEACX,SAAA,OAAA,EAHD,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAOCE,GACCG,EAAAA,OAAC,OAAA,CAAK,UAAU,2CAA2C,SAAA,eAAA,EAA3D,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAwE,CAAA,CAAA,EAzF5E,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA2FA,CAEJ,CCtGO,SAASK,GAAgB,CAC9B,KAAAC,EACA,QAAAC,EACA,cAAAC,EACA,cAAAC,EACA,SAAAC,EACA,UAAAC,CACF,EAAyB,CACvB,KAAM,CAAE,aAAAC,CAAA,EAAiBC,EAAA,EACnBf,EAAiBC,EAAA,EACjB,CAACe,EAAMC,CAAO,EAAIC,EAAAA,SAA8B,MAAM,EACtD,CAACC,EAAcC,CAAe,EAAIF,EAAAA,SAA8B,IAAI,EACpE,CAACG,EAAQC,CAAS,EAAIJ,EAAAA,SAAS,EAAE,EACjC,CAACK,EAAUC,CAAW,EAAIN,EAAAA,SAAS,IAAI,EACvC,CAACO,EAAeC,CAAgB,EAAIR,EAAAA,SAAS,CAAC,EAC9CS,EAAiBC,EAAAA,YAAaC,GAAcH,EAAiBG,CAAC,EAAG,EAAE,EAGnEC,EACJ,CAAChB,GAAgBH,EAAc,SAAW,EAAIA,EAAc,CAAC,EAAI,OAE7D,CAAE,KAAMoB,EAAW,UAAWC,CAAA,EAAiBC,GAAS,CAC5D,KAAMH,EACN,OAAQ,SACR,MAAO,GAAA,CACR,EAEKI,EAAgBC,EAAAA,QAAQ,IAAM,CAClC,MAAMC,GAAQL,GAAA,YAAAA,EAAW,QAAS,CAAA,EAClC,GAAI,CAACV,EAAO,KAAA,EAAQ,OAAOe,EAC3B,MAAMC,EAAIhB,EAAO,YAAA,EACjB,OAAOe,EAAM,OACVE,GAAA,SACC,QAAAC,EAAAD,EAAE,eAAF,YAAAC,EAAgB,cAAc,SAASF,OACvCG,EAAAF,EAAE,QAAF,YAAAE,EAAS,cAAc,SAASH,IAAC,CAEvC,EAAG,CAACN,GAAA,YAAAA,EAAW,MAAOV,CAAM,CAAC,EAEvBoB,EAAc,IAAM,CACxBxB,EAAQ,MAAM,EACdG,EAAgB,IAAI,EACpBE,EAAU,EAAE,EACZE,EAAY,IAAI,EAChBE,EAAiB,CAAC,EAClBjB,EAAA,CACF,EAEMiC,EAAoBC,GAAuB,CAC/CvB,EAAgBuB,CAAI,EACpB1B,EAAQ,UAAU,CACpB,EAEM2B,EAAa,IAAM,CACvB3B,EAAQ,MAAM,CAChB,EAEM4B,EAAe,IAAM,CACzB,GAAI,CAAC1B,EAAc,OACnB,MAAM2B,EAAUvB,IAAa,SAAWE,EAAgB,SAASF,CAAQ,EACrE,CAACuB,GAAWA,GAAW,GAC3BlC,EAASO,EAAa,GAAI2B,CAAO,CACnC,EAEA,OACE5C,EAAAA,OAAC6C,EAAA,CAAM,KAAAvC,EAAY,QAASiC,EAAa,MAAM,qBAC7C,SAAAvC,EAAAA,OAAC,MAAA,CAAI,UAAU,YACZ,SAAA,CAAAc,IAAS,QACRd,EAAAA,OAAA8C,EAAAA,SAAA,CACE,SAAA,CAAA9C,EAAAA,OAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,CAAA,0BACjB,IACxBA,SAAC,OAAA,CAAK,UAAU,gCACb,SAAAQ,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EAAQ,IAAI,mBAAA,CAAA,EAJd,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAMA,EAEAR,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOmB,EACP,SAAWlB,GAAMmB,EAAUnB,EAAE,OAAO,KAAK,EACzC,YAAY,6BACZ,UAAU,uBACV,UAAS,EAAA,EANX,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EASAD,EAAAA,OAAC,MAAA,CAAI,UAAU,kGACZ,SAAA,CAAA8B,GACC9B,EAAAA,OAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,kBAAA,EAA9C,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EAED,CAAC8B,GAAgBE,EAAc,SAAW,GACzChC,EAAAA,OAAC,IAAA,CAAE,UAAU,iCAAiC,SAAA,gBAAA,EAA9C,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EAEDgC,EAAc,IAAKS,GAClBzC,EAAAA,OAAC,SAAA,CAEC,QAAS,IAAMwC,EAAiBC,CAAI,EACpC,UAAU,sEAEV,SAAA,CAAAzC,EAAAA,OAAC,KAAE,UAAU,wCACV,SAAAyC,EAAK,cAAgBA,EAAK,aAD7B,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACCA,EAAK,OACJzC,SAAC,KAAE,UAAU,iCACV,WAAK,OADR,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAVGyC,EAAK,GADZ,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAcD,CAAA,CAAA,EA1BH,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IA2BA,EAEAzC,EAAAA,OAAC,MAAA,CAAI,UAAU,wBACb,SAAAA,EAAAA,OAAC,UAAO,QAASuC,EAAa,UAAU,wBAAwB,SAAA,QAAA,EAAhE,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAIA,CAAA,CAAA,EAnDF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAoDA,EAGDzB,IAAS,YAAcG,GACtBjB,EAAAA,OAAA8C,EAAAA,SAAA,CACE,SAAA,CAAA9C,EAAAA,OAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,CAAA,YAC/B,aACT,OAAA,CAAK,UAAU,gCACb,SAAAiB,EAAa,cAAgBA,EAAa,aAD7C,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EAAQ,IAAI,MAAA,CAAA,EAJd,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAMA,EAEAjB,EAAAA,OAAC,SAAA,CACC,MAAOqB,EACP,SAAWpB,GAAM,CAAEqB,EAAYrB,EAAE,OAAO,KAAK,EAAGuB,EAAiB,CAAC,CAAG,EACrE,UAAU,wBAET,SAAA,CAAA1B,EAAe,IAAKK,GACnBH,EAAAA,OAAC,SAAA,CAAuB,MAAOG,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,MAAjB,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CACD,EACDH,SAAC,SAAA,CAAO,MAAM,SAAS,SAAA,UAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA+B,CAAA,CAAA,EAVjC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAYCqB,IAAa,UACZrB,SAAC+C,GAAqB,SAAUtB,EAAgB,UAAS,IAAzD,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA0D,EAG5DzB,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAAS0C,EAAY,UAAU,wBAAwB,SAAA,QAA/D,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACA1C,EAAAA,OAAC,SAAA,CACC,QAAS2C,EACT,SAAUhC,EACV,UAAU,sBAET,WAAY,eAAiB,QAAA,EALhC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAWA,CAAA,CAAA,EApCF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAqCA,CAAA,CAAA,EA/FJ,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiGA,CAAA,EAlGF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAmGA,CAEJ,CC5KO,SAASqC,GAAgB,CAC9B,KAAA1C,EACA,QAAAC,EACA,cAAAC,EACA,SAAAE,EACA,UAAAC,CACF,EAAyB,CACvB,KAAM,CAACsC,EAAMC,CAAO,EAAIlC,EAAAA,SAAS,EAAE,EAE7B2B,EAAe,IAAM,CACzBjC,EAASuC,GAAQ,MAAS,CAC5B,EAEA,OACEjD,EAAAA,OAAC6C,GAAM,KAAAvC,EAAY,QAAAC,EAAkB,MAAM,uBACzC,SAAAP,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,CAAA,UAClCA,SAAC,OAAA,CAAK,UAAU,gCAAiC,SAAAQ,CAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+D,EAAO,kFAAA,CAAA,EAD/E,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,WAEC,MAAA,CACC,SAAA,CAAAR,EAAAA,OAAC,QAAA,CAAM,UAAU,qDAAqD,SAAA,CAAA,eACxDA,SAAC,OAAA,CAAK,UAAU,qBAAqB,SAAA,YAAA,EAArC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAAA,CAAA,EAD7D,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAA,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOiD,EACP,SAAWhD,GAAMiD,EAAQjD,EAAE,OAAO,KAAK,EACvC,YAAY,0BACZ,UAAU,gCAAA,EALZ,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EAOAD,SAAC,IAAA,CAAE,UAAU,sCAAsC,SAAA,yDAAA,EAAnD,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,EAEAA,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAASO,EAAS,UAAU,wBAAwB,SAAA,UAA5D,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAP,EAAAA,OAAC,SAAA,CACC,QAAS2C,EACT,SAAUhC,EACV,UAAU,sBAET,WAAY,gBAAkB,mBAAA,EALjC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAWA,CAAA,CAAA,EAjCF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAkCA,CAAA,EAnCF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAoCA,CAEJ,CC1DA,SAASwC,EACPC,EACAC,EACAC,EACA,CACA,OAAQC,GAA0B,CAChCH,EAAS,OAAOG,EAAW,CACzB,UAAW,IAAM,CACfF,EAAA,EACAC,GAAA,MAAAA,GACF,CAAA,CACD,CACH,CACF,CAEO,SAASE,GAAmBC,EAUhC,CACD,MAAMC,EAAM,IAAM,CAAC,GAAGD,EAAK,WAAW,EAuCtC,MAAO,CAAE,kBArCkBE,GAA4B,CACrDR,EACEM,EAAK,YACLA,EAAK,cAAA,EACL,CAAE,IAAKC,EAAA,EAAO,SAAAC,EAAU,CAC5B,EAgC4B,gBA9BHC,GAA4B,CACnDT,EACEM,EAAK,UACLA,EAAK,cAAA,EACL,CAAE,IAAKC,EAAA,EAAO,gBAAAE,EAAiB,CACnC,EAyB6C,mBAvBjBC,GAAuB,CACjDV,EACEM,EAAK,aACLA,EAAK,cAAA,EACL,CAAE,IAAKC,EAAA,EAAO,WAAAG,EAAY,CAC9B,EAkBiE,iBAhBvCZ,GAAkB,CAC1CE,EACEM,EAAK,WACLA,EAAK,eACLA,EAAK,gBAAA,EACL,CAAE,IAAKC,EAAA,EAAO,KAAAT,EAAM,CACxB,EAUmF,iBAR1D,CAACa,EAAsBF,IAA4B,CAC1ET,EACEM,EAAK,WACLA,EAAK,eACLA,EAAK,gBAAA,EACL,CAAE,IAAKC,IAAO,aAAAI,EAAc,gBAAAF,EAAiB,CACjD,CAEmF,CACrF,CCvCO,SAASG,IAA2B,CACzCC,GAAA,EACA,MAAMC,EAAWC,GAAA,EACX,CAAE,KAAAzB,EAAM,aAAA7B,CAAA,EAAiBC,EAAA,EACzB,CAAE,QAAAsD,EAAS,UAAAC,EAAW,WAAAC,EAAY,KAAAC,EAAM,QAAAC,CAAA,EAAYC,GAAgB,CACxE,QAAS,CAAE,KAAM,GAAI,KAAM,GAAI,SAAU,GAAI,OAAQ,WAAA,CAAY,CAClE,EACK1E,EAAiBC,EAAA,EACjB,CAAC0E,EAAaC,CAAc,EAAI1D,EAAAA,SAAoC,IAAI,EACxE,CAAC2D,EAAeC,CAAgB,EAAI5D,EAAAA,SAAS,IAAI,EACjD,CAAC6D,EAAoBC,CAAqB,EAAI9D,EAAAA,SAAS,CAAC,EACxD+D,EAAsBrD,EAAAA,YAAaC,GAAcmD,EAAsBnD,CAAC,EAAG,EAAE,EAC7E,CAACqD,EAAaC,CAAc,EAAIjE,EAAAA,SAAsB,IAAI,GAAK,EAC/D,CAACkE,EAAiBC,CAAkB,EAAInE,EAAAA,SAAS,EAAK,EACtD,CAACoE,EAAiBC,CAAkB,EAAIrE,EAAAA,SAAS,EAAK,EAEtDsE,EAAQC,GAAA,EACRC,EAAcC,GAAA,EACdC,EAAYC,GAAA,EACZC,EAAaC,GAAA,EACbC,EAAeC,GAAA,EACfC,EAAaC,GAAA,EACb,CAAE,KAAMC,CAAA,EAAcC,GAAA,EACtB,CAAE,KAAMC,CAAA,EAAcC,GAAA,EAG5BC,EAAAA,UAAU,IAAM,CACdrB,EAAe,IAAI,GAAK,CAC1B,EAAG,CAACd,EAAQ,KAAMA,EAAQ,KAAMA,EAAQ,SAAUA,EAAQ,OAAQE,EAAW,KAAMA,EAAW,QAAQ,CAAC,EAGvG,MAAMkC,EAAepC,EAAQ,QAAU,GACjCqC,EAAYD,IAAiB,aAC/BA,IAAiB,UAD4B,UAE7CA,IAAiB,WAAa,WAC9B,OAEE,CAAE,KAAAE,EAAM,UAAAC,EAAW,MAAOC,EAAY,QAAAC,EAAS,WAAAC,CAAA,EAAeC,GAAe,CACjF,OAAQN,EACR,KAAMrC,EAAQ,MAAQ,OACtB,KAAMA,EAAQ,MAAQ,OACtB,SAAUA,EAAQ,SAAW,SAASA,EAAQ,QAAQ,EAAI,OAC1D,MAAOE,EAAW,SAClB,OAAQA,EAAW,OACnB,QAASC,EAAK,SAAW,OACzB,MAAOA,EAAK,QAAUA,EAAK,MAAQ,MAAA,CACpC,EAGKyC,MAAU,KACVC,GAAiBP,GAAA,YAAAA,EAAM,cAAe,CAAA,EACtCQ,EAAcV,IAAiB,YACjCS,EAAe,OAAQ/G,GAAM,CAACA,EAAE,aAAe,CAACA,EAAE,gBAAkB,IAAI,KAAKA,EAAE,cAAc,GAAK8G,CAAG,EACrGR,IAAiB,UACjBS,EAAe,OAAQ/G,GAAMA,EAAE,aAAeA,EAAE,gBAAkB,IAAI,KAAKA,EAAE,cAAc,EAAI8G,CAAG,EAClGC,EACEE,EAAQX,IAAiB,aAAeA,IAAiB,UAC3DU,EAAY,QACZR,GAAA,YAAAA,EAAM,QAAS,EACbU,EAAgBvG,IAAgB6B,GAAA,YAAAA,EAAM,MAAM,KAAM2E,GAAMA,EAAE,OAAS,UAEnE3G,EAAgBwB,EAAAA,QAAQ,IAAM,CAClC,MAAMoF,MAAY,IAClB,UAAWC,KAAOL,EACZjC,EAAY,IAAIsC,EAAI,EAAE,GAAGD,EAAM,IAAIC,EAAI,IAAI,EAEjD,MAAO,CAAC,GAAGD,CAAK,CAClB,EAAG,CAACJ,EAAajC,CAAW,CAAC,EAEvB3B,EAAiB3B,EAAAA,YAAY,IAAMuD,MAAmB,GAAK,EAAG,EAAE,EAEhEsC,EAAc,IAAM,CACxB,GAAI,CAAC9C,EAAa,OAClB,MAAM7B,EAAU+B,IAAkB,SAAWE,EAAqB,SAASF,CAAa,EACpF,CAAC/B,GAAWA,GAAW,GAC3B0C,EAAM,OACJ,CAAE,GAAIb,EAAY,GAAI,gBAAiB7B,CAAA,EACvC,CACE,UAAW,IAAM,CACf8B,EAAe,IAAI,EACnBT,EAAS,uBAAuBQ,EAAY,EAAE,EAAE,CAClD,CAAA,CACF,CAEJ,EAEM,CACJ,kBAAA+C,GACA,gBAAAC,GACA,mBAAAC,GACA,iBAAAC,GACA,iBAAAC,EAAA,EACEpE,GAAmB,CACrB,YAAAwB,EACA,eAAA3B,EACA,YAAAmC,EACA,UAAAE,EACA,aAAAI,EACA,WAAAE,EACA,WAAAJ,EACA,iBAAkB,IAAMT,EAAmB,EAAK,EAChD,iBAAkB,IAAME,EAAmB,EAAK,CAAA,CACjD,EAEKwC,GAAgBC,GAAe,CACnC,MAAMC,EAAO,IAAI,IAAI/C,CAAW,EAC5B+C,EAAK,IAAID,CAAE,EAAGC,EAAK,OAAOD,CAAE,EAC3BC,EAAK,IAAID,CAAE,EAChB7C,EAAe8C,CAAI,CACrB,EAEMC,GAAY,IAAM,CAClBhD,EAAY,OAASiC,EAAY,OACnChC,EAAe,IAAI,GAAK,EAExBA,EAAe,IAAI,IAAIgC,EAAY,IAAKhH,GAAMA,EAAE,EAAE,CAAC,CAAC,CAExD,EAEMgI,GAAwC,CAC5Cd,EAAgB,CACd,IAAK,SACL,MACEnH,EAAAA,OAAC,QAAA,CACC,KAAK,WACL,QAASiH,EAAY,OAAS,GAAKjC,EAAY,OAASiC,EAAY,OACpE,SAAUe,GACV,UAAU,SAAA,EAJZ,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAOF,OAASE,GACPlI,EAAAA,OAAC,QAAA,CACC,KAAK,WACL,QAASgF,EAAY,IAAIkD,EAAI,EAAE,EAC/B,SAAWjI,GAAM,CACfA,EAAE,gBAAA,EACF4H,GAAaK,EAAI,EAAE,CACrB,EACA,QAAUjI,GAAMA,EAAE,gBAAA,EAClB,UAAU,SAAA,EARZ,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAWF,UAAW,MAAA,EACT,CACF,IAAK,SACL,MAAO,GACP,OAAQ,IAAM,KACd,UAAW,MAAA,EAEb,GAAGkI,GACH,CACE,IAAK,UACL,MAAO,GACP,OAASD,GACPlI,EAAAA,OAACoI,GAAA,CACC,SAAApI,EAAAA,OAACqI,GAAA,CACC,KAAMC,GACN,MAAM,mBACN,QAAS,IAAM5D,EAAewD,CAAG,CAAA,EAHnC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAIA,EALF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAMA,EAEF,UAAW,iBAAA,CACb,EAGF,gBACG,MAAA,CACC,SAAA,CAAAlI,EAAAA,OAACuI,GAAA,CAAW,MAAM,iBAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAoC,EAEpCvI,EAAAA,OAACwI,GAAA,CACC,QAAArE,EACA,UAAAC,EACA,OAAO8B,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,OAAOE,GAAA,YAAAA,EAAW,QAAS,CAAA,EAC3B,WAAU,GACV,QAASpG,EAAAA,OAACyI,GAAA,CAAc,QAAS,IAAM7B,EAAA,EAAW,WAAAC,CAAA,EAAzC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAiE,CAAA,EAN5E,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EASC7B,EAAY,KAAO,GAClBhF,EAAAA,OAACJ,GAAA,CACC,cAAeoF,EAAY,KAC3B,iBAAkB,IAAMC,EAAe,IAAI,GAAK,EAChD,cAAeuC,GACf,QAASC,GACT,SAAU,IAAMpC,EAAmB,EAAI,EACvC,WAAYqC,GACZ,SAAU,IAAMvC,EAAmB,EAAI,EACvC,kBAAmBK,EAAY,UAC/B,eAAgBE,EAAU,UAC1B,gBAAiBE,EAAW,UAC5B,kBAAmBE,EAAa,UAChC,gBAAiBE,EAAW,UAC5B,gBAAgBE,GAAA,YAAAA,EAAW,QAAS,CAAA,CAAC,EAbvC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAiBDS,GACC3G,EAAAA,OAAC,MAAA,CAAI,UAAU,uGACX,SAAA2G,EAAqB,UAAY,kBAC/B,iDACA,+BAAgCA,EAAqB,OAAO,EAAA,EAHlE,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAIA,EAGF3G,EAAAA,OAAC0I,GAAA,CACC,QAAAT,GACA,KAAMhB,EACN,MAAQiB,GAAQA,EAAI,GACpB,WAAaA,GAAQjE,EAAS,uBAAuBiE,EAAI,EAAE,GAAI,CAAE,MAAO,CAAE,KAAM,wBAAA,EAA4B,EAC5G,UAAAxB,EACA,aAAcC,EAAa,sBAAwB,2BACnD,KAAArC,EACA,OAAQC,CAAA,EARV,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAWAvE,EAAAA,OAAC2I,GAAA,CACC,KAAMtE,EAAW,KACjB,WAAYA,EAAW,WAAW6C,CAAK,EACvC,aAAc7C,EAAW,QACzB,MAAA6C,EACA,SAAU7C,EAAW,SACrB,iBAAkBA,EAAW,WAAA,EAN/B,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EASArE,EAAAA,OAAC6C,EAAA,CACC,KAAM,CAAC,CAAC4B,EACR,QAAS,IAAMC,EAAe,IAAI,EAClC,MAAM,mBAEN,SAAA1E,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,EAAAA,OAAC,IAAA,CAAE,UAAU,8BAA8B,SAAA,CAAA,SACnCA,SAAC,OAAA,CAAK,UAAU,gCAAiC,0BAAa,IAAA,EAA9D,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAmE,EAAO,OAAA,CAAA,EADlF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACAA,EAAAA,OAAC,SAAA,CACC,MAAO2E,EACP,SAAW1E,GAAM,CAAE2E,EAAiB3E,EAAE,OAAO,KAAK,EAAG6E,EAAsB,CAAC,CAAG,EAC/E,UAAU,wBAET,SAAA,CAAAhF,EAAe,IAAKK,GACnBH,EAAAA,OAAC,SAAA,CAAuB,MAAOG,EAAI,MAAQ,SAAAA,EAAI,KAAA,EAAlCA,EAAI,MAAjB,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAqD,CACtD,EACDH,SAAC,SAAA,CAAO,MAAM,SAAS,SAAA,UAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA+B,CAAA,CAAA,EARjC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,EAUC2E,IAAkB,UACjB3E,SAAC+C,GAAqB,SAAUgC,EAAqB,UAAS,IAA9D,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA+D,EAEjE/E,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAAS,IAAM0E,EAAe,IAAI,EAAG,UAAU,wBAAwB,SAAA,QAAA,EAA/E,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACA1E,EAAAA,OAAC,SAAA,CACC,QAASuH,EACT,UAAU,sBACV,SAAUjC,EAAM,UAEf,SAAAA,EAAM,UAAY,cAAgB,OAAA,EALrC,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAWA,CAAA,CAAA,EA5BF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA6BA,CAAA,EAlCF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAqCAtF,EAAAA,OAACgD,GAAA,CACC,KAAMkC,EACN,QAAS,IAAMC,EAAmB,EAAK,EACvC,cAAeH,EAAY,KAC3B,SAAU2C,GACV,UAAW3B,EAAW,SAAA,EALxB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,EAQAhG,EAAAA,OAACK,GAAA,CACC,KAAM+E,EACN,QAAS,IAAMC,EAAmB,EAAK,EACvC,cAAeL,EAAY,KAC3B,cAAAvE,EACA,SAAUmH,GACV,UAAWhC,EAAW,SAAA,EANxB,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,CAOA,CAAA,EA9GF,OAAA,GAAA,CAAA,SAAA,iEAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA+GA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-DSzSoku1.js";import{a as u}from"./vendor-query-DLp59M9_.js";import{u as h}from"./bots-BPiZXf2h.js";import{J as d,X as b,N as p,C as k,s as x}from"./vendor-icons-DCLlGYO9.js";function D({selected:s,onChange:n,placeholder:f}){const{data:m}=h({limit:100}),a=((m==null?void 0:m.bots)??[]).filter(o=>o.status==="active"),[c,t]=u.useState(!1),i=u.useRef(null);u.useEffect(()=>{const o=r=>{i.current&&!i.current.contains(r.target)&&t(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[]);const l=a.find(o=>o.external_id===s),N=f??"Invoking user (default)";return e.jsxDEV("div",{ref:i,className:"relative",children:[e.jsxDEV("button",{type:"button",onClick:()=>t(!c),className:"flex 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:[s&&l?e.jsxDEV("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.jsxDEV(d,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:37,columnNumber:13},this),l.display_name||l.external_id,e.jsxDEV("span",{role:"button",onClick:o=>{o.stopPropagation(),n("")},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsxDEV(b,{className:"w-2.5 h-2.5"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:44,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:39,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:36,columnNumber:11},this):e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-xs text-text-tertiary",children:[e.jsxDEV(p,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:49,columnNumber:13},this),N]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:48,columnNumber:11},this),e.jsxDEV(k,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${c?"rotate-180":""}`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:53,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:30,columnNumber:7},this),c&&e.jsxDEV("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:[e.jsxDEV("button",{type:"button",onClick:()=>{n(""),t(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${s?"text-text-primary hover:bg-surface-sunken":"bg-accent/[0.06] text-accent"}`,children:[e.jsxDEV(p,{className:"w-3 h-3 shrink-0 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:66,columnNumber:13},this),e.jsxDEV("span",{className:"flex-1",children:"Invoking user"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:67,columnNumber:13},this),!s&&e.jsxDEV(x,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:68,columnNumber:27},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:59,columnNumber:11},this),a.length===0?e.jsxDEV("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No bot accounts"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:72,columnNumber:13},this):a.map(o=>{const r=s===o.external_id;return e.jsxDEV("button",{type:"button",onClick:()=>{n(o.external_id),t(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${r?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsxDEV(d,{className:"w-3 h-3 shrink-0 text-accent/60"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:87,columnNumber:19},this),e.jsxDEV("div",{className:"flex-1 min-w-0",children:[e.jsxDEV("span",{children:o.display_name||o.external_id},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:89,columnNumber:21},this),o.display_name&&o.display_name!==o.external_id&&e.jsxDEV("span",{className:"ml-1 text-text-tertiary font-mono",children:o.external_id},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:91,columnNumber:23},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:88,columnNumber:19},this),r&&e.jsxDEV(x,{className:"w-3 h-3 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:94,columnNumber:34},this)]},o.id,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:77,columnNumber:17},this)})]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:57,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/BotPicker.tsx",lineNumber:29,columnNumber:5},this)}export{D as B};
|
|
2
|
+
//# sourceMappingURL=BotPicker-C51nKFEu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotPicker-
|
|
1
|
+
{"version":3,"file":"BotPicker-C51nKFEu.js","sources":["../../src/components/common/form/BotPicker.tsx"],"sourcesContent":["import { useState, useRef, useEffect } from 'react';\nimport { Bot, X, ChevronDown, Check, UserCircle } from 'lucide-react';\nimport { useBots } from '../../../api/bots';\n\ninterface BotPickerProps {\n selected: string;\n onChange: (botExternalId: string) => void;\n placeholder?: string;\n}\n\nexport function BotPicker({ selected, onChange, placeholder }: BotPickerProps) {\n const { data } = useBots({ limit: 100 });\n const bots = (data?.bots ?? []).filter((b) => b.status === 'active');\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const selectedBot = bots.find((b) => b.external_id === selected);\n const placeholderText = placeholder ?? 'Invoking user (default)';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex 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\"\n >\n {selected && selectedBot ? (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]\">\n <Bot className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {selectedBot.display_name || selectedBot.external_id}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); onChange(''); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ) : (\n <span className=\"inline-flex items-center gap-1 text-xs text-text-tertiary\">\n <UserCircle className=\"w-3 h-3 shrink-0\" />\n {placeholderText}\n </span>\n )}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <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\">\n {/* Default: invoking user */}\n <button\n type=\"button\"\n onClick={() => { onChange(''); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n !selected ? 'bg-accent/[0.06] text-accent' : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <UserCircle className=\"w-3 h-3 shrink-0 text-text-tertiary\" />\n <span className=\"flex-1\">Invoking user</span>\n {!selected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n\n {bots.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No bot accounts</p>\n ) : (\n bots.map((bot) => {\n const isSelected = selected === bot.external_id;\n return (\n <button\n key={bot.id}\n type=\"button\"\n onClick={() => { onChange(bot.external_id); setOpen(false); }}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Bot className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <div className=\"flex-1 min-w-0\">\n <span>{bot.display_name || bot.external_id}</span>\n {bot.display_name && bot.display_name !== bot.external_id && (\n <span className=\"ml-1 text-text-tertiary font-mono\">{bot.external_id}</span>\n )}\n </div>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n"],"names":["BotPicker","selected","onChange","placeholder","data","useBots","bots","b","open","setOpen","useState","ref","useRef","useEffect","handler","e","selectedBot","placeholderText","jsxDEV","Bot","X","UserCircle","ChevronDown","Check","bot","isSelected"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,C as i}from"./index-DSzSoku1.js";function m({title:t,sectionKey:s,isCollapsed:o,onToggle:l,contentClassName:a,children:n}){return e.jsxDEV("div",{children:[e.jsxDEV("button",{onClick:()=>l(s),className:"flex items-center gap-3 w-full group/section",children:[e.jsxDEV("svg",{className:`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${o?"":"rotate-90"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:34,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:30,columnNumber:9},this),e.jsxDEV("span",{className:`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${o?"text-text-tertiary":"text-text-secondary"}`,children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:36,columnNumber:9},this),e.jsxDEV("span",{className:"flex-1 border-b border-surface-border"},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:39,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:26,columnNumber:7},this),e.jsxDEV(i,{open:!o,children:e.jsxDEV("div",{className:a??"mt-4 ml-7",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:42,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:41,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/layout/CollapsibleSection.tsx",lineNumber:25,columnNumber:5},this)}export{m as C};
|
|
2
|
+
//# sourceMappingURL=CollapsibleSection-BSyfd8uL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSection-
|
|
1
|
+
{"version":3,"file":"CollapsibleSection-BSyfd8uL.js","sources":["../../src/components/common/layout/CollapsibleSection.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Collapsible } from './Collapsible';\n\n/**\n * Shared collapsible section with chevron toggle and horizontal rule.\n * Used by WorkflowExecutionPage, McpRunDetailPage, and YamlWorkflowDetailPage.\n */\nexport function CollapsibleSection({\n title,\n sectionKey,\n isCollapsed,\n onToggle,\n contentClassName,\n children,\n}: {\n title: string;\n sectionKey: string;\n isCollapsed: boolean;\n onToggle: (key: string) => void;\n /** Optional class override for the content wrapper (default: \"mt-4 ml-7\") */\n contentClassName?: string;\n children: ReactNode;\n}) {\n return (\n <div>\n <button\n onClick={() => onToggle(sectionKey)}\n className=\"flex items-center gap-3 w-full group/section\"\n >\n <svg\n className={`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${!isCollapsed ? 'rotate-90' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n <span className={`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${isCollapsed ? 'text-text-tertiary' : 'text-text-secondary'}`}>\n {title}\n </span>\n <span className=\"flex-1 border-b border-surface-border\" />\n </button>\n <Collapsible open={!isCollapsed}>\n <div className={contentClassName ?? 'mt-4 ml-7'}>{children}</div>\n </Collapsible>\n </div>\n );\n}\n"],"names":["CollapsibleSection","title","sectionKey","isCollapsed","onToggle","contentClassName","children","jsxDEV","Collapsible"],"mappings":"+CAOO,SAASA,EAAmB,CACjC,MAAAC,EACA,WAAAC,EACA,YAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAQG,CACD,gBACG,MAAA,CACC,SAAA,CAAAC,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMH,EAASF,CAAU,EAClC,UAAU,+CAEV,SAAA,CAAAK,EAAAA,OAAC,MAAA,CACC,UAAW,6GAA8GJ,EAA4B,GAAd,WAAgB,GACvJ,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAEnE,kBAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAArD,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoE,CAAA,EAJtE,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAMAI,EAAAA,OAAC,QAAK,UAAW,kFAAkFJ,EAAc,qBAAuB,qBAAqB,GAC1J,SAAAF,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EACAM,EAAAA,OAAC,OAAA,CAAK,UAAU,uCAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAwD,CAAA,CAAA,EAb1D,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAeAA,EAAAA,OAACC,EAAA,CAAY,KAAM,CAACL,EAClB,kBAAC,MAAA,CAAI,UAAWE,GAAoB,YAAc,SAAAC,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2D,CAAA,EAD7D,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,CAAA,EAlBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAmBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-DSzSoku1.js";import{M as r}from"./Modal-CI5RBPOQ.js";function c({open:a,onClose:o,onConfirm:t,title:l,description:n,isPending:m,error:s}){return e.jsxDEV(r,{open:a,onClose:o,title:l,children:e.jsxDEV("div",{className:"space-y-4",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:n},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:26,columnNumber:9},this),s&&e.jsxDEV("p",{className:"text-xs text-status-error",children:s.message},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:27,columnNumber:19},this),e.jsxDEV("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsxDEV("button",{onClick:o,className:"btn-secondary text-xs",children:"Cancel"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:29,columnNumber:11},this),e.jsxDEV("button",{onClick:t,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:m,children:m?"Deleting...":"Delete"},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:32,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:28,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:25,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/modal/ConfirmDeleteModal.tsx",lineNumber:24,columnNumber:5},this)}export{c as C};
|
|
2
|
+
//# sourceMappingURL=ConfirmDeleteModal-CBdhia5T.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDeleteModal-
|
|
1
|
+
{"version":3,"file":"ConfirmDeleteModal-CBdhia5T.js","sources":["../../src/components/common/modal/ConfirmDeleteModal.tsx"],"sourcesContent":["import { Modal } from './Modal';\nimport type { ReactNode } from 'react';\n\ninterface ConfirmDeleteModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n description: ReactNode;\n isPending?: boolean;\n error?: Error | null;\n}\n\nexport function ConfirmDeleteModal({\n open,\n onClose,\n onConfirm,\n title,\n description,\n isPending,\n error,\n}: ConfirmDeleteModalProps) {\n return (\n <Modal open={open} onClose={onClose} title={title}>\n <div className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">{description}</p>\n {error && <p className=\"text-xs text-status-error\">{error.message}</p>}\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={onConfirm}\n className=\"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity\"\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n"],"names":["ConfirmDeleteModal","open","onClose","onConfirm","title","description","isPending","error","jsxDEV","Modal"],"mappings":"gFAaO,SAASA,EAAmB,CACjC,KAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAA4B,CAC1B,OACEC,EAAAA,OAACC,GAAM,KAAAR,EAAY,QAAAC,EAAkB,MAAAE,EACnC,SAAAI,EAAAA,OAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAwD,EACvDE,GAASC,EAAAA,OAAC,IAAA,CAAE,UAAU,4BAA6B,WAAM,SAAhD,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAwD,EAClEA,EAAAA,OAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CAAO,QAASN,EAAS,UAAU,wBAAwB,SAAA,UAA5D,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAM,EAAAA,OAAC,SAAA,CACC,QAASL,EACT,UAAU,gGACV,SAAUG,EAET,WAAY,cAAgB,QAAA,EAL/B,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAVF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAWA,CAAA,CAAA,EAdF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAeA,CAAA,EAhBF,OAAA,GAAA,CAAA,SAAA,oEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-DSzSoku1.js";import{a as c}from"./vendor-query-DLp59M9_.js";import{c as d}from"./vendor-react-Co3Y8ikm.js";function h({label:t,value:a,href:o,external:l}){const[n,i]=c.useState(!1),m=d();if(!a)return null;const r=s=>{s.stopPropagation(),navigator.clipboard.writeText(a),i(!0),setTimeout(()=>i(!1),1500)},p=s=>{s.stopPropagation(),o&&(l?window.open(o,"_blank","noopener,noreferrer"):m(o))};return e.jsxDEV("div",{className:"text-left group relative",children:[e.jsxDEV("span",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:35,columnNumber:7},this),e.jsxDEV("span",{className:"flex items-center gap-1 mt-0.5",children:[e.jsxDEV("button",{onClick:r,title:`Copy ${t}`,className:"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors truncate max-w-[280px]",children:a},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:37,columnNumber:9},this),e.jsxDEV("button",{onClick:r,title:"Copy",className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:`w-3 h-3 transition-colors ${n?"text-status-success":"text-text-tertiary hover:text-text-primary"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:n?e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:47,columnNumber:17},this):e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:48,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:45,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:44,columnNumber:9},this),o&&e.jsxDEV("button",{onClick:p,title:`View ${t}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5",children:e.jsxDEV("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:55,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:54,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:53,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:36,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CopyableId.tsx",lineNumber:34,columnNumber:5},this)}export{h as C};
|
|
2
|
+
//# sourceMappingURL=CopyableId-dGlewBCS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyableId-
|
|
1
|
+
{"version":3,"file":"CopyableId-dGlewBCS.js","sources":["../../src/components/common/display/CopyableId.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\ninterface CopyableIdProps {\n label: string;\n value: string | null | undefined;\n href?: string;\n external?: boolean;\n}\n\nexport function CopyableId({ label, value, href, external }: CopyableIdProps) {\n const [copied, setCopied] = useState(false);\n const navigate = useNavigate();\n if (!value) return null;\n\n const handleCopy = (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const handleNavigate = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) return;\n if (external) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n navigate(href);\n }\n };\n\n return (\n <div className=\"text-left group relative\">\n <span className=\"text-[11px] font-medium text-text-secondary uppercase tracking-wide\">{label}</span>\n <span className=\"flex items-center gap-1 mt-0.5\">\n <button\n onClick={handleCopy}\n title={`Copy ${label}`}\n className=\"text-[12px] font-mono text-text-primary group-hover:text-accent transition-colors truncate max-w-[280px]\"\n >\n {value}\n </button>\n <button onClick={handleCopy} title=\"Copy\" className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className={`w-3 h-3 transition-colors ${copied ? 'text-status-success' : 'text-text-tertiary hover:text-text-primary'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n {copied\n ? <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n : <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3\" />\n }\n </svg>\n </button>\n {href && (\n <button onClick={handleNavigate} title={`View ${label}`} className=\"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5\">\n <svg className=\"w-3 h-3 text-text-tertiary hover:text-accent\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101M10.172 13.828a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1\" />\n </svg>\n </button>\n )}\n </span>\n </div>\n );\n}\n"],"names":["CopyableId","label","value","href","external","copied","setCopied","useState","navigate","useNavigate","handleCopy","e","handleNavigate","jsxDEV"],"mappings":"sIAUO,SAASA,EAAW,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAM,SAAAC,GAA6B,CAC5E,KAAM,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAWC,EAAA,EACjB,GAAI,CAACP,EAAO,OAAO,KAEnB,MAAMQ,EAAcC,GAAwB,CAC1CA,EAAE,gBAAA,EACF,UAAU,UAAU,UAAUT,CAAK,EACnCI,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,IAAI,CACzC,EAEMM,EAAkBD,GAAwB,CAC9CA,EAAE,gBAAA,EACGR,IACDC,EACF,OAAO,KAAKD,EAAM,SAAU,qBAAqB,EAEjDK,EAASL,CAAI,EAEjB,EAEA,OACEU,EAAAA,OAAC,MAAA,CAAI,UAAU,2BACb,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAU,sEAAuE,SAAAZ,CAAA,EAAvF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA6F,EAC7FY,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACd,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,QAASH,EACT,MAAO,QAAQT,CAAK,GACpB,UAAU,2GAET,SAAAC,CAAA,EALH,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAOAW,SAAC,SAAA,CAAO,QAASH,EAAY,MAAM,OAAO,UAAU,sEAClD,SAAAG,EAAAA,OAAC,MAAA,CAAI,UAAW,6BAA6BR,EAAS,sBAAwB,4CAA4C,GAAI,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC9L,SAAAA,EACGQ,EAAAA,OAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsE,WACrE,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA4L,CAAA,EAHlM,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAKA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAOA,EACCV,GACCU,EAAAA,OAAC,SAAA,CAAO,QAASD,EAAgB,MAAO,QAAQX,CAAK,GAAI,UAAU,sEACjE,SAAAY,EAAAA,OAAC,OAAI,UAAU,+CAA+C,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAC/H,SAAAA,SAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,sIAAA,EAArD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA4L,CAAA,EAD9L,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAIA,CAAA,CAAA,EArBJ,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAuBA,CAAA,CAAA,EAzBF,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA0BA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{A as v,B as C,j as e,O as c,E as P}from"./index-DSzSoku1.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{P as E}from"./PageHeader-SMD9qtOO.js";import{T as D}from"./TimeAgo-WuM6xImZ.js";import{C as j}from"./ConfirmDeleteModal-CBdhia5T.js";import{Y as V,C as y,$ as k,i as A}from"./vendor-icons-DCLlGYO9.js";import"./vendor-react-Co3Y8ikm.js";import"./Modal-CI5RBPOQ.js";const d={anthropic:{name:"Anthropic",helpText:'Run "claude setup-token" for an OAuth token, or use an API key from console.anthropic.com.',placeholder:"sk-ant-oat01-... or sk-ant-api03-..."},openai:{name:"OpenAI",helpText:"Create an API key at platform.openai.com/api-keys.",placeholder:"sk-..."}};function U(){var m,p;const{data:r,isLoading:u}=v(),i=C(),[a,l]=n.useState(null),[b,N]=n.useState(!1),[t,g]=n.useState("anthropic"),o=(r==null?void 0:r.connections)??[],x=()=>{a&&i.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},h=s=>`/connect/${s}?state=${encodeURIComponent(P()||"")}`;return e.jsxDEV("div",{children:[e.jsxDEV(E,{title:"Credentials",actions:e.jsxDEV("button",{onClick:()=>N(s=>!s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(V,{className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:57,columnNumber:13},this),"Add Credential"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:53,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:50,columnNumber:7},this),e.jsxDEV("p",{className:"text-sm text-text-secondary mb-6",children:"Manage credentials used by tools when invoked on your behalf. Each credential is encrypted at rest and resolved automatically during tool execution."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:63,columnNumber:7},this),b&&e.jsxDEV("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3",children:[e.jsxDEV("div",{className:"flex items-center gap-3",children:[e.jsxDEV("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:72,columnNumber:13},this),e.jsxDEV("div",{className:"relative",children:[e.jsxDEV("select",{value:t,onChange:s=>g(s.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(d).map(([s,f])=>e.jsxDEV("option",{value:s,children:f.name},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:80,columnNumber:19},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:74,columnNumber:15},this),e.jsxDEV(y,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:83,columnNumber:15},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:73,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:71,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs text-text-tertiary",children:(m=d[t])==null?void 0:m.helpText},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:86,columnNumber:11},this),e.jsxDEV("a",{href:h(t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsxDEV(c,{provider:t,className:"w-3.5 h-3.5"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:93,columnNumber:13},this),"Connect ",(p=d[t])==null?void 0:p.name]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:89,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:70,columnNumber:9},this),u?e.jsxDEV("div",{className:"animate-pulse space-y-3",children:[1,2].map(s=>e.jsxDEV("div",{className:"h-16 bg-surface-sunken rounded"},s,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:103,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:101,columnNumber:9},this):o.length===0?e.jsxDEV("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsxDEV(k,{className:"w-10 h-10 mx-auto mb-3 opacity-40"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:108,columnNumber:11},this),e.jsxDEV("p",{className:"text-sm",children:"No credentials registered."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:109,columnNumber:11},this),e.jsxDEV("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:110,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:107,columnNumber:9},this):e.jsxDEV("div",{className:"space-y-2",children:o.map(s=>e.jsxDEV("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",children:[e.jsxDEV(c,{provider:s.provider,className:"w-6 h-6 shrink-0"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:119,columnNumber:15},this),e.jsxDEV("div",{className:"flex-1 min-w-0",children:[e.jsxDEV("div",{className:"flex items-center gap-2",children:[e.jsxDEV("span",{className:"text-sm text-text-primary font-medium capitalize",children:s.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:123,columnNumber:19},this),s.label!=="default"&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:s.label},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:127,columnNumber:21},this),s.credential_type&&e.jsxDEV("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:s.credential_type},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:132,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:122,columnNumber:17},this),e.jsxDEV("div",{className:"flex items-center gap-3 mt-0.5",children:[s.email&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:s.email},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:139,columnNumber:21},this),s.expires_at&&e.jsxDEV("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsxDEV(D,{date:s.expires_at},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:143,columnNumber:31},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:142,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:137,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:121,columnNumber:15},this),e.jsxDEV("button",{onClick:()=>l({provider:s.provider,label:s.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsxDEV(A,{className:"w-4 h-4"},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:154,columnNumber:17},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:149,columnNumber:15},this)]},`${s.provider}-${s.label}`,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:115,columnNumber:13},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:113,columnNumber:9},this),e.jsxDEV(j,{open:!!a,onClose:()=>l(null),onConfirm:x,title:"Revoke Credential",description:e.jsxDEV(e.Fragment,{children:["Revoke the"," ",e.jsxDEV("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:169,columnNumber:13},this),(a==null?void 0:a.label)!=="default"&&e.jsxDEV(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:173,columnNumber:15},this)," ","credential? Tools will no longer be able to use this credential."]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:167,columnNumber:11},this),isPending:i.isPending,error:i.error},void 0,!1,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:161,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/settings/CredentialsPage.tsx",lineNumber:49,columnNumber:5},this)}export{U as CredentialsPage};
|
|
2
|
+
//# sourceMappingURL=CredentialsPage-CoBNFSAu.js.map
|
package/dashboard/dist/assets/{CredentialsPage-Ikzsot0w.js.map → CredentialsPage-CoBNFSAu.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialsPage-Ikzsot0w.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/connect/${provider}?state=${encodeURIComponent(getToken() || '')}`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CredentialsPage-CoBNFSAu.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/connect/${provider}?state=${encodeURIComponent(getToken() || '')}`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsxDEV","PageHeader","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i}from"./vendor-query-DLp59M9_.js";import{u as d}from"./settings-DDe_L7JT.js";import{D as f,f as x}from"./constants-BHkpVaqx.js";import{j as n}from"./index-DSzSoku1.js";function C(){const{data:e}=d();return i.useMemo(()=>{var o;return(((o=e==null?void 0:e.escalation)==null?void 0:o.claimDurations)??f).map(a=>({value:String(a),label:x(a)}))},[e])}const b=[{value:1,label:"minutes"},{value:60,label:"hours"}];function E({onChange:e,compact:r,autoFocus:o,"data-testid":a="custom-duration-input"}){const[m,l]=i.useState(""),[s,c]=i.useState(1);i.useEffect(()=>{const t=parseInt(m);e(t>0?t*s:0)},[m,s,e]);const u=r?"text-xs":"text-sm",p=r?"w-16":"w-20";return n.jsxDEV("div",{className:"flex items-center gap-2","data-testid":a,children:[n.jsxDEV("input",{type:"number",min:1,max:s===60?24:1440,value:m,onChange:t=>l(t.target.value),placeholder:s===60?"hrs":"min",className:`input ${u} ${p} text-center`,autoFocus:o,"data-testid":`${a}-quantity`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:37,columnNumber:7},this),n.jsxDEV("select",{value:s,onChange:t=>c(parseInt(t.target.value)),className:`select ${u} py-1`,"data-testid":`${a}-unit`,children:b.map(t=>n.jsxDEV("option",{value:t.value,children:t.label},t.value,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:55,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:48,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:36,columnNumber:5},this)}export{E as C,C as u};
|
|
2
|
+
//# sourceMappingURL=CustomDurationPicker-BataWFj8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomDurationPicker-
|
|
1
|
+
{"version":3,"file":"CustomDurationPicker-BataWFj8.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxDEV","e","u"],"mappings":"qLAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,OAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAU,EAAAA,OAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKN,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWU,GAAMT,EAAYS,EAAE,OAAO,KAAK,EAC3C,YAAaP,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,EATxB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAWAU,EAAAA,OAAC,SAAA,CACC,MAAON,EACP,SAAWO,GAAMN,EAAc,SAASM,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUH,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKiB,GACVF,EAAAA,OAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,MAAf,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAChD,CAAA,EARH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-DSzSoku1.js";import{E as N}from"./EmptyState-BChBJNGS.js";function x({active:s,direction:r}){return e.jsxDEV("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${s?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${s&&r==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:35,columnNumber:5},this)}function v({columns:s,data:r,keyFn:i,onRowClick:m,activeRowKey:c,rowClassName:d,isLoading:u,emptyMessage:b="No records found",sort:o,onSort:p,inline:h}){return u?e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,t)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:67,columnNumber:13},this)},t,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:64,columnNumber:7},this):r.length?e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:s.map(a=>{const t=a.sortable&&p,n=(o==null?void 0:o.sort_by)===a.key;return e.jsxDEV("th",{onClick:t?()=>p(a.key):void 0,className:`${h?"":"sticky top-[2.75rem] z-10 "}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${a.className??""} ${t?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxDEV("span",{className:"inline-flex items-center gap-1",children:[a.label,t&&e.jsxDEV(x,{active:n,direction:n?o.order:"desc"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:97,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:94,columnNumber:17},this)},a.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:87,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:81,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:80,columnNumber:7},this),e.jsxDEV("tbody",{children:r.map((a,t)=>{const n=c!=null&&i(a)===c;return e.jsxDEV("tr",{onClick:m?()=>m(a):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${m?"cursor-pointer row-hover":""} ${n?"bg-accent/5 border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-3.5 text-sm ${l.className??""}`,children:l.render(a,t)},l.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:117,columnNumber:15},this))},i(a),!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:109,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:105,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:79,columnNumber:5},this):b?e.jsxDEV(N,{title:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:75,columnNumber:27},this):null}export{v as D};
|
|
2
|
+
//# sourceMappingURL=DataTable-B3uf5CCo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable-B3uf5CCo.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\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 );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-3.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsxDEV","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","col","isSortable","isActive","row","index","EmptyState"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{z as x,j as l,x as d}from"./index-DSzSoku1.js";import{a}from"./vendor-query-DLp59M9_.js";function E({startDate:n,endDate:o,isLive:t}){const[r,m]=a.useState(Date.now);a.useEffect(()=>{if(!t)return;const u=setInterval(()=>m(Date.now()),1e3);return()=>clearInterval(u)},[t]);const c=new Date(n).getTime(),i=o?new Date(o).getTime():r,e=Math.max(0,i-c),s=x(e),p=a.useMemo(()=>[{label:"ms",value:String(e)},{label:"sec",value:`${(e/1e3).toFixed(3)}s`},{label:"text",value:s}],[e,s]);return l.jsxDEV(d,{options:p,children:l.jsxDEV("span",{className:`text-xs ${t?"text-status-active":"text-text-tertiary"}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:38,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:37,columnNumber:5},this)}export{E};
|
|
2
|
+
//# sourceMappingURL=ElapsedCell-G5oSwTpT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElapsedCell-G5oSwTpT.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsxDEV","DateTooltip"],"mappings":"gGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,OAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,SAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./index-DSzSoku1.js";function a({title:s="No data",description:t}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[e.jsxDEV("p",{className:"text-sm text-text-secondary",children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:10,columnNumber:7},this),t&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:12,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:9,columnNumber:5},this)}export{a as E};
|
|
2
|
+
//# sourceMappingURL=EmptyState-BChBJNGS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState-
|
|
1
|
+
{"version":3,"file":"EmptyState-BChBJNGS.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["export function EmptyState({\n title = 'No data',\n description,\n}: {\n title?: string;\n description?: string;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","jsxDEV"],"mappings":"wCAAO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,CACF,EAGG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACb,SAAA,CAAAA,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAF,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCC,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAD,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EAHhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,EAAA,aAAA,CAAA,EAAA,IAKA,CAEJ"}
|