@hotmeshio/long-tail 0.4.18 → 0.4.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -2
- package/build/api/auth-sso.d.ts +12 -0
- package/build/api/auth-sso.js +54 -0
- package/build/api/escalations/bulk.js +2 -2
- package/build/api/escalations/claim.js +3 -13
- package/build/api/escalations/create.js +3 -2
- package/build/api/escalations/helpers.d.ts +1 -0
- package/build/api/escalations/helpers.js +6 -4
- package/build/api/escalations/list.d.ts +1 -0
- package/build/api/escalations/list.js +1 -0
- package/build/api/escalations/metadata.js +4 -4
- package/build/api/escalations/single.js +3 -2
- package/build/api/settings.js +5 -0
- package/build/api/topics.d.ts +9 -0
- package/build/api/topics.js +31 -2
- package/build/lib/events/index.d.ts +1 -0
- package/build/lib/events/index.js +4 -0
- package/build/lib/events/publish.d.ts +12 -9
- package/build/lib/events/publish.js +27 -17
- package/build/modules/auth.d.ts +7 -0
- package/build/modules/auth.js +104 -2
- package/build/modules/sso.d.ts +6 -0
- package/build/modules/sso.js +20 -0
- package/build/routes/auth-sso.d.ts +2 -0
- package/build/routes/auth-sso.js +51 -0
- package/build/routes/bot-accounts.js +1 -1
- package/build/routes/controlplane.js +6 -6
- package/build/routes/escalations/list.js +1 -0
- package/build/routes/index.js +2 -0
- package/build/routes/mcp-endpoint.d.ts +17 -0
- package/build/routes/mcp-endpoint.js +70 -0
- package/build/routes/roles.js +5 -5
- package/build/routes/topics.js +2 -0
- package/build/routes/users.js +31 -5
- package/build/sdk/index.d.ts +1 -0
- package/build/services/agent/input-mapper.js +17 -1
- package/build/services/escalation/crud.js +14 -1
- package/build/services/escalation/queries.d.ts +1 -0
- package/build/services/escalation/queries.js +7 -0
- package/build/services/mcp/exposure.d.ts +15 -0
- package/build/services/mcp/exposure.js +18 -0
- package/build/services/mcp/external-server.d.ts +15 -0
- package/build/services/mcp/external-server.js +125 -0
- package/build/services/mcp/seed-service-account.d.ts +11 -0
- package/build/services/mcp/seed-service-account.js +77 -0
- package/build/services/role/index.d.ts +1 -1
- package/build/services/role/index.js +2 -2
- package/build/services/topics/system-topics.js +29 -25
- package/build/services/user/index.d.ts +1 -1
- package/build/services/user/index.js +2 -1
- package/build/services/user/rbac.d.ts +11 -0
- package/build/services/user/rbac.js +17 -0
- package/build/services/user/sso-provision.d.ts +19 -0
- package/build/services/user/sso-provision.js +62 -0
- package/build/services/workflow-invocation.js +5 -3
- package/build/start/config.js +6 -0
- package/build/start/server.js +2 -0
- package/build/start/workers.js +15 -0
- package/build/system/index.js +53 -35
- package/build/system/mcp-servers/admin/agent-subscriptions.d.ts +5 -0
- package/build/system/mcp-servers/admin/agent-subscriptions.js +78 -0
- package/build/system/mcp-servers/admin/agents.d.ts +5 -0
- package/build/system/mcp-servers/admin/agents.js +103 -0
- package/build/system/mcp-servers/admin/bot-accounts.d.ts +5 -0
- package/build/system/mcp-servers/admin/bot-accounts.js +126 -0
- package/build/system/mcp-servers/admin/controlplane.d.ts +5 -0
- package/build/system/mcp-servers/admin/controlplane.js +107 -0
- package/build/system/mcp-servers/admin/escalations.js +88 -0
- package/build/system/mcp-servers/admin/exports.d.ts +5 -0
- package/build/system/mcp-servers/admin/exports.js +101 -0
- package/build/system/mcp-servers/admin/index.d.ts +16 -8
- package/build/system/mcp-servers/admin/index.js +36 -21
- package/build/system/mcp-servers/admin/pipelines.d.ts +5 -0
- package/build/system/mcp-servers/admin/pipelines.js +96 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +614 -6
- package/build/system/mcp-servers/admin/schemas.js +239 -1
- package/build/system/mcp-servers/admin/settings.d.ts +5 -0
- package/build/system/mcp-servers/admin/settings.js +53 -0
- package/build/system/mcp-servers/admin/topics.d.ts +5 -0
- package/build/system/mcp-servers/admin/topics.js +101 -0
- package/build/system/seed/tool-manifests-admin.d.ts +5077 -188
- package/build/system/seed/tool-manifests-admin.js +79 -30
- package/build/system/seed/tool-manifests-data.d.ts +20 -0
- package/build/system/seed/tool-manifests-data.js +24 -6
- package/build/system/seed/tool-manifests-escalation.d.ts +5 -0
- package/build/system/seed/tool-manifests-escalation.js +5 -0
- package/build/system/seed/tool-manifests-events.d.ts +4 -0
- package/build/system/seed/tool-manifests-events.js +4 -0
- package/build/system/seed/tool-manifests-knowledge.d.ts +6 -0
- package/build/system/seed/tool-manifests-knowledge.js +7 -0
- package/build/system/seed/tool-manifests-workflows.d.ts +8 -0
- package/build/system/seed/tool-manifests-workflows.js +8 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/auth.d.ts +71 -0
- package/build/types/events.d.ts +17 -6
- package/build/types/index.d.ts +1 -1
- package/build/types/startup.d.ts +22 -1
- package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js → AdminDashboard-BwUGcCxQ.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Cfo0mwL2.js.map → AdminDashboard-BwUGcCxQ.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-DgrYzLwq.js.map +1 -0
- package/dashboard/dist/assets/{AgentDetailPage-3mZA7SOb.js → AgentDetailPage-XJpl7wfJ.js} +4 -4
- package/dashboard/dist/assets/AgentDetailPage-XJpl7wfJ.js.map +1 -0
- package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js → AgentsPage-CGpVG6r8.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-CTVocfBb.js.map → AgentsPage-CGpVG6r8.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DR1e0TQZ.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-CA9x9o5s.js.map → AvailableEscalationsPage-DR1e0TQZ.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-BKtjl6IL.js +2 -0
- package/dashboard/dist/assets/{BotPicker-BQp_Vs73.js.map → BotPicker-BKtjl6IL.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js → CapabilitiesPage-kCB8fyOj.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js.map → CapabilitiesPage-kCB8fyOj.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js → CollapsibleSection-C3tU61hB.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js.map → CollapsibleSection-C3tU61hB.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js → CredentialsPage-Dt4nJs_B.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-DJGLssm0.js.map → CredentialsPage-Dt4nJs_B.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-BdE6mHyA.js +2 -0
- package/dashboard/dist/assets/CronLabel-BdE6mHyA.js.map +1 -0
- package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js → CustomDurationPicker-B_Yxfb-u.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-DbyqfK35.js.map → CustomDurationPicker-B_Yxfb-u.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-BkfRoUcm.js → DropZone-CptiQ0wc.js} +2 -2
- package/dashboard/dist/assets/{DropZone-BkfRoUcm.js.map → DropZone-CptiQ0wc.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-tcGx5PFI.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-BPYm8RA7.js.map → ElapsedCell-tcGx5PFI.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js → EscalationsOverview-1KO5dXzk.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-kYGHfnLf.js.map → EscalationsOverview-1KO5dXzk.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DSDzJMer.js → EventTable-DnpsQ6Ew.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DSDzJMer.js.map → EventTable-DnpsQ6Ew.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-B2Jgo1J1.js +2 -0
- package/dashboard/dist/assets/HomePage-B2Jgo1J1.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-jrVba7QN.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-DEef1_-T.js.map → ListToolbar-jrVba7QN.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js → McpOverview-BzyxJyc9.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-CZFW5qMb.js.map → McpOverview-BzyxJyc9.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js → McpQueryDetailPage-DXNseeKl.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-q9xH-QRo.js.map → McpQueryDetailPage-DXNseeKl.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-D14466yi.js → McpQueryPage-WZfTY43_.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-D14466yi.js.map → McpQueryPage-WZfTY43_.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js +2 -0
- package/dashboard/dist/assets/McpRunDetailPage-DKZp-p7S.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-SXyiwc0d.js +2 -0
- package/dashboard/dist/assets/{McpRunsPage-aZg057y3.js.map → McpRunsPage-SXyiwc0d.js.map} +1 -1
- package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Cy7ySMXj.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js → PageHeader-BuJpMxyu.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-CR6TpJG_.js.map → PageHeader-BuJpMxyu.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js → PageHeaderWithStats-yD_PTbOl.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-CRcQEAO1.js.map → PageHeaderWithStats-yD_PTbOl.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js → ProcessDetailPage-DYIfvWyc.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DyzNjwu8.js.map → ProcessDetailPage-DYIfvWyc.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js → ProcessesListPage-DR1RGaMl.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CT_3b5Wt.js.map → ProcessesListPage-DR1RGaMl.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-BC54Vn-U.js → RolePill-SasQKc_B.js} +2 -2
- package/dashboard/dist/assets/{RolePill-BC54Vn-U.js.map → RolePill-SasQKc_B.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js → RolesPage-pMERxj15.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CpRJq-sg.js.map → RolesPage-pMERxj15.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js → RunAsSelector-B-ksMoEj.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-C20rdNsC.js.map → RunAsSelector-B-ksMoEj.js.map} +1 -1
- package/dashboard/dist/assets/ServerName-CHspudaC.js +2 -0
- package/dashboard/dist/assets/{ServerName-Q6okiv4f.js.map → ServerName-CHspudaC.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js → SwimlaneTimeline-Cr_K5qpu.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CbFaU4bq.js.map → SwimlaneTimeline-Cr_K5qpu.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D6l1SPWd.js → TagInput-DvF3j8MA.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D6l1SPWd.js.map → TagInput-DvF3j8MA.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js → TaskDetailPage-BO5p7AEe.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-22cJsFmM.js.map → TaskDetailPage-BO5p7AEe.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js → TaskQueuePill-BCQrS2oK.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-iDBVCEQQ.js.map → TaskQueuePill-BCQrS2oK.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js → TasksListPage-BRg-uFtF.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BDmaUIKu.js.map → TasksListPage-BRg-uFtF.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js → TimeAgo-BSzN6rAH.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-7wqEp87-.js.map → TimeAgo-BSzN6rAH.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js → TimestampCell-DL6zMNEQ.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-BBCf8zsN.js.map → TimestampCell-DL6zMNEQ.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-HcRTggHo.js → ToolPill-1aTqYtzp.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-HcRTggHo.js.map → ToolPill-1aTqYtzp.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js → ToolTestPanel-fLzNp79U.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-Dosq1cqG.js.map → ToolTestPanel-fLzNp79U.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-D7gCsPKB.js.map +1 -0
- package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js → TopicsPage-B3Aa8Haz.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-tVPdz-k0.js.map → TopicsPage-B3Aa8Haz.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DX7IBjFn.js → UserName-BjHIJWgh.js} +2 -2
- package/dashboard/dist/assets/{UserName-DX7IBjFn.js.map → UserName-BjHIJWgh.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js → WorkflowExecutionPage-BQ7AYlQA.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-BjC0j9_L.js.map → WorkflowExecutionPage-BQ7AYlQA.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js → WorkflowPill-Z-zHRKOK.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-54px0YiY.js.map → WorkflowPill-Z-zHRKOK.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-D-G8Xudz.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js → WorkflowsOverview-B4DUcVxs.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-DaJRDkNy.js.map → WorkflowsOverview-B4DUcVxs.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js → YamlWorkflowsPage-CnTNOku0.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-CkpQaUmz.js.map → YamlWorkflowsPage-CnTNOku0.js.map} +1 -1
- package/dashboard/dist/assets/{agents-B-P5MlEx.js → agents-CkvQDr9b.js} +2 -2
- package/dashboard/dist/assets/{agents-B-P5MlEx.js.map → agents-CkvQDr9b.js.map} +1 -1
- package/dashboard/dist/assets/{bots-CZz9iVys.js → bots-CzuMCVgU.js} +2 -2
- package/dashboard/dist/assets/{bots-CZz9iVys.js.map → bots-CzuMCVgU.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js → capabilities-CbGmS0ty.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DrZ8Vw_v.js.map → capabilities-CbGmS0ty.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-cj-1c-1C.js → controlplane-DGvwkuYx.js} +2 -2
- package/dashboard/dist/assets/{controlplane-cj-1c-1C.js.map → controlplane-DGvwkuYx.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-BEVFyQnE.js → escalation-B7ysVToF.js} +2 -2
- package/dashboard/dist/assets/{escalation-BEVFyQnE.js.map → escalation-B7ysVToF.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js → escalation-columns-CHQEJU1j.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Beox3TXH.js.map → escalation-columns-CHQEJU1j.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-B4gzNq9h.js → helpers-BFOjXa4r.js} +2 -2
- package/dashboard/dist/assets/{helpers-B4gzNq9h.js.map → helpers-BFOjXa4r.js.map} +1 -1
- package/dashboard/dist/assets/index-B9_1AZaG.js +2 -0
- package/dashboard/dist/assets/{index-3n5VREXN.js.map → index-B9_1AZaG.js.map} +1 -1
- package/dashboard/dist/assets/{index-BCQ65lNu.js → index-BFaDxPxA.js} +2 -2
- package/dashboard/dist/assets/{index-BCQ65lNu.js.map → index-BFaDxPxA.js.map} +1 -1
- package/dashboard/dist/assets/index-BduDiGcw.js +15 -0
- package/dashboard/dist/assets/{index-UtAfnStw.js.map → index-BduDiGcw.js.map} +1 -1
- package/dashboard/dist/assets/{index-Bh-PnP17.js → index-BeLphL59.js} +2 -2
- package/dashboard/dist/assets/{index-Bh-PnP17.js.map → index-BeLphL59.js.map} +1 -1
- package/dashboard/dist/assets/index-C--SEsU7.css +1 -0
- package/dashboard/dist/assets/{index-_DfbFHXk.js → index-CRiBkHPb.js} +2 -2
- package/dashboard/dist/assets/{index-_DfbFHXk.js.map → index-CRiBkHPb.js.map} +1 -1
- package/dashboard/dist/assets/{index-DdKbIZNE.js → index-CbrMW-gM.js} +2 -2
- package/dashboard/dist/assets/{index-DdKbIZNE.js.map → index-CbrMW-gM.js.map} +1 -1
- package/dashboard/dist/assets/{index-aJRDh4zW.js → index-CvOGgvzP.js} +2 -2
- package/dashboard/dist/assets/{index-aJRDh4zW.js.map → index-CvOGgvzP.js.map} +1 -1
- package/dashboard/dist/assets/{index-D1MywQ2z.js → index-DDlrQeTj.js} +2 -2
- package/dashboard/dist/assets/{index-D1MywQ2z.js.map → index-DDlrQeTj.js.map} +1 -1
- package/dashboard/dist/assets/{index-BYXiz05a.js → index-DQHmfTPo.js} +2 -2
- package/dashboard/dist/assets/{index-BYXiz05a.js.map → index-DQHmfTPo.js.map} +1 -1
- package/dashboard/dist/assets/{index-BpN31nuC.js → index-_BRA9uFL.js} +25 -25
- package/dashboard/dist/assets/index-_BRA9uFL.js.map +1 -0
- package/dashboard/dist/assets/index-a98qWLB-.js +2 -0
- package/dashboard/dist/assets/index-a98qWLB-.js.map +1 -0
- package/dashboard/dist/assets/index-l_8R6U4r.js +6 -0
- package/dashboard/dist/assets/index-l_8R6U4r.js.map +1 -0
- package/dashboard/dist/assets/{index-D4KGadbW.js → index-v0OQpgXS.js} +2 -2
- package/dashboard/dist/assets/{index-D4KGadbW.js.map → index-v0OQpgXS.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-DhtKWMON.js → knowledge-BlF8UMrk.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DhtKWMON.js.map → knowledge-BlF8UMrk.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BXN7-wGF.js → mcp-MtXuky8q.js} +2 -2
- package/dashboard/dist/assets/{mcp-BXN7-wGF.js.map → mcp-MtXuky8q.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js → mcp-query-DQ-J1Q0K.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BIJP4mQJ.js.map → mcp-query-DQ-J1Q0K.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-ne_yDQZX.js → namespaces-DtsT_GoV.js} +2 -2
- package/dashboard/dist/assets/{namespaces-ne_yDQZX.js.map → namespaces-DtsT_GoV.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-Bcz62DoS.js → pipelines-BjlCm9VH.js} +2 -2
- package/dashboard/dist/assets/{pipelines-Bcz62DoS.js.map → pipelines-BjlCm9VH.js.map} +1 -1
- package/dashboard/dist/assets/{roles-De2CzGCy.js → roles-D-LhJ82d.js} +2 -2
- package/dashboard/dist/assets/{roles-De2CzGCy.js.map → roles-D-LhJ82d.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-4yL5EfxI.js → tasks-BrP_8uEN.js} +2 -2
- package/dashboard/dist/assets/{tasks-4yL5EfxI.js.map → tasks-BrP_8uEN.js.map} +1 -1
- package/dashboard/dist/assets/topics-DUk-zX5D.js +2 -0
- package/dashboard/dist/assets/{topics-DDKHpRwP.js.map → topics-DUk-zX5D.js.map} +1 -1
- package/dashboard/dist/assets/useEventHooks-XNNzwADV.js +2 -0
- package/dashboard/dist/assets/useEventHooks-XNNzwADV.js.map +1 -0
- package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js → useYamlActivityEvents-DANQ5jIY.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-Dv6GhDkh.js.map → useYamlActivityEvents-DANQ5jIY.js.map} +1 -1
- package/dashboard/dist/assets/{users-pSMWP58G.js → users-vj0JgOkA.js} +2 -2
- package/dashboard/dist/assets/{users-pSMWP58G.js.map → users-vj0JgOkA.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CrrAvF2g.js → vendor-icons-Doy0g69_.js} +116 -111
- package/dashboard/dist/assets/vendor-icons-Doy0g69_.js.map +1 -0
- package/dashboard/dist/assets/{workflows-COYPOe2I.js → workflows-CmqgGPzI.js} +2 -2
- package/dashboard/dist/assets/{workflows-COYPOe2I.js.map → workflows-CmqgGPzI.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js → yaml-workflows-DNFyjBXH.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-1dF3ig6u.js.map → yaml-workflows-DNFyjBXH.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/controlplane.md +1 -1
- package/docs/api/http/mcp-endpoint.md +133 -0
- package/docs/api/http/roles.md +46 -0
- package/docs/api/http/service-accounts.md +15 -0
- package/docs/api/http/settings.md +6 -0
- package/docs/api/mcp/admin.md +1187 -0
- package/docs/api/mcp/claude-code.md +47 -0
- package/docs/api/mcp/docs.md +54 -0
- package/docs/api/mcp/events.md +80 -0
- package/docs/api/mcp/file-storage.md +76 -0
- package/docs/api/mcp/http-fetch.md +64 -0
- package/docs/api/mcp/human-queue.md +101 -0
- package/docs/api/mcp/index.md +52 -0
- package/docs/api/mcp/knowledge.md +125 -0
- package/docs/api/mcp/oauth.md +62 -0
- package/docs/api/mcp/schema-exchange.md +56 -0
- package/docs/api/mcp/translation.md +28 -0
- package/docs/api/mcp/vision.md +46 -0
- package/docs/api/sdk/settings.md +3 -1
- package/docs/auth.md +109 -0
- package/docs/dashboard.md +1 -1
- package/package.json +1 -1
- package/build/system/mcp-servers/playwright/browser-lifecycle.d.ts +0 -26
- package/build/system/mcp-servers/playwright/browser-lifecycle.js +0 -125
- package/build/system/mcp-servers/playwright/index.d.ts +0 -25
- package/build/system/mcp-servers/playwright/index.js +0 -42
- package/build/system/mcp-servers/playwright/schemas.d.ts +0 -394
- package/build/system/mcp-servers/playwright/schemas.js +0 -90
- package/build/system/mcp-servers/playwright/tools-atomic.d.ts +0 -2
- package/build/system/mcp-servers/playwright/tools-atomic.js +0 -9
- package/build/system/mcp-servers/playwright/tools-navigation.d.ts +0 -2
- package/build/system/mcp-servers/playwright/tools-navigation.js +0 -153
- package/build/system/mcp-servers/playwright/tools-page-interaction.d.ts +0 -2
- package/build/system/mcp-servers/playwright/tools-page-interaction.js +0 -162
- package/build/system/mcp-servers/playwright/tools-run-script.d.ts +0 -2
- package/build/system/mcp-servers/playwright/tools-run-script.js +0 -207
- package/build/system/mcp-servers/playwright/types.d.ts +0 -8
- package/build/system/mcp-servers/playwright/types.js +0 -30
- package/build/system/mcp-servers/playwright/vision-helper.d.ts +0 -12
- package/build/system/mcp-servers/playwright/vision-helper.js +0 -81
- package/build/system/mcp-servers/playwright-cli/helpers.d.ts +0 -11
- package/build/system/mcp-servers/playwright-cli/helpers.js +0 -20
- package/build/system/mcp-servers/playwright-cli/index.d.ts +0 -4
- package/build/system/mcp-servers/playwright-cli/index.js +0 -15
- package/build/system/mcp-servers/playwright-cli/schemas.d.ts +0 -219
- package/build/system/mcp-servers/playwright-cli/schemas.js +0 -75
- package/build/system/mcp-servers/playwright-cli/tools-auth.d.ts +0 -2
- package/build/system/mcp-servers/playwright-cli/tools-auth.js +0 -183
- package/build/system/mcp-servers/playwright-cli/tools-capture.d.ts +0 -2
- package/build/system/mcp-servers/playwright-cli/tools-capture.js +0 -273
- package/build/system/seed/tool-manifests-browser.d.ts +0 -577
- package/build/system/seed/tool-manifests-browser.js +0 -158
- package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-DBtvb2x5.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-3mZA7SOb.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-CA9x9o5s.js +0 -2
- package/dashboard/dist/assets/BotPicker-BQp_Vs73.js +0 -2
- package/dashboard/dist/assets/CronLabel-DY8VdTS9.js +0 -2
- package/dashboard/dist/assets/CronLabel-DY8VdTS9.js.map +0 -1
- package/dashboard/dist/assets/ElapsedCell-BPYm8RA7.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js +0 -2
- package/dashboard/dist/assets/EventTopicPill-CCWCs07y.js.map +0 -1
- package/dashboard/dist/assets/HomePage-CwRebzmO.js +0 -2
- package/dashboard/dist/assets/HomePage-CwRebzmO.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-DEef1_-T.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-X0sfRFTk.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-aZg057y3.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-iZEHnndU.js.map +0 -1
- package/dashboard/dist/assets/ServerName-Q6okiv4f.js +0 -2
- package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-DW97-YHQ.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-eCH4gpAk.js.map +0 -1
- package/dashboard/dist/assets/index-3n5VREXN.js +0 -2
- package/dashboard/dist/assets/index-BAXzN-QB.js +0 -6
- package/dashboard/dist/assets/index-BAXzN-QB.js.map +0 -1
- package/dashboard/dist/assets/index-BpN31nuC.js.map +0 -1
- package/dashboard/dist/assets/index-C37LMzJa.css +0 -1
- package/dashboard/dist/assets/index-C5dHozmW.js +0 -2
- package/dashboard/dist/assets/index-C5dHozmW.js.map +0 -1
- package/dashboard/dist/assets/index-UtAfnStw.js +0 -15
- package/dashboard/dist/assets/topics-DDKHpRwP.js +0 -2
- package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js +0 -2
- package/dashboard/dist/assets/useEventHooks-NzIyvoGY.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-CrrAvF2g.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentsPage-
|
|
1
|
+
{"version":3,"file":"AgentsPage-CGpVG6r8.js","sources":["../../src/pages/agents/AgentsPage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router-dom';\nimport { Plus } from 'lucide-react';\nimport { useAgents, type Agent } from '../../api/agents';\nimport { useSettings } from '../../api/settings';\nimport { useAgentEvents } from '../../hooks/useEventHooks';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { DateValue } from '../../components/common/display/DateValue';\n\nconst STATUS_OPTIONS = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'paused', label: 'Paused' },\n { value: 'error', label: 'Error' },\n];\n\nconst columns: Column<Agent>[] = [\n {\n key: 'name',\n label: 'Agent',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-1.5 h-1.5 rounded-full shrink-0 ${row.status === 'active' ? 'bg-emerald-400' : row.status === 'paused' ? 'bg-amber-400' : row.status === 'error' ? 'bg-red-400' : 'bg-zinc-500'}`} />\n <div className=\"min-w-0\">\n <span className=\"text-xs font-medium text-text-primary block\">{row.id}</span>\n {row.description && <p className=\"text-[10px] text-text-tertiary truncate\">{row.description}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'knowledge_domain',\n label: 'Knowledge',\n render: (row) => row.knowledge_domain\n ? <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{row.knowledge_domain}</span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-28',\n },\n {\n key: 'schedules',\n label: 'Schedules',\n render: (row) => {\n const scheds = (row.behaviors as any)?.schedules as any[] | undefined;\n const crons = scheds?.length ? scheds.map((s: any) => s.cron) : row.behaviors?.cron ? [row.behaviors.cron] : [];\n if (!crons.length) return <span className=\"text-text-quaternary\">—</span>;\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{crons[0]}{crons.length > 1 ? ` +${crons.length - 1}` : ''}</span>;\n },\n className: 'w-28',\n },\n {\n key: 'subscriptions',\n label: 'Subscriptions',\n render: (row) => {\n const count = row.subscription_count ?? 0;\n const topics = row.sub_topics ?? [];\n if (!count) return <span className=\"text-text-quaternary\">—</span>;\n const first = topics[0]?.replace(/^lt\\.events\\./, '') ?? '';\n return <span className=\"text-[10px] font-mono text-text-secondary whitespace-nowrap\">{first}{count > 1 ? ` +${count - 1}` : ''}</span>;\n },\n className: 'w-36',\n },\n {\n key: 'last_run_at',\n label: 'Last Run',\n render: (row) => row.last_run_at\n ? <span className=\"whitespace-nowrap\"><DateValue date={row.last_run_at} /></span>\n : <span className=\"text-text-quaternary\">—</span>,\n className: 'w-32',\n },\n];\n\nexport function AgentsPage() {\n const navigate = useNavigate();\n const { data: settings } = useSettings();\n const aiEnabled = !!settings?.ai?.enabled;\n const label = aiEnabled ? 'Agent' : 'Automation';\n const labelPlural = aiEnabled ? 'Agents' : 'Automations';\n useAgentEvents();\n\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n\n const { data, isLoading, refetch, isFetching } = useAgents({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n\n return (\n <div>\n <PageHeader\n title={labelPlural}\n docsHash=\"#docs:agents.md\"\n actions={\n <button\n onClick={() => navigate('/agents/new')}\n className=\"flex items-center gap-2 px-4 py-2 text-sm rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" /> Create {label}\n </button>\n }\n />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/agents?limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={data?.agents ?? []}\n keyFn={(row) => row.id}\n onRowClick={(row) => navigate(`/agents/${row.id}`)}\n isLoading={isLoading}\n emptyMessage={`No ${labelPlural.toLowerCase()} found`}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["STATUS_OPTIONS","columns","row","jsxs","jsx","scheds","_a","crons","s","_b","count","topics","first","DateValue","AgentsPage","navigate","useNavigate","settings","useSettings","aiEnabled","label","labelPlural","useAgentEvents","filters","setFilter","pagination","useFilterParams","data","isLoading","refetch","isFetching","useAgents","total","PageHeader","Plus","FilterBar","ListToolbar","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,a as o}from"./vendor-query-B2UbickB.js";import{j as me,g as xe,k as ge,l as he,m as pe,n as fe,o as be,p as ye,q as je,r as Ce,s as ve}from"./index-_BRA9uFL.js";import{f as Se}from"./useEventHooks-XNNzwADV.js";import{u as ke}from"./roles-D-LhJ82d.js";import{u as Ne}from"./useFilterParams-x-Dg0Vgz.js";import{D as Pe}from"./DataTable-D9yuBv0w.js";import{S as Ae}from"./StickyPagination-BWhFSr2d.js";import{P as we}from"./PageHeader-BuJpMxyu.js";import{P as Ee}from"./constants-BHkpVaqx.js";import{u as U,C as G}from"./CustomDurationPicker-B_Yxfb-u.js";import{M as H}from"./Modal-CSrxpXeM.js";import{u as Be}from"./users-vj0JgOkA.js";import{E as Te,a as Me}from"./escalation-columns-CHQEJU1j.js";import{R as Le,a as Fe}from"./RowActions-Dg-Fsm5O.js";import{L as Ie}from"./ListToolbar-jrVba7QN.js";import{a7 as $e}from"./vendor-icons-Doy0g69_.js";import{c as ze}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-Ck4K4rzu.js";import"./PriorityBadge-DfQY9St9.js";import"./RolePill-SasQKc_B.js";import"./WorkflowPill-Z-zHRKOK.js";import"./TimestampCell-DL6zMNEQ.js";import"./escalation-B7ysVToF.js";const Re=t=>t.isPriorityPending||t.isClaimPending||t.isAssignPending||t.isEscalatePending||t.isTriagePending;function _e(t){const a=Re(t),d=U();return e.jsxs("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.jsxs("span",{className:"text-xs font-medium text-accent",children:[t.selectedCount," selected"]}),e.jsx("div",{className:"w-px h-5 bg-surface-border"}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onSetPriority(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Priority..."}),Ee.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsxs("select",{onChange:s=>{s.target.value&&(t.onClaim(parseInt(s.target.value)),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Claim for..."}),d.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))]}),e.jsx("button",{onClick:t.onAssign,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isAssignPending?"Assigning...":"Assign to..."}),t.availableRoles.length>0&&e.jsxs("select",{onChange:s=>{s.target.value&&(t.onEscalate(s.target.value),s.target.value="")},disabled:a,className:"select text-xs py-1.5",defaultValue:"",children:[e.jsx("option",{value:"",disabled:!0,children:"Escalate to..."}),t.availableRoles.map(s=>e.jsx("option",{value:s,children:s},s))]}),e.jsx("button",{onClick:t.onTriage,disabled:a,className:"btn-secondary text-xs py-1.5",children:t.isTriagePending?"Triaging...":"Triage"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:t.onClearSelection,className:"text-xs text-text-tertiary hover:text-text-primary transition-colors",children:"Clear"}),a&&e.jsx("span",{className:"text-xs text-text-tertiary animate-pulse",children:"Processing..."})]})}function Oe({open:t,onClose:a,selectedCount:d,selectedRoles:s,onSubmit:m,isPending:x}){const{isSuperAdmin:p}=me(),l=U(),[r,j]=o.useState("user"),[C,w]=o.useState(null),[v,I]=o.useState(""),[c,g]=o.useState("30"),[R,S]=o.useState(0),_=o.useCallback(i=>S(i),[]),E=!p&&s.length===1?s[0]:void 0,{data:h,isLoading:B}=Be({role:E,status:"active",limit:200}),T=o.useMemo(()=>{const i=(h==null?void 0:h.users)??[];if(!v.trim())return i;const N=v.toLowerCase();return i.filter(b=>{var L,P;return((L=b.display_name)==null?void 0:L.toLowerCase().includes(N))||((P=b.email)==null?void 0:P.toLowerCase().includes(N))})},[h==null?void 0:h.users,v]),k=()=>{j("user"),w(null),I(""),g("30"),S(0),a()},$=i=>{w(i),j("duration")},M=()=>{j("user")},f=()=>{if(!C)return;const i=c==="custom"?R:parseInt(c);!i||i<=0||m(C.id,i)};return e.jsx(H,{open:t,onClose:k,title:"Assign Escalations",children:e.jsxs("div",{className:"space-y-4",children:[r==="user"&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Select a user to assign"," ",e.jsx("span",{className:"font-medium text-text-primary",children:d})," ","escalation(s) to:"]}),e.jsx("input",{type:"text",value:v,onChange:i=>I(i.target.value),placeholder:"Search by name or email...",className:"input text-xs w-full",autoFocus:!0}),e.jsxs("div",{className:"max-h-60 overflow-y-auto border border-surface-border rounded-lg divide-y divide-surface-border",children:[B&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"Loading users..."}),!B&&T.length===0&&e.jsx("p",{className:"text-xs text-text-tertiary p-3",children:"No users found"}),T.map(i=>e.jsxs("button",{onClick:()=>$(i),className:"w-full text-left px-3 py-2 hover:bg-surface-hover transition-colors",children:[e.jsx("p",{className:"text-xs font-medium text-text-primary",children:i.display_name||i.external_id}),i.email&&e.jsx("p",{className:"text-[10px] text-text-tertiary",children:i.email})]},i.id))]}),e.jsx("div",{className:"flex justify-end pt-2",children:e.jsx("button",{onClick:k,className:"btn-secondary text-xs",children:"Cancel"})})]}),r==="duration"&&C&&e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Assign to"," ",e.jsx("span",{className:"font-medium text-text-primary",children:C.display_name||C.external_id})," ","for:"]}),e.jsxs("select",{value:c,onChange:i=>{g(i.target.value),S(0)},className:"select w-full text-sm",children:[l.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),c==="custom"&&e.jsx(G,{onChange:_,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:M,className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:f,disabled:x,className:"btn-primary text-xs",children:x?"Assigning...":"Assign"})]})]})]})})}function Ue({open:t,onClose:a,selectedCount:d,onSubmit:s,isPending:m}){const[x,p]=o.useState(""),l=()=>{s(x||void 0)};return e.jsx(H,{open:t,onClose:a,title:"Submit for AI Triage",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Submit ",e.jsx("span",{className:"font-medium text-text-primary",children:d})," escalation(s) for AI triage? The triage orchestrator will take over resolution."]}),e.jsxs("div",{children:[e.jsxs("label",{className:"text-xs font-medium text-text-secondary block mb-1",children:["Triage hint ",e.jsx("span",{className:"text-text-tertiary",children:"(optional)"})]}),e.jsx("input",{type:"text",value:x,onChange:r=>p(r.target.value),placeholder:"e.g., image_orientation",className:"input text-xs font-mono w-full"}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1",children:"Guides the triage workflow on what remediation to apply"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:l,disabled:m,className:"btn-primary text-xs",children:m?"Submitting...":"Submit for Triage"})]})]})})}function F(t,a,d){return s=>{t.mutate(s,{onSuccess:()=>{a(),d==null||d()}})}}function He(t){const a=()=>[...t.selectedIds];return{handleSetPriority:l=>{F(t.setPriority,t.clearSelection)({ids:a(),priority:l})},handleBulkClaim:l=>{F(t.bulkClaim,t.clearSelection)({ids:a(),durationMinutes:l})},handleBulkEscalate:l=>{F(t.bulkEscalate,t.clearSelection)({ids:a(),targetRole:l})},handleBulkTriage:l=>{F(t.bulkTriage,t.clearSelection,t.closeTriageModal)({ids:a(),hint:l})},handleBulkAssign:(l,r)=>{F(t.bulkAssign,t.clearSelection,t.closeAssignModal)({ids:a(),targetUserId:l,durationMinutes:r})}}}function qe({claimTarget:t,onClose:a,claimDuration:d,onDurationChange:s,claimDurations:m,onCustomClaimChange:x,onClaim:p,isPending:l}){return e.jsx(H,{open:!!t,onClose:a,title:"Claim Escalation",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claim ",e.jsx("span",{className:"font-medium text-text-primary",children:t==null?void 0:t.type})," for:"]}),e.jsxs("select",{value:d,onChange:r=>{s(r.target.value)},className:"select w-full text-sm",children:[m.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),d==="custom"&&e.jsx(G,{onChange:x,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:p,className:"btn-primary text-xs",disabled:l,children:l?"Claiming...":"Claim"})]})]})})}function gt(){Se();const t=ze(),{filters:a,setFilter:d,pagination:s,sort:m,setSort:x}=Ne({filters:{role:"",type:"",priority:"",status:"available",search:""}}),p=U(),[l,r]=o.useState(null),[j,C]=o.useState("30"),[w,v]=o.useState(0),I=o.useCallback(n=>v(n),[]),[c,g]=o.useState(new Set),[R,S]=o.useState(!1),[_,E]=o.useState(!1),h=xe(),B=ge(),T=he(),k=pe(),$=fe(),M=be(),{data:f}=ke(),{data:i}=ye();o.useEffect(()=>{g(new Set)},[a.role,a.type,a.priority,a.status,s.page,s.pageSize]);const N=a.status||"",b=N==="available",L=N==="claimed",P=L?"pending":N==="resolved"?"resolved":void 0,q={role:a.role||void 0,type:a.type||void 0,priority:a.priority?parseInt(a.priority):void 0,limit:s.pageSize,offset:s.offset,sort_by:m.sort_by||"created_at",order:m.order||"desc"},Y=je({...q,enabled:b}),J=Ce({status:P,claimed:L||void 0,...q,enabled:!b}),K=b?Y:J,{data:A,isLoading:W,error:z,refetch:X,isFetching:Z}=K,D=(A==null?void 0:A.escalations)??[],O=(a.search??"").toLowerCase(),y=O?D.filter(n=>{const u=[n.id,n.type,n.subtype,n.description,n.workflow_id,n.origin_id,n.role];return n.metadata&&u.push(...Object.values(n.metadata).map(String)),u.some(V=>V&&String(V).toLowerCase().includes(O))}):D,Q=O?y.length:(A==null?void 0:A.total)??0,{canBulk:ee}=ve(),te=o.useMemo(()=>{const n=new Set;for(const u of y)c.has(u.id)&&n.add(u.role);return[...n]},[y,c]),se=o.useCallback(()=>g(new Set),[]),ae=()=>{if(!l)return;const n=j==="custom"?w:parseInt(j);!n||n<=0||h.mutate({id:l.id,durationMinutes:n},{onSuccess:()=>{r(null),t(`/escalations/detail/${l.id}`)}})},{handleSetPriority:ne,handleBulkClaim:ie,handleBulkEscalate:le,handleBulkTriage:oe,handleBulkAssign:re}=He({selectedIds:c,clearSelection:se,setPriority:B,bulkClaim:T,bulkEscalate:$,bulkTriage:M,bulkAssign:k,closeTriageModal:()=>S(!1),closeAssignModal:()=>E(!1)}),ce=n=>{const u=new Set(c);u.has(n)?u.delete(n):u.add(n),g(u)},de=()=>{c.size===y.length?g(new Set):g(new Set(y.map(n=>n.id)))},ue=[ee?{key:"select",label:e.jsx("input",{type:"checkbox",checked:y.length>0&&c.size===y.length,onChange:de,className:"rounded"}),render:n=>e.jsx("input",{type:"checkbox",checked:c.has(n.id),onChange:u=>{u.stopPropagation(),ce(n.id)},onClick:u=>u.stopPropagation(),className:"rounded"}),className:"w-10"}:{key:"spacer",label:"",render:()=>null,className:"w-10"},...Te,{key:"actions",label:"",render:n=>e.jsx(Le,{children:e.jsx(Fe,{icon:$e,title:"Claim escalation",onClick:()=>r(n)})}),className:"w-16 text-right"}];return e.jsxs("div",{children:[e.jsx(we,{title:"Available Escalations",docsHash:"#docs:dashboard.md:all-escalations"}),e.jsx(Me,{filters:a,setFilter:d,roles:(f==null?void 0:f.roles)??[],types:(i==null?void 0:i.types)??[],showStatus:!0,actions:e.jsx(Ie,{onRefresh:()=>X(),isFetching:Z,apiPath:`/escalations${b?"/available":""}?limit=${s.pageSize}&offset=${s.offset}${P?`&status=${P}`:""}${a.role?`&role=${a.role}`:""}${a.type?`&type=${a.type}`:""}${a.priority?`&priority=${a.priority}`:""}`})}),c.size>0&&e.jsx(_e,{selectedCount:c.size,onClearSelection:()=>g(new Set),onSetPriority:ne,onClaim:ie,onAssign:()=>E(!0),onEscalate:le,onTriage:()=>S(!0),isPriorityPending:B.isPending,isClaimPending:T.isPending,isAssignPending:k.isPending,isEscalatePending:$.isPending,isTriagePending:M.isPending,availableRoles:(f==null?void 0:f.roles)??[]}),z&&e.jsx("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:z.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${z.message}`}),e.jsx(Pe,{columns:ue,data:y,keyFn:n=>n.id,onRowClick:n=>t(`/escalations/detail/${n.id}`,{state:{from:"/escalations/available"}}),isLoading:W,emptyMessage:z?"Unable to load data":"No available escalations",sort:m,onSort:x}),e.jsx(Ae,{page:s.page,totalPages:s.totalPages(Q),onPageChange:s.setPage,total:Q,pageSize:s.pageSize,onPageSizeChange:s.setPageSize}),e.jsx(qe,{claimTarget:l,onClose:()=>r(null),claimDuration:j,onDurationChange:n=>{C(n),v(0)},claimDurations:p,customClaimMinutes:w,onCustomClaimChange:I,onClaim:ae,isPending:h.isPending}),e.jsx(Ue,{open:R,onClose:()=>S(!1),selectedCount:c.size,onSubmit:oe,isPending:M.isPending}),e.jsx(Oe,{open:_,onClose:()=>E(!1),selectedCount:c.size,selectedRoles:te,onSubmit:re,isPending:k.isPending})]})}export{gt as AvailableEscalationsPage};
|
|
2
|
+
//# sourceMappingURL=AvailableEscalationsPage-DR1e0TQZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailableEscalationsPage-CA9x9o5s.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/ClaimModal.tsx","../../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 { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\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) => { onDurationChange(e.target.value); }}\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={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\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 { 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 { 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 { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\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', search: '' },\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 const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const apiStatus = statusFilter === 'claimed' ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\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 const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const now = new Date();\n const rawEscalations = data?.escalations ?? [];\n const statusFiltered = statusFilter === 'claimed'\n ? rawEscalations.filter((e) => e.assigned_to && e.assigned_until && new Date(e.assigned_until) > now)\n : rawEscalations;\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const escalations = searchTerm\n ? statusFiltered.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : statusFiltered;\n\n const total = (statusFilter === 'claimed' || searchTerm)\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\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\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 <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\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","jsxs","jsx","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","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","now","rawEscalations","statusFiltered","searchTerm","escalations","fields","f","total","canBulkManage","r","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AvailableEscalationsPage-DR1e0TQZ.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/ClaimModal.tsx","../../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 { Modal } from '../../components/common/modal/Modal';\nimport { CustomDurationPicker } from '../../components/common/form/CustomDurationPicker';\nimport type { LTEscalationRecord } from '../../api/types';\n\ninterface ClaimModalProps {\n claimTarget: LTEscalationRecord | null;\n onClose: () => void;\n claimDuration: string;\n onDurationChange: (value: string) => void;\n claimDurations: Array<{ value: string; label: string }>;\n customClaimMinutes: number;\n onCustomClaimChange: (minutes: number) => void;\n onClaim: () => void;\n isPending: boolean;\n}\n\nexport function ClaimModal({\n claimTarget,\n onClose,\n claimDuration,\n onDurationChange,\n claimDurations,\n onCustomClaimChange,\n onClaim,\n isPending,\n}: ClaimModalProps) {\n return (\n <Modal\n open={!!claimTarget}\n onClose={onClose}\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) => { onDurationChange(e.target.value); }}\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={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={onClaim}\n className=\"btn-primary text-xs\"\n disabled={isPending}\n >\n {isPending ? 'Claiming...' : 'Claim'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAccess } from '../../hooks/useAccess';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport {\n useEscalations,\n useAvailableEscalations,\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 { 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 { 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 { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { createBulkHandlers } from './helpers';\nimport { ClaimModal } from './ClaimModal';\nimport type { LTEscalationRecord } from '../../api/types';\n\nexport function AvailableEscalationsPage() {\n useEscalationListEvents();\n const navigate = useNavigate();\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { role: '', type: '', priority: '', status: 'available', search: '' },\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 const statusFilter = filters.status || '';\n const isAvailable = statusFilter === 'available';\n const isClaimed = statusFilter === 'claimed';\n const apiStatus = isClaimed ? 'pending'\n : statusFilter === 'resolved' ? 'resolved'\n : isAvailable ? undefined\n : undefined;\n\n const sharedFilters = {\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 || 'created_at',\n order: sort.order || 'desc',\n };\n\n const availableQuery = useAvailableEscalations({\n ...sharedFilters,\n enabled: isAvailable,\n });\n\n const escalationsQuery = useEscalations({\n status: apiStatus,\n claimed: isClaimed || undefined,\n ...sharedFilters,\n enabled: !isAvailable,\n });\n\n const activeQuery = isAvailable ? availableQuery : escalationsQuery;\n const { data, isLoading, error: queryError, refetch, isFetching } = activeQuery;\n\n const rawEscalations = data?.escalations ?? [];\n\n // Client-side search across visible fields + metadata values\n const searchTerm = (filters.search ?? '').toLowerCase();\n const escalations = searchTerm\n ? rawEscalations.filter((e) => {\n const fields = [e.id, e.type, e.subtype, e.description, e.workflow_id, e.origin_id, e.role];\n if (e.metadata) fields.push(...Object.values(e.metadata).map(String));\n return fields.some((f) => f && String(f).toLowerCase().includes(searchTerm));\n })\n : rawEscalations;\n\n const total = searchTerm\n ? escalations.length\n : data?.total ?? 0;\n const { canBulk: canBulkManage } = useAccess();\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=\"Available Escalations\" docsHash=\"#docs:dashboard.md:all-escalations\" />\n\n <EscalationFilterBar\n filters={filters}\n setFilter={setFilter}\n roles={rolesData?.roles ?? []}\n types={typesData?.types ?? []}\n showStatus\n actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/escalations${isAvailable ? '/available' : ''}?limit=${pagination.pageSize}&offset=${pagination.offset}${apiStatus ? `&status=${apiStatus}` : ''}${filters.role ? `&role=${filters.role}` : ''}${filters.type ? `&type=${filters.type}` : ''}${filters.priority ? `&priority=${filters.priority}` : ''}`}\n />\n }\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 <ClaimModal\n claimTarget={claimTarget}\n onClose={() => setClaimTarget(null)}\n claimDuration={claimDuration}\n onDurationChange={(v) => { setClaimDuration(v); setCustomClaimMinutes(0); }}\n claimDurations={claimDurations}\n customClaimMinutes={customClaimMinutes}\n onCustomClaimChange={onCustomClaimChange}\n onClaim={handleClaim}\n isPending={claim.isPending}\n />\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","jsxs","jsx","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","ClaimModal","claimTarget","claimDuration","onDurationChange","onCustomClaimChange","onClaim","AvailableEscalationsPage","useEscalationListEvents","navigate","useNavigate","filters","setFilter","pagination","sort","setSort","useFilterParams","setClaimTarget","setClaimDuration","customClaimMinutes","setCustomClaimMinutes","selectedIds","setSelectedIds","triageModalOpen","setTriageModalOpen","assignModalOpen","setAssignModalOpen","claim","useClaimEscalation","setPriority","useSetEscalationPriority","bulkClaim","useBulkClaimEscalations","bulkAssign","useBulkAssignEscalations","bulkEscalate","useBulkEscalateToRole","bulkTriage","useBulkTriageEscalations","rolesData","useRoles","typesData","useEscalationTypes","useEffect","statusFilter","isAvailable","isClaimed","apiStatus","sharedFilters","availableQuery","useAvailableEscalations","escalationsQuery","useEscalations","activeQuery","data","isLoading","queryError","refetch","isFetching","rawEscalations","searchTerm","escalations","fields","f","total","canBulkManage","useAccess","roles","esc","handleClaim","handleSetPriority","handleBulkClaim","handleBulkEscalate","handleBulkTriage","handleBulkAssign","toggleSelect","id","next","toggleAll","columns","row","ESCALATION_COLUMNS","RowActionGroup","RowAction","Lock","PageHeader","EscalationFilterBar","ListToolbar","DataTable","StickyPagination","v"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m,j as e}from"./vendor-query-B2UbickB.js";import{h as j}from"./bots-CzuMCVgU.js";import{a as d,X as y,af as u,k as N,$ as p}from"./vendor-icons-Doy0g69_.js";function g({selected:s,onChange:n,placeholder:f}){const{data:c}=j({limit:100}),l=((c==null?void 0:c.bots)??[]).filter(t=>t.status==="active"),[o,r]=m.useState(!1),i=m.useRef(null);m.useEffect(()=>{const t=a=>{i.current&&!i.current.contains(a.target)&&r(!1)};return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[]);const x=l.find(t=>t.external_id===s),h=f??"Invoking user (default)";return e.jsxs("div",{ref:i,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>r(!o),className:"flex items-center gap-1.5 w-full px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50",children:[s&&x?e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(d,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),x.display_name||x.external_id,e.jsx("span",{role:"button",onClick:t=>{t.stopPropagation(),n("")},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(y,{className:"w-2.5 h-2.5"})})]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-xs text-text-tertiary",children:[e.jsx(u,{className:"w-3 h-3 shrink-0"}),h]}),e.jsx(N,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${o?"rotate-180":""}`})]}),o&&e.jsxs("div",{className:"absolute z-20 mt-1 w-full bg-surface-raised border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:[e.jsxs("button",{type:"button",onClick:()=>{n(""),r(!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.jsx(u,{className:"w-3 h-3 shrink-0 text-text-tertiary"}),e.jsx("span",{className:"flex-1",children:"Invoking user"}),!s&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]}),l.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No bot accounts"}):l.map(t=>{const a=s===t.external_id;return e.jsxs("button",{type:"button",onClick:()=>{n(t.external_id),r(!1)},className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${a?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(d,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("span",{children:t.display_name||t.external_id}),t.display_name&&t.display_name!==t.external_id&&e.jsx("span",{className:"ml-1 text-text-tertiary font-mono",children:t.external_id})]}),a&&e.jsx(p,{className:"w-3 h-3 shrink-0"})]},t.id)})]})]})}export{g as B};
|
|
2
|
+
//# sourceMappingURL=BotPicker-BKtjl6IL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotPicker-
|
|
1
|
+
{"version":3,"file":"BotPicker-BKtjl6IL.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 px-1 py-1.5 bg-transparent border-b border-surface-border/60 text-left cursor-pointer hover:border-accent/50 transition-colors focus:outline-none focus:border-accent/50\"\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-surface-raised 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","jsxs","jsx","Bot","X","UserCircle","ChevronDown","Check","bot","isSelected"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as p,j as e}from"./vendor-query-B2UbickB.js";import{u as N}from"./capabilities-
|
|
2
|
-
//# sourceMappingURL=CapabilitiesPage-
|
|
1
|
+
import{a as p,j as e}from"./vendor-query-B2UbickB.js";import{u as N}from"./capabilities-CbGmS0ty.js";import{T as y}from"./ToolTestPanel-fLzNp79U.js";import{T as g}from"./ToolPill-1aTqYtzp.js";import{S as b}from"./ServerName-CHspudaC.js";import{P as w}from"./PageHeader-BuJpMxyu.js";import{aN as j,B as k,g as C,aO as S,C as T,D as I,ay as q,aj as P,z as A,aP as O,P as $}from"./vendor-icons-Doy0g69_.js";import"./index-_BRA9uFL.js";import"./vendor-react-CXumBFUA.js";import"./mcp-MtXuky8q.js";import"./RunAsSelector-B-ksMoEj.js";import"./BotPicker-BKtjl6IL.js";import"./bots-CzuMCVgU.js";const u={Communication:{icon:A,color:"text-blue-400"},Analysis:{icon:P,color:"text-violet-400"},Media:{icon:q,color:"text-pink-400"},Data:{icon:I,color:"text-emerald-400"},Automation:{icon:T,color:"text-amber-400"},Development:{icon:S,color:"text-cyan-400"},System:{icon:C,color:"text-red-400"},Reference:{icon:k,color:"text-text-tertiary"},Other:{icon:j,color:"text-text-tertiary"}};function F(){const{data:r,isLoading:l}=N(),[i,m]=p.useState(""),[a,x]=p.useState(null),[c,h]=p.useState(null),d=(r==null?void 0:r.categories)??[],v=(r==null?void 0:r.totalTools)??0,f=p.useMemo(()=>{let s=d;if(a&&(s=s.filter(n=>n.name===a)),!i.trim())return s;const o=i.toLowerCase();return s.map(n=>({...n,tools:n.tools.filter(t=>t.name.toLowerCase().includes(o)||t.description.toLowerCase().includes(o)||t.serverName.toLowerCase().includes(o))})).filter(n=>n.tools.length>0)},[d,i,a]);return e.jsxs("div",{children:[e.jsx(w,{title:"Capabilities"}),!l&&d.length>0&&e.jsxs("div",{className:"flex items-center gap-5 mb-10",children:[e.jsxs("button",{onClick:()=>x(null),className:`flex flex-col items-center gap-1 transition-colors ${a===null?"text-accent":"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(j,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:"All"})]}),d.map(s=>{const o=u[s.name]??u.Other,n=o.icon,t=a===s.name;return e.jsxs("button",{onClick:()=>x(t?null:s.name),className:`flex flex-col items-center gap-1 transition-colors ${t?o.color:"text-text-quaternary hover:text-text-secondary"}`,children:[e.jsx(n,{className:"w-5 h-5",strokeWidth:1.5}),e.jsx("span",{className:"text-[9px] font-medium",children:s.name})]},s.name)}),e.jsx("span",{className:"flex-1"}),e.jsxs("div",{className:"relative",children:[e.jsx(O,{className:"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary"}),e.jsx("input",{type:"text",value:i,onChange:s=>m(s.target.value),placeholder:`Search ${v} capabilities...`,className:"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56"})]})]}),e.jsxs("div",{className:"flex gap-0",children:[e.jsx("div",{className:`${c?"flex-1 min-w-0":"w-full"} transition-all`,children:l?e.jsx("div",{className:"animate-pulse space-y-6",children:[1,2,3].map(s=>e.jsxs("div",{children:[e.jsx("div",{className:"h-5 bg-surface-sunken rounded w-32 mb-4"}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-3/4"})]})]},s))}):f.length===0?e.jsx("p",{className:"text-sm text-text-tertiary mt-8",children:i||a?"No capabilities match your filter.":"No capabilities registered yet."}):e.jsx("div",{className:"space-y-10",children:f.map(s=>{const o=u[s.name]??u.Other,n=o.icon;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border",children:[e.jsx(n,{className:`w-4.5 h-4.5 ${o.color}`,strokeWidth:1.5}),e.jsx("h2",{className:"text-sm font-semibold uppercase tracking-widest text-accent/80",children:s.name}),e.jsx("span",{className:"text-xs text-text-quaternary",children:s.tools.length})]}),e.jsx("div",{className:"space-y-0.5",children:s.tools.map(t=>e.jsx(E,{tool:t,onTry:()=>h({serverId:t.serverId,serverName:t.serverName,tool:{name:t.name,description:t.description,inputSchema:t.inputSchema}})},`${t.serverId}-${t.name}`))})]},s.name)})})}),c&&e.jsx("div",{className:"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto",children:e.jsx(y,{serverId:c.serverId,serverName:c.serverName,tool:c.tool,onClose:()=>h(null)})})]})]})}function E({tool:r,onTry:l}){var m;const i=Object.keys(((m=r.inputSchema)==null?void 0:m.properties)??{});return e.jsxs("div",{role:"button",tabIndex:0,onClick:l,onKeyDown:a=>{(a.key==="Enter"||a.key===" ")&&l()},className:"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start cursor-pointer",children:[e.jsx("div",{className:"w-56 shrink-0",children:e.jsx(g,{name:r.name,size:"md"})}),e.jsx("div",{className:"w-44 shrink-0 pt-0.5",children:i.length>0&&e.jsx("p",{className:"text-[9px] font-mono text-text-quaternary/70 leading-relaxed",children:i.map((a,x)=>x<i.length-1?e.jsxs("span",{children:[e.jsxs("span",{className:"whitespace-nowrap",children:[a," ·"]})," "]},a):e.jsx("span",{children:a},a))})}),e.jsx("p",{className:"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5",children:r.description}),e.jsxs("div",{className:"shrink-0 flex items-center gap-1.5 pt-0.5",children:[e.jsx(b,{name:r.serverName,serverId:r.serverId}),e.jsx($,{className:"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity"})]})]})}export{F as CapabilitiesPage};
|
|
2
|
+
//# sourceMappingURL=CapabilitiesPage-kCB8fyOj.js.map
|
package/dashboard/dist/assets/{CapabilitiesPage-wpVtkGeU.js.map → CapabilitiesPage-kCB8fyOj.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapabilitiesPage-wpVtkGeU.js","sources":["../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Search, Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image,\n} from 'lucide-react';\nimport { useCapabilities, type CapabilityTool } from '../../api/capabilities';\nimport { ToolTestPanel } from '../../components/common/test/ToolTestPanel';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { ServerName } from '../../components/common/display/ServerName';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport type { LucideIcon } from 'lucide-react';\n\n// ── Category icons + colors ─────────────────────────────────────────────────\n\nconst CATEGORY_META: Record<string, { icon: LucideIcon; color: string }> = {\n Communication: { icon: MessageSquare, color: 'text-blue-400' },\n Analysis: { icon: Eye, color: 'text-violet-400' },\n Media: { icon: Image, color: 'text-pink-400' },\n Data: { icon: Database, color: 'text-emerald-400' },\n Automation: { icon: Cog, color: 'text-amber-400' },\n Development: { icon: Code2, color: 'text-cyan-400' },\n System: { icon: Shield, color: 'text-red-400' },\n Reference: { icon: BookOpen, color: 'text-text-tertiary' },\n Other: { icon: LayoutGrid, color: 'text-text-tertiary' },\n};\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function CapabilitiesPage() {\n const { data, isLoading } = useCapabilities();\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: { name: string; description: string; inputSchema: Record<string, any> };\n } | null>(null);\n\n const categories = data?.categories ?? [];\n const totalTools = data?.totalTools ?? 0;\n\n // Filter by active category + search term\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) {\n cats = cats.filter((c) => c.name === activeCategory);\n }\n if (!search.trim()) return cats;\n const q = search.toLowerCase();\n return cats\n .map((cat) => ({\n ...cat,\n tools: cat.tools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.serverName.toLowerCase().includes(q),\n ),\n }))\n .filter((cat) => cat.tools.length > 0);\n }, [categories, search, activeCategory]);\n\n return (\n <div>\n <PageHeader title=\"Capabilities\" />\n\n {/* Filter row: category icons + search */}\n {!isLoading && categories.length > 0 && (\n <div className=\"flex items-center gap-5 mb-10\">\n <button\n onClick={() => setActiveCategory(null)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n activeCategory === null ? 'text-accent' : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <LayoutGrid className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">All</span>\n </button>\n {categories.map((cat) => {\n const meta = CATEGORY_META[cat.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n const isActive = activeCategory === cat.name;\n return (\n <button\n key={cat.name}\n onClick={() => setActiveCategory(isActive ? null : cat.name)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n isActive ? meta.color : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <Icon className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">{cat.name}</span>\n </button>\n );\n })}\n <span className=\"flex-1\" />\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${totalTools} capabilities...`}\n className=\"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex gap-0\">\n {/* Main content */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {isLoading ? (\n <div className=\"animate-pulse space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-5 bg-surface-sunken rounded w-32 mb-4\" />\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-surface-sunken rounded w-full\" />\n <div className=\"h-4 bg-surface-sunken rounded w-3/4\" />\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search || activeCategory ? 'No capabilities match your filter.' : 'No capabilities registered yet.'}\n </p>\n ) : (\n <div className=\"space-y-10\">\n {filtered.map((category) => {\n const meta = CATEGORY_META[category.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n return (\n <div key={category.name}>\n <div className=\"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border\">\n <Icon className={`w-4.5 h-4.5 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"text-sm font-semibold uppercase tracking-widest text-accent/80\">{category.name}</h2>\n <span className=\"text-xs text-text-quaternary\">{category.tools.length}</span>\n </div>\n <div className=\"space-y-0.5\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n\n onTry={() =>\n setTryTool({\n serverId: tool.serverId,\n serverName: tool.serverName,\n tool: { name: tool.name, description: tool.description, inputSchema: tool.inputSchema },\n })\n }\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Try tool panel — sticky right sidebar */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ── Tool Row ────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n onTry,\n}: {\n tool: CapabilityTool;\n onTry: () => void;\n}) {\n const params = Object.keys(tool.inputSchema?.properties ?? {});\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onTry}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onTry(); }}\n className=\"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start cursor-pointer\"\n >\n {/* Col 1: tool name — wider */}\n <div className=\"w-56 shrink-0\">\n <ToolPill name={tool.name} size=\"md\" />\n </div>\n {/* Col 2: params — inline with middot delimiter */}\n <div className=\"w-44 shrink-0 pt-0.5\">\n {params.length > 0 && (\n <p className=\"text-[9px] font-mono text-text-quaternary/70 leading-relaxed\">\n {params.map((p, i) => i < params.length - 1\n ? <span key={p}><span className=\"whitespace-nowrap\">{p} ·</span> </span>\n : <span key={p}>{p}</span>\n )}\n </p>\n )}\n </div>\n {/* Col 3: description — takes remaining */}\n <p className=\"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5\">{tool.description}</p>\n {/* Col 4: server */}\n <div className=\"shrink-0 flex items-center gap-1.5 pt-0.5\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play className=\"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_META","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","useCapabilities","search","setSearch","useState","activeCategory","setActiveCategory","tryTool","setTryTool","categories","totalTools","filtered","useMemo","cats","c","q","cat","jsx","PageHeader","jsxs","meta","Icon","isActive","Search","e","i","category","tool","ToolRow","ToolTestPanel","onTry","params","_a","ToolPill","p","ServerName","Play"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CapabilitiesPage-kCB8fyOj.js","sources":["../../src/pages/capabilities/CapabilitiesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Search, Play,\n MessageSquare, Eye, Database, Cog, Code2, Shield, BookOpen,\n LayoutGrid, Image,\n} from 'lucide-react';\nimport { useCapabilities, type CapabilityTool } from '../../api/capabilities';\nimport { ToolTestPanel } from '../../components/common/test/ToolTestPanel';\nimport { ToolPill } from '../../components/common/display/ToolPill';\nimport { ServerName } from '../../components/common/display/ServerName';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport type { LucideIcon } from 'lucide-react';\n\n// ── Category icons + colors ─────────────────────────────────────────────────\n\nconst CATEGORY_META: Record<string, { icon: LucideIcon; color: string }> = {\n Communication: { icon: MessageSquare, color: 'text-blue-400' },\n Analysis: { icon: Eye, color: 'text-violet-400' },\n Media: { icon: Image, color: 'text-pink-400' },\n Data: { icon: Database, color: 'text-emerald-400' },\n Automation: { icon: Cog, color: 'text-amber-400' },\n Development: { icon: Code2, color: 'text-cyan-400' },\n System: { icon: Shield, color: 'text-red-400' },\n Reference: { icon: BookOpen, color: 'text-text-tertiary' },\n Other: { icon: LayoutGrid, color: 'text-text-tertiary' },\n};\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function CapabilitiesPage() {\n const { data, isLoading } = useCapabilities();\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string | null>(null);\n const [tryTool, setTryTool] = useState<{\n serverId: string;\n serverName: string;\n tool: { name: string; description: string; inputSchema: Record<string, any> };\n } | null>(null);\n\n const categories = data?.categories ?? [];\n const totalTools = data?.totalTools ?? 0;\n\n // Filter by active category + search term\n const filtered = useMemo(() => {\n let cats = categories;\n if (activeCategory) {\n cats = cats.filter((c) => c.name === activeCategory);\n }\n if (!search.trim()) return cats;\n const q = search.toLowerCase();\n return cats\n .map((cat) => ({\n ...cat,\n tools: cat.tools.filter(\n (t) =>\n t.name.toLowerCase().includes(q) ||\n t.description.toLowerCase().includes(q) ||\n t.serverName.toLowerCase().includes(q),\n ),\n }))\n .filter((cat) => cat.tools.length > 0);\n }, [categories, search, activeCategory]);\n\n return (\n <div>\n <PageHeader title=\"Capabilities\" />\n\n {/* Filter row: category icons + search */}\n {!isLoading && categories.length > 0 && (\n <div className=\"flex items-center gap-5 mb-10\">\n <button\n onClick={() => setActiveCategory(null)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n activeCategory === null ? 'text-accent' : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <LayoutGrid className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">All</span>\n </button>\n {categories.map((cat) => {\n const meta = CATEGORY_META[cat.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n const isActive = activeCategory === cat.name;\n return (\n <button\n key={cat.name}\n onClick={() => setActiveCategory(isActive ? null : cat.name)}\n className={`flex flex-col items-center gap-1 transition-colors ${\n isActive ? meta.color : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n <Icon className=\"w-5 h-5\" strokeWidth={1.5} />\n <span className=\"text-[9px] font-medium\">{cat.name}</span>\n </button>\n );\n })}\n <span className=\"flex-1\" />\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${totalTools} capabilities...`}\n className=\"pl-9 pr-3 py-1.5 text-sm bg-surface-sunken border border-surface-border rounded-md text-text-primary placeholder:text-text-quaternary focus:outline-none focus:ring-1 focus:ring-accent/50 w-56\"\n />\n </div>\n </div>\n )}\n\n <div className=\"flex gap-0\">\n {/* Main content */}\n <div className={`${tryTool ? 'flex-1 min-w-0' : 'w-full'} transition-all`}>\n {isLoading ? (\n <div className=\"animate-pulse space-y-6\">\n {[1, 2, 3].map((i) => (\n <div key={i}>\n <div className=\"h-5 bg-surface-sunken rounded w-32 mb-4\" />\n <div className=\"space-y-2\">\n <div className=\"h-4 bg-surface-sunken rounded w-full\" />\n <div className=\"h-4 bg-surface-sunken rounded w-3/4\" />\n </div>\n </div>\n ))}\n </div>\n ) : filtered.length === 0 ? (\n <p className=\"text-sm text-text-tertiary mt-8\">\n {search || activeCategory ? 'No capabilities match your filter.' : 'No capabilities registered yet.'}\n </p>\n ) : (\n <div className=\"space-y-10\">\n {filtered.map((category) => {\n const meta = CATEGORY_META[category.name] ?? CATEGORY_META.Other;\n const Icon = meta.icon;\n return (\n <div key={category.name}>\n <div className=\"flex items-center gap-2 mb-4 pb-2 border-b border-surface-border\">\n <Icon className={`w-4.5 h-4.5 ${meta.color}`} strokeWidth={1.5} />\n <h2 className=\"text-sm font-semibold uppercase tracking-widest text-accent/80\">{category.name}</h2>\n <span className=\"text-xs text-text-quaternary\">{category.tools.length}</span>\n </div>\n <div className=\"space-y-0.5\">\n {category.tools.map((tool) => (\n <ToolRow\n key={`${tool.serverId}-${tool.name}`}\n tool={tool}\n\n onTry={() =>\n setTryTool({\n serverId: tool.serverId,\n serverName: tool.serverName,\n tool: { name: tool.name, description: tool.description, inputSchema: tool.inputSchema },\n })\n }\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Try tool panel — sticky right sidebar */}\n {tryTool && (\n <div className=\"w-[380px] shrink-0 sticky top-0 max-h-screen overflow-y-auto\">\n <ToolTestPanel\n serverId={tryTool.serverId}\n serverName={tryTool.serverName}\n tool={tryTool.tool}\n onClose={() => setTryTool(null)}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ── Tool Row ────────────────────────────────────────────────────────────────\n\nfunction ToolRow({\n tool,\n onTry,\n}: {\n tool: CapabilityTool;\n onTry: () => void;\n}) {\n const params = Object.keys(tool.inputSchema?.properties ?? {});\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onTry}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onTry(); }}\n className=\"group w-full py-2 px-2 rounded-md hover:bg-surface-hover transition-colors text-left flex gap-4 items-start cursor-pointer\"\n >\n {/* Col 1: tool name — wider */}\n <div className=\"w-56 shrink-0\">\n <ToolPill name={tool.name} size=\"md\" />\n </div>\n {/* Col 2: params — inline with middot delimiter */}\n <div className=\"w-44 shrink-0 pt-0.5\">\n {params.length > 0 && (\n <p className=\"text-[9px] font-mono text-text-quaternary/70 leading-relaxed\">\n {params.map((p, i) => i < params.length - 1\n ? <span key={p}><span className=\"whitespace-nowrap\">{p} ·</span> </span>\n : <span key={p}>{p}</span>\n )}\n </p>\n )}\n </div>\n {/* Col 3: description — takes remaining */}\n <p className=\"text-[11px] text-text-tertiary leading-relaxed flex-1 pt-0.5\">{tool.description}</p>\n {/* Col 4: server */}\n <div className=\"shrink-0 flex items-center gap-1.5 pt-0.5\">\n <ServerName name={tool.serverName} serverId={tool.serverId} />\n <Play className=\"w-2.5 h-2.5 text-accent opacity-0 group-hover:opacity-100 transition-opacity\" />\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_META","MessageSquare","Eye","Image","Database","Cog","Code2","Shield","BookOpen","LayoutGrid","CapabilitiesPage","data","isLoading","useCapabilities","search","setSearch","useState","activeCategory","setActiveCategory","tryTool","setTryTool","categories","totalTools","filtered","useMemo","cats","c","q","cat","jsx","PageHeader","jsxs","meta","Icon","isActive","Search","e","i","category","tool","ToolRow","ToolTestPanel","onTry","params","_a","ToolPill","p","ServerName","Play"],"mappings":"4kBAeA,MAAMA,EAAqE,CACzE,cAAe,CAAE,KAAMC,EAAe,MAAO,eAAA,EAC7C,SAAe,CAAE,KAAMC,EAAgB,MAAO,iBAAA,EAC9C,MAAe,CAAE,KAAMC,EAAgB,MAAO,eAAA,EAC9C,KAAe,CAAE,KAAMC,EAAgB,MAAO,kBAAA,EAC9C,WAAe,CAAE,KAAMC,EAAgB,MAAO,gBAAA,EAC9C,YAAe,CAAE,KAAMC,EAAgB,MAAO,eAAA,EAC9C,OAAe,CAAE,KAAMC,EAAgB,MAAO,cAAA,EAC9C,UAAe,CAAE,KAAMC,EAAgB,MAAO,oBAAA,EAC9C,MAAe,CAAE,KAAMC,EAAgB,MAAO,oBAAA,CAChD,EAIO,SAASC,GAAmB,CACjC,KAAM,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAA,EACtB,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAE,EACjC,CAACC,EAAgBC,CAAiB,EAAIF,EAAAA,SAAwB,IAAI,EAClE,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAIpB,IAAI,EAERK,GAAaV,GAAA,YAAAA,EAAM,aAAc,CAAA,EACjCW,GAAaX,GAAA,YAAAA,EAAM,aAAc,EAGjCY,EAAWC,EAAAA,QAAQ,IAAM,CAC7B,IAAIC,EAAOJ,EAIX,GAHIJ,IACFQ,EAAOA,EAAK,OAAQC,GAAMA,EAAE,OAAST,CAAc,GAEjD,CAACH,EAAO,KAAA,EAAQ,OAAOW,EAC3B,MAAME,EAAIb,EAAO,YAAA,EACjB,OAAOW,EACJ,IAAKG,IAAS,CACb,GAAGA,EACH,MAAOA,EAAI,MAAM,OACd,GACC,EAAE,KAAK,cAAc,SAASD,CAAC,GAC/B,EAAE,YAAY,cAAc,SAASA,CAAC,GACtC,EAAE,WAAW,YAAA,EAAc,SAASA,CAAC,CAAA,CACzC,EACA,EACD,OAAQC,GAAQA,EAAI,MAAM,OAAS,CAAC,CACzC,EAAG,CAACP,EAAYP,EAAQG,CAAc,CAAC,EAEvC,cACG,MAAA,CACC,SAAA,CAAAY,EAAAA,IAACC,EAAA,CAAW,MAAM,cAAA,CAAe,EAGhC,CAAClB,GAAaS,EAAW,OAAS,GACjCU,OAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMb,EAAkB,IAAI,EACrC,UAAW,sDACTD,IAAmB,KAAO,cAAgB,gDAC5C,GAEA,SAAA,CAAAY,EAAAA,IAACpB,EAAA,CAAW,UAAU,UAAU,YAAa,IAAK,EAClDoB,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAAyB,SAAA,KAAA,CAAG,CAAA,CAAA,CAAA,EAE7CR,EAAW,IAAKO,GAAQ,CACvB,MAAMI,EAAOhC,EAAc4B,EAAI,IAAI,GAAK5B,EAAc,MAChDiC,EAAOD,EAAK,KACZE,EAAWjB,IAAmBW,EAAI,KACxC,OACEG,EAAAA,KAAC,SAAA,CAEC,QAAS,IAAMb,EAAkBgB,EAAW,KAAON,EAAI,IAAI,EAC3D,UAAW,sDACTM,EAAWF,EAAK,MAAQ,gDAC1B,GAEA,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAK,UAAU,UAAU,YAAa,IAAK,EAC5CJ,EAAAA,IAAC,OAAA,CAAK,UAAU,yBAA0B,WAAI,IAAA,CAAK,CAAA,CAAA,EAP9CD,EAAI,IAAA,CAUf,CAAC,EACDC,EAAAA,IAAC,OAAA,CAAK,UAAU,QAAA,CAAS,EACzBE,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAF,EAAAA,IAACM,EAAA,CAAO,UAAU,2EAAA,CAA4E,EAC9FN,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOf,EACP,SAAWsB,GAAMrB,EAAUqB,EAAE,OAAO,KAAK,EACzC,YAAa,UAAUd,CAAU,mBACjC,UAAU,iMAAA,CAAA,CACZ,CAAA,CACF,CAAA,EACF,EAGFS,EAAAA,KAAC,MAAA,CAAI,UAAU,aAEb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAW,GAAGV,EAAU,iBAAmB,QAAQ,kBACrD,WACCU,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAC,EAAG,EAAG,CAAC,EAAE,IAAKQ,GACdN,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,yCAAA,CAA0C,EACzDE,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,EACtDA,EAAAA,IAAC,MAAA,CAAI,UAAU,qCAAA,CAAsC,CAAA,CAAA,CACvD,CAAA,CAAA,EALQQ,CAMV,CACD,EACH,EACEd,EAAS,SAAW,EACtBM,EAAAA,IAAC,IAAA,CAAE,UAAU,kCACV,YAAUZ,EAAiB,qCAAuC,iCAAA,CACrE,EAEAY,EAAAA,IAAC,MAAA,CAAI,UAAU,aACZ,SAAAN,EAAS,IAAKe,GAAa,CAC1B,MAAMN,EAAOhC,EAAcsC,EAAS,IAAI,GAAKtC,EAAc,MACrDiC,EAAOD,EAAK,KAClB,cACG,MAAA,CACC,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAF,EAAAA,IAACI,GAAK,UAAW,eAAeD,EAAK,KAAK,GAAI,YAAa,IAAK,EAChEH,EAAAA,IAAC,KAAA,CAAG,UAAU,iEAAkE,WAAS,KAAK,QAC7F,OAAA,CAAK,UAAU,+BAAgC,SAAAS,EAAS,MAAM,MAAA,CAAO,CAAA,EACxE,EACAT,EAAAA,IAAC,OAAI,UAAU,cACZ,WAAS,MAAM,IAAKU,GACnBV,EAAAA,IAACW,EAAA,CAEC,KAAAD,EAEA,MAAO,IACLnB,EAAW,CACT,SAAUmB,EAAK,SACf,WAAYA,EAAK,WACjB,KAAM,CAAE,KAAMA,EAAK,KAAM,YAAaA,EAAK,YAAa,YAAaA,EAAK,WAAA,CAAY,CACvF,CAAA,EARE,GAAGA,EAAK,QAAQ,IAAIA,EAAK,IAAI,EAAA,CAWrC,CAAA,CACH,CAAA,CAAA,EArBQD,EAAS,IAsBnB,CAEJ,CAAC,EACH,EAEJ,EAGCnB,GACCU,EAAAA,IAAC,MAAA,CAAI,UAAU,+DACb,SAAAA,EAAAA,IAACY,EAAA,CACC,SAAUtB,EAAQ,SAClB,WAAYA,EAAQ,WACpB,KAAMA,EAAQ,KACd,QAAS,IAAMC,EAAW,IAAI,CAAA,CAAA,CAChC,CACF,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CAIA,SAASoB,EAAQ,CACf,KAAAD,EACA,MAAAG,CACF,EAGG,OACD,MAAMC,EAAS,OAAO,OAAKC,EAAAL,EAAK,cAAL,YAAAK,EAAkB,aAAc,EAAE,EAE7D,OACEb,EAAAA,KAAC,MAAA,CACC,KAAK,SACL,SAAU,EACV,QAASW,EACT,UAAYN,GAAM,EAAMA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAKM,EAAA,CAAS,EACrE,UAAU,6HAGV,SAAA,CAAAb,EAAAA,IAAC,MAAA,CAAI,UAAU,gBACb,SAAAA,EAAAA,IAACgB,EAAA,CAAS,KAAMN,EAAK,KAAM,KAAK,IAAA,CAAK,CAAA,CACvC,EAEAV,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACZ,SAAAc,EAAO,OAAS,GACfd,EAAAA,IAAC,IAAA,CAAE,UAAU,+DACV,SAAAc,EAAO,IAAI,CAACG,EAAGT,IAAMA,EAAIM,EAAO,OAAS,SACrC,OAAA,CAAa,SAAA,CAAAZ,EAAAA,KAAC,OAAA,CAAK,UAAU,oBAAqB,SAAA,CAAAe,EAAE,IAAA,EAAE,EAAO,GAAA,CAAA,EAAnDA,CAAoD,EAC/DjB,EAAAA,IAAC,OAAA,CAAc,YAAJiB,CAAM,CAAA,EAEvB,CAAA,CAEJ,EAEAjB,EAAAA,IAAC,IAAA,CAAE,UAAU,+DAAgE,WAAK,YAAY,EAE9FE,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAF,MAACkB,GAAW,KAAMR,EAAK,WAAY,SAAUA,EAAK,SAAU,EAC5DV,EAAAA,IAACmB,EAAA,CAAK,UAAU,8EAAA,CAA+E,CAAA,CAAA,CACjG,CAAA,CAAA,CAAA,CAGN"}
|
package/dashboard/dist/assets/{CollapsibleSection-2eZMMZiG.js → CollapsibleSection-C3tU61hB.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-
|
|
2
|
-
//# sourceMappingURL=CollapsibleSection-
|
|
1
|
+
import{j as t}from"./vendor-query-B2UbickB.js";import{C as a}from"./index-_BRA9uFL.js";function c({title:r,sectionKey:s,isCollapsed:e,onToggle:o,contentClassName:n,children:i}){return t.jsxs("div",{children:[t.jsxs("button",{onClick:()=>o(s),className:"flex items-center gap-3 w-full group/section",children:[t.jsx("svg",{className:`w-4 h-4 shrink-0 text-text-tertiary/40 group-hover/section:text-text-tertiary transition-all duration-200 ${e?"":"rotate-90"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:t.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5l7 7-7 7"})}),t.jsx("span",{className:`text-xs font-semibold uppercase tracking-widest transition-colors duration-200 ${e?"text-text-tertiary":"text-text-secondary"}`,children:r}),t.jsx("span",{className:"flex-1 border-b border-surface-border"})]}),t.jsx(a,{open:!e,children:t.jsx("div",{className:n??"mt-4 ml-7",children:i})})]})}export{c as C};
|
|
2
|
+
//# sourceMappingURL=CollapsibleSection-C3tU61hB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsibleSection-
|
|
1
|
+
{"version":3,"file":"CollapsibleSection-C3tU61hB.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","jsxs","jsx","Collapsible"],"mappings":"uFAOO,SAASA,EAAmB,CACjC,MAAAC,EACA,WAAAC,EACA,YAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,SAAAC,CACF,EAQG,CACD,cACG,MAAA,CACC,SAAA,CAAAC,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMH,EAASF,CAAU,EAClC,UAAU,+CAEV,SAAA,CAAAM,EAAAA,IAAC,MAAA,CACC,UAAW,6GAA8GL,EAA4B,GAAd,WAAgB,GACvJ,KAAK,OAAO,QAAQ,YAAY,OAAO,eAAe,YAAa,EAEnE,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,cAAA,CAAe,CAAA,CAAA,EAEtEK,EAAAA,IAAC,QAAK,UAAW,kFAAkFL,EAAc,qBAAuB,qBAAqB,GAC1J,SAAAF,CAAA,CACH,EACAO,EAAAA,IAAC,OAAA,CAAK,UAAU,uCAAA,CAAwC,CAAA,CAAA,CAAA,EAE1DA,EAAAA,IAACC,EAAA,CAAY,KAAM,CAACN,EAClB,SAAAK,EAAAA,IAAC,MAAA,CAAI,UAAWH,GAAoB,YAAc,SAAAC,CAAA,CAAS,CAAA,CAC7D,CAAA,EACF,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{
|
|
2
|
-
//# sourceMappingURL=CredentialsPage-
|
|
1
|
+
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{B as y,E as N,O as p,L as f,G as C}from"./index-_BRA9uFL.js";import{P as k}from"./PageHeader-BuJpMxyu.js";import{T as A}from"./TimeAgo-BSzN6rAH.js";import{C as w}from"./ConfirmDeleteModal-D9_1b4MW.js";import{n as P,k as T,an as O,t as E}from"./vendor-icons-Doy0g69_.js";import"./vendor-react-CXumBFUA.js";import"./Modal-CSrxpXeM.js";const o={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-..."},google:{name:"Google",helpText:"Connect your Google account for Gmail, Calendar, and Drive access.",placeholder:"",oauth:!0}};function U(){var d,x;const{data:r,isLoading:m}=y(),n=N(),[a,l]=i.useState(null),[h,u]=i.useState(!1),[s,j]=i.useState("anthropic"),c=(r==null?void 0:r.connections)??[],b=()=>{a&&n.mutate({provider:a.provider,label:a.label},{onSuccess:()=>l(null)})},v=t=>`${f}/api/auth/oauth/connect/${t}?token=${encodeURIComponent(C()||"")}&returnTo=/credentials`;return e.jsxs("div",{children:[e.jsx(k,{title:"Credentials",docsHash:"#docs:dashboard.md:credentials",actions:e.jsxs("button",{onClick:()=>u(t=>!t),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(P,{className:"w-3.5 h-3.5"}),"Add Credential"]})}),e.jsx("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."}),h&&e.jsxs("div",{className:"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("label",{className:"text-xs text-text-secondary font-medium",children:"Provider"}),e.jsxs("div",{className:"relative",children:[e.jsx("select",{value:s,onChange:t=>j(t.target.value),className:"input text-xs pr-7 appearance-none",children:Object.entries(o).map(([t,g])=>e.jsx("option",{value:t,children:g.name},t))}),e.jsx(T,{className:"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none"})]})]}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(d=o[s])==null?void 0:d.helpText}),e.jsxs("a",{href:v(s),className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(p,{provider:s,className:"w-3.5 h-3.5"}),"Connect ",(x=o[s])==null?void 0:x.name]})]}),m?e.jsx("div",{className:"animate-pulse space-y-3",children:[1,2].map(t=>e.jsx("div",{className:"h-16 bg-surface-sunken rounded"},t))}):c.length===0?e.jsxs("div",{className:"text-center py-16 text-text-tertiary",children:[e.jsx(O,{className:"w-10 h-10 mx-auto mb-3 opacity-40"}),e.jsx("p",{className:"text-sm",children:"No credentials registered."}),e.jsx("p",{className:"text-xs mt-1",children:"Add a credential to enable tool authentication."})]}):e.jsx("div",{className:"space-y-2",children:c.map(t=>e.jsxs("div",{className:"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md",children:[e.jsx(p,{provider:t.provider,className:"w-6 h-6 shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm text-text-primary font-medium capitalize",children:t.provider}),t.label!=="default"&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary",children:t.label}),t.credential_type&&e.jsx("span",{className:"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent",children:t.credential_type})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-0.5",children:[t.email&&e.jsx("span",{className:"text-xs text-text-tertiary",children:t.email}),t.expires_at&&e.jsxs("span",{className:"text-xs text-text-tertiary",children:["Expires ",e.jsx(A,{date:t.expires_at})]})]})]}),e.jsx("button",{onClick:()=>l({provider:t.provider,label:t.label}),className:"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke credential",children:e.jsx(E,{className:"w-4 h-4"})})]},`${t.provider}-${t.label}`))}),e.jsx(w,{open:!!a,onClose:()=>l(null),onConfirm:b,title:"Revoke Credential",description:e.jsxs(e.Fragment,{children:["Revoke the"," ",e.jsx("span",{className:"font-medium text-text-primary capitalize",children:a==null?void 0:a.provider}),(a==null?void 0:a.label)!=="default"&&e.jsxs(e.Fragment,{children:[" (",a==null?void 0:a.label,")"]})," ","credential? Tools will no longer be able to use this credential."]}),isPending:n.isPending,error:n.error})]})}export{U as CredentialsPage};
|
|
2
|
+
//# sourceMappingURL=CredentialsPage-Dt4nJs_B.js.map
|