@hotmeshio/long-tail 0.8.1 → 0.8.2
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/dashboard/dist/assets/AdminDashboard-Nvja-XIJ.js +2 -0
- package/dashboard/dist/assets/{AdminDashboard-Ck5-jV9T.js.map → AdminDashboard-Nvja-XIJ.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-Sf2god7q.js +16 -0
- package/dashboard/dist/assets/{AgentConfigPage-DFiXRBWs.js.map → AgentConfigPage-Sf2god7q.js.map} +1 -1
- package/dashboard/dist/assets/AgentDetailPage-DtgDeZJR.js +4 -0
- package/dashboard/dist/assets/{AgentDetailPage-BBgM_pMe.js.map → AgentDetailPage-DtgDeZJR.js.map} +1 -1
- package/dashboard/dist/assets/AgentsPage-C6zqP_xC.js +2 -0
- package/dashboard/dist/assets/{AgentsPage-DxwFuedf.js.map → AgentsPage-C6zqP_xC.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-D61kC7Is.js +2 -0
- package/dashboard/dist/assets/{AvailableEscalationsPage-DNQbeIcn.js.map → AvailableEscalationsPage-D61kC7Is.js.map} +1 -1
- package/dashboard/dist/assets/BotPicker-ChgljKHj.js +2 -0
- package/dashboard/dist/assets/{BotPicker-mqwKVOE3.js.map → BotPicker-ChgljKHj.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-DeybKoZM.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-Biffm0kW.js.map → CapabilitiesPage-DeybKoZM.js.map} +1 -1
- package/dashboard/dist/assets/CollapsibleSection-BPiTuPBk.js +2 -0
- package/dashboard/dist/assets/{CollapsibleSection-Bn6Ks79X.js.map → CollapsibleSection-BPiTuPBk.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-D9_1b4MW.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-no0-c_1G.js.map → ConfirmDeleteModal-D9_1b4MW.js.map} +1 -1
- package/dashboard/dist/assets/CopyableId-blg-gZvT.js +2 -0
- package/dashboard/dist/assets/{CopyableId-DS6IDMIX.js.map → CopyableId-blg-gZvT.js.map} +1 -1
- package/dashboard/dist/assets/CredentialsPage-DXOcPWtd.js +2 -0
- package/dashboard/dist/assets/{CredentialsPage-C3NyncEB.js.map → CredentialsPage-DXOcPWtd.js.map} +1 -1
- package/dashboard/dist/assets/CronLabel-D3411N8x.js +2 -0
- package/dashboard/dist/assets/{CronLabel-DQWBx57H.js.map → CronLabel-D3411N8x.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-WG2tPSbV.js +2 -0
- package/dashboard/dist/assets/{CustomDurationPicker-DV42oZ1G.js.map → CustomDurationPicker-WG2tPSbV.js.map} +1 -1
- package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +2 -0
- package/dashboard/dist/assets/{DataTable-Bf4dgxll.js.map → DataTable-ZWgVQg7F.js.map} +1 -1
- package/dashboard/dist/assets/DropZone-SgiK1WOl.js +2 -0
- package/dashboard/dist/assets/{DropZone-CTSXBb3c.js.map → DropZone-SgiK1WOl.js.map} +1 -1
- package/dashboard/dist/assets/ElapsedCell-BFWEGSD7.js +2 -0
- package/dashboard/dist/assets/{ElapsedCell-roy4G5SQ.js.map → ElapsedCell-BFWEGSD7.js.map} +1 -1
- package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +2 -0
- package/dashboard/dist/assets/{EmptyState-CLVm9KmA.js.map → EmptyState-BcsfPq9T.js.map} +1 -1
- package/dashboard/dist/assets/EscalationSchemaPage-D2Y5Yeqn.js +9 -0
- package/dashboard/dist/assets/{EscalationSchemaPage-DulCCxea.js.map → EscalationSchemaPage-D2Y5Yeqn.js.map} +1 -1
- package/dashboard/dist/assets/EscalationsOverview-VlLcX2YM.js +2 -0
- package/dashboard/dist/assets/{EscalationsOverview-DDwxn_mT.js.map → EscalationsOverview-VlLcX2YM.js.map} +1 -1
- package/dashboard/dist/assets/EventTable-3MJw14jp.js +2 -0
- package/dashboard/dist/assets/{EventTable-BaLNvCew.js.map → EventTable-3MJw14jp.js.map} +1 -1
- package/dashboard/dist/assets/FilterBar-B4Mk2PvT.js +2 -0
- package/dashboard/dist/assets/{FilterBar-DEAbNQqp.js.map → FilterBar-B4Mk2PvT.js.map} +1 -1
- package/dashboard/dist/assets/GraphInvokePage-QaUUrPnh.js +2 -0
- package/dashboard/dist/assets/{GraphInvokePage-BmM8r0R3.js.map → GraphInvokePage-QaUUrPnh.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Br0A3iOp.js +2 -0
- package/dashboard/dist/assets/HomePage-Br0A3iOp.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-d4MGQefV.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-Dviaskni.js.map → ListToolbar-d4MGQefV.js.map} +1 -1
- package/dashboard/dist/assets/McpOverview-CUzJD5Z5.js +2 -0
- package/dashboard/dist/assets/{McpOverview-BBm66wbF.js.map → McpOverview-CUzJD5Z5.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryDetailPage-pYSZmV3M.js +5 -0
- package/dashboard/dist/assets/{McpQueryDetailPage-B6GJOMcz.js.map → McpQueryDetailPage-pYSZmV3M.js.map} +1 -1
- package/dashboard/dist/assets/McpQueryPage-CA5C5dss.js +2 -0
- package/dashboard/dist/assets/{McpQueryPage-C-8nIdBL.js.map → McpQueryPage-CA5C5dss.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-CrRkXwAe.js +2 -0
- package/dashboard/dist/assets/{McpRunDetailPage-CSq_0qqi.js.map → McpRunDetailPage-CrRkXwAe.js.map} +1 -1
- package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-BqRBDbkn.js.map +1 -0
- package/dashboard/dist/assets/Modal-CSrxpXeM.js +2 -0
- package/dashboard/dist/assets/{Modal-C6HI6btY.js.map → Modal-CSrxpXeM.js.map} +1 -1
- package/dashboard/dist/assets/NamespacePill-SErKwgkb.js +2 -0
- package/dashboard/dist/assets/{NamespacePill-eGsbJBFa.js.map → NamespacePill-SErKwgkb.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage--uVJxzmP.js +2 -0
- package/dashboard/dist/assets/OperationsPage--uVJxzmP.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-D-UMrTqI.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-BbmgsOmQ.js.map → OperatorDashboard-D-UMrTqI.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DJo7yMUR.js +2 -0
- package/dashboard/dist/assets/{PageHeader-DcgGV0Y2.js.map → PageHeader-DJo7yMUR.js.map} +1 -1
- package/dashboard/dist/assets/PageHeaderWithStats-W3akV6nB.js +2 -0
- package/dashboard/dist/assets/{PageHeaderWithStats-Cf8TYFRh.js.map → PageHeaderWithStats-W3akV6nB.js.map} +1 -1
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js +2 -0
- package/dashboard/dist/assets/{PriorityBadge-a7u8C9uY.js.map → PriorityBadge-B4ykBH7f.js.map} +1 -1
- package/dashboard/dist/assets/ProcessDetailPage-BV6D_wuR.js +2 -0
- package/dashboard/dist/assets/{ProcessDetailPage-D80w44rV.js.map → ProcessDetailPage-BV6D_wuR.js.map} +1 -1
- package/dashboard/dist/assets/ProcessesListPage-BAalEHpx.js +2 -0
- package/dashboard/dist/assets/{ProcessesListPage-BjW5xUkv.js.map → ProcessesListPage-BAalEHpx.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-ClE7rUoo.js +11 -0
- package/dashboard/dist/assets/{RoleDetailPage-oahg0cdT.js.map → RoleDetailPage-ClE7rUoo.js.map} +1 -1
- package/dashboard/dist/assets/RolePill-DHWixsQR.js +2 -0
- package/dashboard/dist/assets/{RolePill-BAeaQUXX.js.map → RolePill-DHWixsQR.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-DMsgZioQ.js +2 -0
- package/dashboard/dist/assets/{RolesPage-BI1Xtqq_.js.map → RolesPage-DMsgZioQ.js.map} +1 -1
- package/dashboard/dist/assets/RowActions-BA9L9djf.js +2 -0
- package/dashboard/dist/assets/{RowActions--m4F6GW8.js.map → RowActions-BA9L9djf.js.map} +1 -1
- package/dashboard/dist/assets/RunAsSelector-VCnEYIwj.js +2 -0
- package/dashboard/dist/assets/{RunAsSelector-DiGzSfiG.js.map → RunAsSelector-VCnEYIwj.js.map} +1 -1
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js +2 -0
- package/dashboard/dist/assets/{StatCard-DCPGFzCv.js.map → StatCard-DrdlUeQz.js.map} +1 -1
- package/dashboard/dist/assets/StatusBadge-DZ9137bI.js +2 -0
- package/dashboard/dist/assets/{StatusBadge-mk-dJwPT.js.map → StatusBadge-DZ9137bI.js.map} +1 -1
- package/dashboard/dist/assets/StickyPagination-3eCY2-_V.js +2 -0
- package/dashboard/dist/assets/{StickyPagination-Clm9H840.js.map → StickyPagination-3eCY2-_V.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-70kDFH4o.js +2 -0
- package/dashboard/dist/assets/{StreamMessageDetail-Bikvs1Cz.js.map → StreamMessageDetail-70kDFH4o.js.map} +1 -1
- package/dashboard/dist/assets/SwimlaneTimeline-BOXRit6t.js +2 -0
- package/dashboard/dist/assets/{SwimlaneTimeline-C9X3IVqI.js.map → SwimlaneTimeline-BOXRit6t.js.map} +1 -1
- package/dashboard/dist/assets/TagInput-CGGC3DTR.js +2 -0
- package/dashboard/dist/assets/{TagInput-DmJLnghg.js.map → TagInput-CGGC3DTR.js.map} +1 -1
- package/dashboard/dist/assets/TaskDetailPage-YxGQE9Qg.js +2 -0
- package/dashboard/dist/assets/TaskDetailPage-YxGQE9Qg.js.map +1 -0
- package/dashboard/dist/assets/TaskQueuePill-D6omQJNY.js +2 -0
- package/dashboard/dist/assets/{TaskQueuePill--1OX6egx.js.map → TaskQueuePill-D6omQJNY.js.map} +1 -1
- package/dashboard/dist/assets/TasksListPage-DuLJQN7Q.js +2 -0
- package/dashboard/dist/assets/{TasksListPage-DcYV-GMA.js.map → TasksListPage-DuLJQN7Q.js.map} +1 -1
- package/dashboard/dist/assets/TimeAgo-dnc1ZjKc.js +2 -0
- package/dashboard/dist/assets/{TimeAgo-pYn3T9IZ.js.map → TimeAgo-dnc1ZjKc.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-CDR6cTyq.js +2 -0
- package/dashboard/dist/assets/{TimestampCell-BPMCscic.js.map → TimestampCell-CDR6cTyq.js.map} +1 -1
- package/dashboard/dist/assets/ToolPill-BW0iRwZu.js +2 -0
- package/dashboard/dist/assets/{ToolPill-BnF9lCUX.js.map → ToolPill-BW0iRwZu.js.map} +1 -1
- package/dashboard/dist/assets/ToolTestPanel-CfwGdRdz.js +2 -0
- package/dashboard/dist/assets/{ToolTestPanel-Bw4z_Tya.js.map → ToolTestPanel-CfwGdRdz.js.map} +1 -1
- package/dashboard/dist/assets/TopicDetailPage-f2qaeGFz.js +9 -0
- package/dashboard/dist/assets/{TopicDetailPage-CtFztOnn.js.map → TopicDetailPage-f2qaeGFz.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-CwYdVmyK.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-BXdc6pAU.js.map → TopicsPage-CwYdVmyK.js.map} +1 -1
- package/dashboard/dist/assets/UserName-CRE7EZPU.js +2 -0
- package/dashboard/dist/assets/{UserName-R96NG6xB.js.map → UserName-CRE7EZPU.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BjNBu-Zt.js +2 -0
- package/dashboard/dist/assets/{WorkflowExecutionPage-DmRJabMQ.js.map → WorkflowExecutionPage-BjNBu-Zt.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowPill-BtNBSplz.js +2 -0
- package/dashboard/dist/assets/{WorkflowPill-Cc2MlYbB.js.map → WorkflowPill-BtNBSplz.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js +2 -0
- package/dashboard/dist/assets/WorkflowsDashboard-DfpvbzNt.js.map +1 -0
- package/dashboard/dist/assets/WorkflowsOverview-BwD2lQwj.js +2 -0
- package/dashboard/dist/assets/{WorkflowsOverview-BhgE0RS8.js.map → WorkflowsOverview-BwD2lQwj.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowDetailPage-BhHb7j2s.js +33 -0
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-CvIgB5y7.js.map → YamlWorkflowDetailPage-BhHb7j2s.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-SBRpY2dI.js.map +1 -0
- package/dashboard/dist/assets/{agents-BpYMwrsB.js → agents-VbkdqWCr.js} +2 -2
- package/dashboard/dist/assets/{agents-BpYMwrsB.js.map → agents-VbkdqWCr.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DI6Wqp5X.js → bots-CsgYcYU_.js} +2 -2
- package/dashboard/dist/assets/{bots-DI6Wqp5X.js.map → bots-CsgYcYU_.js.map} +1 -1
- package/dashboard/dist/assets/capabilities-CMhFyoDl.js +2 -0
- package/dashboard/dist/assets/{capabilities-BKZZb8eM.js.map → capabilities-CMhFyoDl.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-Djshb7fm.js → controlplane-BstXtPbV.js} +2 -2
- package/dashboard/dist/assets/{controlplane-Djshb7fm.js.map → controlplane-BstXtPbV.js.map} +1 -1
- package/dashboard/dist/assets/escalation-C0BNAeIG.js +2 -0
- package/dashboard/dist/assets/{escalation-D8mrXtjS.js.map → escalation-C0BNAeIG.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-DajPgfuV.js +2 -0
- package/dashboard/dist/assets/{escalation-columns-CyLzgPkz.js.map → escalation-columns-DajPgfuV.js.map} +1 -1
- package/dashboard/dist/assets/index-BWLVqWLU.js +2 -0
- package/dashboard/dist/assets/{index-CQtv2rj6.js.map → index-BWLVqWLU.js.map} +1 -1
- package/dashboard/dist/assets/index-BY5m8rhE.js +2 -0
- package/dashboard/dist/assets/{index-CwAmiy_j.js.map → index-BY5m8rhE.js.map} +1 -1
- package/dashboard/dist/assets/index-BYf0oNSQ.js +6 -0
- package/dashboard/dist/assets/{index-eshNd6NY.js.map → index-BYf0oNSQ.js.map} +1 -1
- package/dashboard/dist/assets/index-BcaQ_hCz.js +9 -0
- package/dashboard/dist/assets/{index-Y6yj36QR.js.map → index-BcaQ_hCz.js.map} +1 -1
- package/dashboard/dist/assets/index-BdqKh0UK.css +1 -0
- package/dashboard/dist/assets/index-C8k3Z2su.js +63 -0
- package/dashboard/dist/assets/index-C8k3Z2su.js.map +1 -0
- package/dashboard/dist/assets/index-CSixdp5W.js +2 -0
- package/dashboard/dist/assets/{index-yxnQew1X.js.map → index-CSixdp5W.js.map} +1 -1
- package/dashboard/dist/assets/index-CXnSqSFH.js +2 -0
- package/dashboard/dist/assets/{index-B5MAG4Uv.js.map → index-CXnSqSFH.js.map} +1 -1
- package/dashboard/dist/assets/index-CaSMWhLU.js +2 -0
- package/dashboard/dist/assets/{index-C71I-f5G.js.map → index-CaSMWhLU.js.map} +1 -1
- package/dashboard/dist/assets/index-Cl1vY8Lg.js +2 -0
- package/dashboard/dist/assets/{index-xn9fmkHC.js.map → index-Cl1vY8Lg.js.map} +1 -1
- package/dashboard/dist/assets/index-CvFQtPWA.js +2 -0
- package/dashboard/dist/assets/{index-CJb3dXku.js.map → index-CvFQtPWA.js.map} +1 -1
- package/dashboard/dist/assets/index-DWlPFH3T.js +6 -0
- package/dashboard/dist/assets/{index-BfxiRwk2.js.map → index-DWlPFH3T.js.map} +1 -1
- package/dashboard/dist/assets/index-D_6JFBiM.js +2 -0
- package/dashboard/dist/assets/{index-DkbnD-Te.js.map → index-D_6JFBiM.js.map} +1 -1
- package/dashboard/dist/assets/index-fqU_l4dC.js +2 -0
- package/dashboard/dist/assets/{index-CphzO7b8.js.map → index-fqU_l4dC.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-C_1r0faY.js → knowledge-Bskl1MbC.js} +2 -2
- package/dashboard/dist/assets/{knowledge-C_1r0faY.js.map → knowledge-Bskl1MbC.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BtG54ZAx.js → mcp-C_qz25AB.js} +2 -2
- package/dashboard/dist/assets/{mcp-BtG54ZAx.js.map → mcp-C_qz25AB.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-CSdQWxmv.js → mcp-query-CJx58s1A.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-CSdQWxmv.js.map → mcp-query-CJx58s1A.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DVkwxN64.js → pipelines-B6GzpgtG.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DVkwxN64.js.map → pipelines-B6GzpgtG.js.map} +1 -1
- package/dashboard/dist/assets/roles-D8lPvFgG.js +2 -0
- package/dashboard/dist/assets/{roles-CpRcUIMm.js.map → roles-D8lPvFgG.js.map} +1 -1
- package/dashboard/dist/assets/tasks-BWHakSYf.js +2 -0
- package/dashboard/dist/assets/{tasks-DNdvW5H6.js.map → tasks-BWHakSYf.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DNC77Chw.js → topics-0dXzPX8t.js} +2 -2
- package/dashboard/dist/assets/{topics-DNC77Chw.js.map → topics-0dXzPX8t.js.map} +1 -1
- package/dashboard/dist/assets/{useCollapsedSections-CGNA5oKV.js → useCollapsedSections-BU5HULGs.js} +2 -2
- package/dashboard/dist/assets/{useCollapsedSections-CGNA5oKV.js.map → useCollapsedSections-BU5HULGs.js.map} +1 -1
- package/dashboard/dist/assets/{useDebouncedValue-DmL3uNt_.js → useDebouncedValue-BA5S7V54.js} +2 -2
- package/dashboard/dist/assets/{useDebouncedValue-DmL3uNt_.js.map → useDebouncedValue-BA5S7V54.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-CUUeBSH1.js → useEventHooks-Dpixlgp-.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-CUUeBSH1.js.map → useEventHooks-Dpixlgp-.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-Ch-a71bE.js → useFilterParams-x-Dg0Vgz.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-Ch-a71bE.js.map → useFilterParams-x-Dg0Vgz.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-D-AjLnPK.js → useNamespace-DQMc77ok.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-D-AjLnPK.js.map → useNamespace-DQMc77ok.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DRdetOb_.js → useYamlActivityEvents-DO5bHOVE.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DRdetOb_.js.map → useYamlActivityEvents-DO5bHOVE.js.map} +1 -1
- package/dashboard/dist/assets/{users-BUgdEsec.js → users-B_LVbnUk.js} +2 -2
- package/dashboard/dist/assets/{users-BUgdEsec.js.map → users-B_LVbnUk.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-CNyYGNsk.js → vendor-icons-DOIDKgo6.js} +116 -121
- package/dashboard/dist/assets/{vendor-icons-CNyYGNsk.js.map → vendor-icons-DOIDKgo6.js.map} +1 -1
- package/dashboard/dist/assets/vendor-query-B2UbickB.js +18 -0
- package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +1 -0
- package/dashboard/dist/assets/vendor-react-CXumBFUA.js +22 -0
- package/dashboard/dist/assets/vendor-react-CXumBFUA.js.map +1 -0
- package/dashboard/dist/assets/{workflows-BfyR5VJt.js → workflows-WmmGDAvo.js} +2 -2
- package/dashboard/dist/assets/{workflows-BfyR5VJt.js.map → workflows-WmmGDAvo.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-Bz7yEnhl.js → yaml-workflows-BS7KHhU1.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-Bz7yEnhl.js.map → yaml-workflows-BS7KHhU1.js.map} +1 -1
- package/dashboard/dist/index.html +5 -5
- package/docs/dashboard.md +58 -42
- package/package.json +1 -1
- package/dashboard/dist/assets/AdminDashboard-Ck5-jV9T.js +0 -2
- package/dashboard/dist/assets/AgentConfigPage-DFiXRBWs.js +0 -16
- package/dashboard/dist/assets/AgentDetailPage-BBgM_pMe.js +0 -4
- package/dashboard/dist/assets/AgentsPage-DxwFuedf.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DNQbeIcn.js +0 -2
- package/dashboard/dist/assets/BotPicker-mqwKVOE3.js +0 -2
- package/dashboard/dist/assets/CapabilitiesPage-Biffm0kW.js +0 -2
- package/dashboard/dist/assets/CollapsibleSection-Bn6Ks79X.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-no0-c_1G.js +0 -2
- package/dashboard/dist/assets/CopyableId-DS6IDMIX.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-C3NyncEB.js +0 -2
- package/dashboard/dist/assets/CronLabel-DQWBx57H.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-DV42oZ1G.js +0 -2
- package/dashboard/dist/assets/DataTable-Bf4dgxll.js +0 -2
- package/dashboard/dist/assets/DropZone-CTSXBb3c.js +0 -2
- package/dashboard/dist/assets/ElapsedCell-roy4G5SQ.js +0 -2
- package/dashboard/dist/assets/EmptyState-CLVm9KmA.js +0 -2
- package/dashboard/dist/assets/EscalationSchemaPage-DulCCxea.js +0 -9
- package/dashboard/dist/assets/EscalationsOverview-DDwxn_mT.js +0 -2
- package/dashboard/dist/assets/EventTable-BaLNvCew.js +0 -2
- package/dashboard/dist/assets/FilterBar-DEAbNQqp.js +0 -2
- package/dashboard/dist/assets/GraphInvokePage-BmM8r0R3.js +0 -2
- package/dashboard/dist/assets/HomePage-Ds3PzWWr.js +0 -2
- package/dashboard/dist/assets/HomePage-Ds3PzWWr.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-Dviaskni.js +0 -2
- package/dashboard/dist/assets/McpOverview-BBm66wbF.js +0 -2
- package/dashboard/dist/assets/McpQueryDetailPage-B6GJOMcz.js +0 -5
- package/dashboard/dist/assets/McpQueryPage-C-8nIdBL.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-CSq_0qqi.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-BdK8ahX7.js.map +0 -1
- package/dashboard/dist/assets/Modal-C6HI6btY.js +0 -2
- package/dashboard/dist/assets/NamespacePill-eGsbJBFa.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DODPFmf2.js +0 -2
- package/dashboard/dist/assets/OperationsPage-DODPFmf2.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-BbmgsOmQ.js +0 -2
- package/dashboard/dist/assets/PageHeader-DcgGV0Y2.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-Cf8TYFRh.js +0 -2
- package/dashboard/dist/assets/PriorityBadge-a7u8C9uY.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-D80w44rV.js +0 -2
- package/dashboard/dist/assets/ProcessesListPage-BjW5xUkv.js +0 -2
- package/dashboard/dist/assets/RoleDetailPage-oahg0cdT.js +0 -11
- package/dashboard/dist/assets/RolePill-BAeaQUXX.js +0 -2
- package/dashboard/dist/assets/RolesPage-BI1Xtqq_.js +0 -2
- package/dashboard/dist/assets/RowActions--m4F6GW8.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DiGzSfiG.js +0 -2
- package/dashboard/dist/assets/StatCard-DCPGFzCv.js +0 -2
- package/dashboard/dist/assets/StatusBadge-mk-dJwPT.js +0 -2
- package/dashboard/dist/assets/StickyPagination-Clm9H840.js +0 -2
- package/dashboard/dist/assets/StreamMessageDetail-Bikvs1Cz.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-C9X3IVqI.js +0 -2
- package/dashboard/dist/assets/TagInput-DmJLnghg.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js +0 -2
- package/dashboard/dist/assets/TaskDetailPage-C0tbiUi7.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill--1OX6egx.js +0 -2
- package/dashboard/dist/assets/TasksListPage-DcYV-GMA.js +0 -2
- package/dashboard/dist/assets/TimeAgo-pYn3T9IZ.js +0 -2
- package/dashboard/dist/assets/TimestampCell-BPMCscic.js +0 -2
- package/dashboard/dist/assets/ToolPill-BnF9lCUX.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-Bw4z_Tya.js +0 -2
- package/dashboard/dist/assets/TopicDetailPage-CtFztOnn.js +0 -9
- package/dashboard/dist/assets/TopicsPage-BXdc6pAU.js +0 -2
- package/dashboard/dist/assets/UserName-R96NG6xB.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-DmRJabMQ.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-Cc2MlYbB.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js +0 -2
- package/dashboard/dist/assets/WorkflowsDashboard-uLU5ZToY.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-BhgE0RS8.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowDetailPage-CvIgB5y7.js +0 -33
- package/dashboard/dist/assets/YamlWorkflowsPage-DWnsgl2v.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-DWnsgl2v.js.map +0 -1
- package/dashboard/dist/assets/capabilities-BKZZb8eM.js +0 -2
- package/dashboard/dist/assets/escalation-D8mrXtjS.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CyLzgPkz.js +0 -2
- package/dashboard/dist/assets/index-B5MAG4Uv.js +0 -2
- package/dashboard/dist/assets/index-BfxiRwk2.js +0 -6
- package/dashboard/dist/assets/index-C71I-f5G.js +0 -2
- package/dashboard/dist/assets/index-CC4g-6QE.css +0 -1
- package/dashboard/dist/assets/index-CJb3dXku.js +0 -2
- package/dashboard/dist/assets/index-CQtv2rj6.js +0 -2
- package/dashboard/dist/assets/index-CphzO7b8.js +0 -2
- package/dashboard/dist/assets/index-CwAmiy_j.js +0 -2
- package/dashboard/dist/assets/index-DgCS2Frb.js +0 -281
- package/dashboard/dist/assets/index-DgCS2Frb.js.map +0 -1
- package/dashboard/dist/assets/index-DkbnD-Te.js +0 -2
- package/dashboard/dist/assets/index-Y6yj36QR.js +0 -9
- package/dashboard/dist/assets/index-eshNd6NY.js +0 -6
- package/dashboard/dist/assets/index-xn9fmkHC.js +0 -2
- package/dashboard/dist/assets/index-yxnQew1X.js +0 -2
- package/dashboard/dist/assets/roles-CpRcUIMm.js +0 -2
- package/dashboard/dist/assets/tasks-DNdvW5H6.js +0 -2
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js +0 -35
- package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +0 -1
- package/dashboard/dist/assets/vendor-react-zA2lQFDs.js +0 -26
- package/dashboard/dist/assets/vendor-react-zA2lQFDs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CQtv2rj6.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/components/common/display/ScopeBadge.tsx","../../src/lib/roleScope.ts","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Service Account\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [selectedScope, setSelectedScope] = useState<'read' | 'full'>('read');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const SCOPE_PRESETS = {\n read: { label: 'Read only', scopes: ['mcp:read'], hint: 'Discovery and monitoring — read-safe tools only' },\n full: { label: 'Full access', scopes: ['mcp:read', 'mcp:full'], hint: 'All tools — can modify state' },\n } as const;\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: SCOPE_PRESETS[selectedScope].scopes as unknown as string[] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {(k.scopes ?? []).map((s: string) => (\n <span key={s} className={`px-1.5 py-0.5 rounded text-[9px] font-mono ${s.includes('full') ? 'bg-status-warning/15 text-status-warning' : 'bg-accent/10 text-accent'}`}>\n {s}\n </span>\n ))}\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <div className=\"flex rounded-md border border-surface-border overflow-hidden shrink-0\">\n {(Object.entries(SCOPE_PRESETS) as [keyof typeof SCOPE_PRESETS, typeof SCOPE_PRESETS[keyof typeof SCOPE_PRESETS]][]).map(([key, preset]) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setSelectedScope(key)}\n title={preset.hint}\n className={`px-2.5 py-1 text-[10px] font-medium transition-colors ${\n selectedScope === key\n ? 'bg-accent text-white'\n : 'bg-surface text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a service account to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2, Search } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n const [search, setSearch] = useState('');\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const filtered = useMemo(() => {\n if (!search.trim()) return bots;\n const q = search.toLowerCase();\n return bots.filter(\n (b) =>\n (b.display_name ?? '').toLowerCase().includes(q) ||\n b.external_id.toLowerCase().includes(q) ||\n (b.description ?? '').toLowerCase().includes(q),\n );\n }, [bots, search]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Service Account',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit service account\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete service account\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6 items-start\">\n <div className=\"overflow-x-clip\">\n {/* Sticky search bar */}\n <div className=\"sticky top-0 z-20 bg-surface pt-3 pb-3\">\n <div className=\"bg-surface-sunken rounded-lg px-5 py-2\">\n <div className=\"relative w-1/2\">\n <Search className=\"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${bots.length} service accounts…`}\n className=\"w-full pl-5 py-1 text-sm bg-transparent border-b border-surface-border/60 text-text-primary placeholder:text-text-quaternary focus:outline-none focus:border-accent/50 transition-colors\"\n />\n </div>\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={filtered}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No service accounts yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <div className=\"sticky top-4\">\n <BotDetailPanel bot={activeBot} />\n </div>\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Service Account\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { Eye, Pencil } from 'lucide-react';\nimport type { LTReadScope, LTWriteScope } from '../../../api/types';\n\nconst SEE: Record<LTReadScope, string> = { self: 'Self', all: 'All' };\nconst ACT: Record<LTWriteScope, string> = { none: 'None', self: 'Self', all: 'All' };\n\n/**\n * Renders a member's work-surface scope as two aligned facts rather than a\n * sentence: what they can **see** (Eye) and what they can **act on** (Pencil).\n * The value cells are fixed-width so `All` / `Self` / `None` line up in a column\n * across stacked rows.\n */\nexport function ScopeBadge({\n read,\n write,\n className = '',\n}: {\n read: LTReadScope;\n write: LTWriteScope;\n className?: string;\n}) {\n return (\n <span className={`inline-flex items-center gap-2.5 text-[10px] text-text-tertiary ${className}`}>\n <span className=\"inline-flex items-center gap-1\" title=\"Can see\">\n <Eye className=\"w-3 h-3 shrink-0 opacity-70\" />\n <span className=\"w-7\">{SEE[read]}</span>\n </span>\n <span className=\"inline-flex items-center gap-1\" title=\"Can act on\">\n <Pencil className=\"w-3 h-3 shrink-0 opacity-70\" />\n <span className=\"w-7\">{ACT[write]}</span>\n </span>\n </span>\n );\n}\n","import type { LTReadScope, LTWriteScope } from '../api/types';\n\n// The work-surface scope a `member` carries, presented as named grants. Each\n// preset is a point in the (read, write) lattice (write ⊆ read). admin/superadmin\n// always act on all and never show a scope picker.\nexport interface ScopePreset {\n value: string; // `${read}|${write}`\n label: string;\n read_scope: LTReadScope;\n write_scope: LTWriteScope;\n}\n\n// Labels are parallel and structured around the two axes (see / act) so the\n// difference between profiles is scannable, not a run-on sentence.\nexport const SCOPE_PRESETS: ScopePreset[] = [\n { value: 'all|all', label: 'See all · act on all', read_scope: 'all', write_scope: 'all' },\n { value: 'all|self', label: 'See all · act on self', read_scope: 'all', write_scope: 'self' },\n { value: 'self|self', label: 'See self · act on self', read_scope: 'self', write_scope: 'self' },\n { value: 'all|none', label: 'See all · read-only', read_scope: 'all', write_scope: 'none' },\n { value: 'self|none', label: 'See self · read-only', read_scope: 'self', write_scope: 'none' },\n];\n\nexport const DEFAULT_SCOPE_VALUE = 'all|all';\n\nexport function scopeKey(read: LTReadScope, write: LTWriteScope): string {\n return `${read}|${write}`;\n}\n\nexport function scopePreset(value: string): ScopePreset {\n return SCOPE_PRESETS.find((p) => p.value === value) ?? SCOPE_PRESETS[0];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { User } from 'lucide-react';\nimport { ScopeBadge } from '../../../components/common/display/ScopeBadge';\nimport {\n SCOPE_PRESETS,\n DEFAULT_SCOPE_VALUE,\n scopePreset,\n} from '../../../lib/roleScope';\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n // Work-surface scope applies to `member`; admin/superadmin act on the whole queue.\n const [newScope, setNewScope] = useState(DEFAULT_SCOPE_VALUE);\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n const preset = newType === 'member' ? scopePreset(newScope) : scopePreset(DEFAULT_SCOPE_VALUE);\n addRole.mutate(\n {\n userId: user.id,\n role: newRole.trim(),\n type: newType,\n read_scope: preset.read_scope,\n write_scope: preset.write_scope,\n },\n { onSuccess: () => { setNewRole(''); setNewType('member'); setNewScope(DEFAULT_SCOPE_VALUE); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-col gap-2 items-start\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"flex items-center gap-2.5 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <span className=\"inline-flex items-center gap-1 w-24 shrink-0 min-w-0\">\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n <span className=\"truncate\" title={r.role}>{r.role}</span>\n </span>\n <span className=\"w-14 shrink-0 text-[9px] uppercase tracking-wide text-text-tertiary\">{r.type}</span>\n {r.type === 'member' && (\n <>\n <span className=\"w-px h-3 bg-surface-border shrink-0\" aria-hidden />\n <ScopeBadge read={r.read_scope} write={r.write_scope} />\n </>\n )}\n <button\n onClick={() => handleRemove(r.role)}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {newType === 'member' && (\n <div className=\"mt-2\">\n <label className=\"block text-[10px] text-text-tertiary mb-1\">Scope</label>\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n className=\"select text-xs w-full\"\n aria-label=\"Work-surface scope\"\n >\n {SCOPE_PRESETS.map((p) => (\n <option key={p.value} value={p.value}>{p.label}</option>\n ))}\n </select>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useAccess } from '../../../hooks/useAccess';\nimport { useUsers, useDeleteUser } from '../../../api/users';\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 { DateValue } from '../../../components/common/display/DateValue';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const { isBuilder } = useAccess();\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = (isBuilder && tabParam === 'service-accounts') ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n docsHash=\"#docs:dashboard.md:accounts\"\n actions={isBuilder ? <AccountTabToggle active={activeTab} onChange={handleTabChange} /> : undefined}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { isBuilder } = useAccess();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-xs text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'email',\n label: 'Email',\n render: (row) =>\n row.email ? (\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{row.email}</span>\n ) : (\n <span className=\"text-xs text-text-quaternary\">—</span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-2 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} size=\"md\" />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n ...(isBuilder ? [{\n key: 'actions' as const,\n label: '',\n render: (row: LTUserRecord) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n }] : []),\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n {isBuilder && (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n )}\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6 items-start\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <div className=\"sticky top-4\">\n <RolePanel user={activeUser} />\n </div>\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsxDEV","Modal","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","selectedScope","setSelectedScope","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","SCOPE_PRESETS","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","s","TimeAgo","Trash2","key","preset","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","search","setSearch","isLoading","useBots","total","bots","activeBot","b","filtered","q","columns","row","TimestampCell","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","Search","DataTable","StickyPagination","SEE","ACT","ScopeBadge","read","write","className","Eye","DEFAULT_SCOPE_VALUE","scopePreset","p","RolePanel","useAddUserRole","useRemoveUserRole","newScope","setNewScope","User","AccountTabToggle","active","onChange","btn","tab","icon","label","Bot","statusOptions","UsersPage","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","tabParam","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u","DateValue","FilterBar","FilterSelect","v"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BWLVqWLU.js","sources":["../../src/pages/admin/users/CreateUserModal.tsx","../../src/pages/admin/users/EditUserModal.tsx","../../src/pages/admin/bots/CreateBotModal.tsx","../../src/pages/admin/bots/EditBotModal.tsx","../../src/pages/admin/bots/BotDetailPanel.tsx","../../src/pages/admin/bots/BotsPage.tsx","../../src/components/common/display/ScopeBadge.tsx","../../src/lib/roleScope.ts","../../src/pages/admin/users/RolePanel.tsx","../../src/pages/admin/users/AccountTabToggle.tsx","../../src/pages/admin/users/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useCreateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateUserModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createUser = useCreateUser();\n const [form, setForm] = useState({\n external_id: '',\n email: '',\n display_name: '',\n password: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ external_id: '', email: '', display_name: '', password: '' });\n }\n\n const handleCreate = () => {\n if (!form.external_id.trim()) return;\n createUser.mutate(\n {\n external_id: form.external_id.trim(),\n email: form.email.trim() || undefined,\n display_name: form.display_name.trim() || undefined,\n password: form.password || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create User\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n External ID (required)\n </label>\n <input\n type=\"text\"\n value={form.external_id}\n onChange={(e) => set('external_id', e.target.value)}\n placeholder=\"e.g., john.doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"John Doe\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => set('email', e.target.value)}\n placeholder=\"john@example.com\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Password\n </label>\n <input\n type=\"password\"\n value={form.password}\n onChange={(e) => set('password', e.target.value)}\n placeholder=\"Leave blank for no password\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createUser.error && (\n <p className=\"text-xs text-status-error\">{(createUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.external_id.trim() || createUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {createUser.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateUser } from '../../../api/users';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { LTUserRecord } from '../../../api/types';\n\nexport function EditUserModal({\n open,\n onClose,\n user,\n}: {\n open: boolean;\n onClose: () => void;\n user: LTUserRecord | null;\n}) {\n const updateUser = useUpdateUser();\n const [form, setForm] = useState({\n display_name: '',\n email: '',\n status: 'active' as string,\n });\n\n const [prevUser, setPrevUser] = useState(user);\n if (user !== prevUser) {\n setPrevUser(user);\n if (user) {\n setForm({\n display_name: user.display_name ?? '',\n email: user.email ?? '',\n status: user.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!user) return;\n updateUser.mutate(\n {\n id: user.id,\n display_name: form.display_name.trim() || undefined,\n email: form.email.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${user?.display_name || user?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Email\n </label>\n <input\n type=\"text\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateUser.error && (\n <p className=\"text-xs text-status-error\">{(updateUser.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateUser.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateUser.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useCreateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\n\nexport function CreateBotModal({\n open,\n onClose,\n}: {\n open: boolean;\n onClose: () => void;\n}) {\n const createBot = useCreateBot();\n const [form, setForm] = useState({\n name: '',\n display_name: '',\n description: '',\n });\n\n const [prevOpen, setPrevOpen] = useState(open);\n if (open !== prevOpen) {\n setPrevOpen(open);\n if (open) setForm({ name: '', display_name: '', description: '' });\n }\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n createBot.mutate(\n {\n name: form.name.trim(),\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n },\n { onSuccess: onClose },\n );\n };\n\n const set = (field: string, value: string) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Service Account\">\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Name (required)\n </label>\n <input\n type=\"text\"\n value={form.name}\n onChange={(e) => set('name', e.target.value.replace(/\\s+/g, '-').toLowerCase())}\n placeholder=\"e.g., ci-bot\"\n className=\"input text-xs w-full font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => set('display_name', e.target.value)}\n placeholder=\"CI Bot\"\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"Runs scheduled workflows\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n {createBot.error && (\n <p className=\"text-xs text-status-error\">{(createBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleCreate}\n disabled={!form.name.trim() || createBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {createBot.isPending ? 'Creating...' : 'Create'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState } from 'react';\nimport { useUpdateBot } from '../../../api/bots';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { BotRecord } from '../../../api/types';\n\nexport function EditBotModal({\n open,\n onClose,\n bot,\n}: {\n open: boolean;\n onClose: () => void;\n bot: BotRecord | null;\n}) {\n const updateBot = useUpdateBot();\n const [form, setForm] = useState({\n display_name: '',\n description: '',\n status: 'active' as string,\n });\n\n const [prevBot, setPrevBot] = useState(bot);\n if (bot !== prevBot) {\n setPrevBot(bot);\n if (bot) {\n setForm({\n display_name: bot.display_name ?? '',\n description: bot.description ?? '',\n status: bot.status,\n });\n }\n }\n\n const handleSave = () => {\n if (!bot) return;\n updateBot.mutate(\n {\n id: bot.id,\n display_name: form.display_name.trim() || undefined,\n description: form.description.trim() || undefined,\n status: form.status,\n },\n { onSuccess: onClose },\n );\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={`Edit — ${bot?.display_name || bot?.external_id || ''}`}\n >\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={form.display_name}\n onChange={(e) => setForm((f) => ({ ...f, display_name: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Description\n </label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => setForm((f) => ({ ...f, description: e.target.value }))}\n className=\"input text-xs w-full\"\n />\n </div>\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Status\n </label>\n <select\n value={form.status}\n onChange={(e) => setForm((f) => ({ ...f, status: e.target.value }))}\n className=\"select text-xs w-full\"\n >\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n <option value=\"suspended\">Suspended</option>\n </select>\n </div>\n\n {updateBot.error && (\n <p className=\"text-xs text-status-error\">{(updateBot.error as Error).message}</p>\n )}\n\n <div className=\"flex justify-end gap-3 pt-2\">\n <button onClick={onClose} className=\"btn-secondary text-xs\">\n Cancel\n </button>\n <button\n onClick={handleSave}\n disabled={updateBot.isPending}\n className=\"btn-primary text-xs\"\n >\n {updateBot.isPending ? 'Saving...' : 'Save'}\n </button>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Trash2, Key, Plus, Copy, Check } from 'lucide-react';\nimport {\n useBotApiKeys,\n useCreateBotApiKey,\n useRevokeBotApiKey,\n useAddBotRole,\n useRemoveBotRole,\n} from '../../../api/bots';\nimport { useRoles } from '../../../api/roles';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimeAgo } from '../../../components/common/display/TimeAgo';\nimport type { BotRecord, BotApiKeyRecord, LTRoleType } from '../../../api/types';\n\nfunction ApiKeysSection({ botId }: { botId: string }) {\n const { data } = useBotApiKeys(botId);\n const createKey = useCreateBotApiKey();\n const revokeKey = useRevokeBotApiKey();\n\n const [newKeyName, setNewKeyName] = useState('');\n const [selectedScope, setSelectedScope] = useState<'read' | 'full'>('read');\n const [generatedKey, setGeneratedKey] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n const [confirmRevoke, setConfirmRevoke] = useState<BotApiKeyRecord | null>(null);\n\n const keys = data?.keys ?? [];\n\n const SCOPE_PRESETS = {\n read: { label: 'Read only', scopes: ['mcp:read'], hint: 'Discovery and monitoring — read-safe tools only' },\n full: { label: 'Full access', scopes: ['mcp:read', 'mcp:full'], hint: 'All tools — can modify state' },\n } as const;\n\n const handleGenerate = () => {\n if (!newKeyName.trim()) return;\n createKey.mutate(\n { botId, name: newKeyName.trim(), scopes: SCOPE_PRESETS[selectedScope].scopes as unknown as string[] },\n {\n onSuccess: (result: any) => {\n setGeneratedKey(result.rawKey);\n setNewKeyName('');\n },\n },\n );\n };\n\n const handleCopy = () => {\n if (!generatedKey) return;\n navigator.clipboard.writeText(generatedKey);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n revokeKey.mutate(\n { botId, keyId: confirmRevoke.id },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n API Keys\n </p>\n\n {generatedKey && (\n <div className=\"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md\">\n <p className=\"text-[10px] font-semibold text-status-success mb-1\">\n Key generated — copy now, it won't be shown again\n </p>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis\">\n {generatedKey}\n </code>\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary shrink-0\"\n title=\"Copy to clipboard\"\n >\n {copied ? <Check className=\"w-3.5 h-3.5 text-status-success\" /> : <Copy className=\"w-3.5 h-3.5\" />}\n </button>\n </div>\n </div>\n )}\n\n {keys.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No API keys.</p>\n ) : (\n <div className=\"space-y-1.5 mb-3\">\n {keys.map((k) => (\n <div\n key={k.id}\n className=\"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs\"\n >\n <div className=\"flex items-center gap-2 flex-wrap\">\n <Key className=\"w-3 h-3 text-text-tertiary\" />\n <span className=\"text-text-primary font-mono\">{k.name}</span>\n {(k.scopes ?? []).map((s: string) => (\n <span key={s} className={`px-1.5 py-0.5 rounded text-[9px] font-mono ${s.includes('full') ? 'bg-status-warning/15 text-status-warning' : 'bg-accent/10 text-accent'}`}>\n {s}\n </span>\n ))}\n {k.last_used_at && (\n <span className=\"text-[10px] text-text-tertiary\">\n used <TimeAgo date={k.last_used_at} />\n </span>\n )}\n </div>\n <button\n onClick={() => setConfirmRevoke(k)}\n className=\"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke key\"\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n value={newKeyName}\n onChange={(e) => setNewKeyName(e.target.value)}\n placeholder=\"Key name...\"\n className=\"input text-xs flex-1 font-mono\"\n />\n <div className=\"flex rounded-md border border-surface-border overflow-hidden shrink-0\">\n {(Object.entries(SCOPE_PRESETS) as [keyof typeof SCOPE_PRESETS, typeof SCOPE_PRESETS[keyof typeof SCOPE_PRESETS]][]).map(([key, preset]) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setSelectedScope(key)}\n title={preset.hint}\n className={`px-2.5 py-1 text-[10px] font-medium transition-colors ${\n selectedScope === key\n ? 'bg-accent text-white'\n : 'bg-surface text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {preset.label}\n </button>\n ))}\n </div>\n <button\n onClick={handleGenerate}\n disabled={!newKeyName.trim() || createKey.isPending}\n className=\"btn-primary text-xs inline-flex items-center gap-1\"\n >\n <Plus className=\"w-3 h-3\" />\n {createKey.isPending ? '...' : 'Generate'}\n </button>\n </div>\n {createKey.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(createKey.error as Error).message}</p>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke API Key\"\n description={\n <>\n Revoke API key{' '}\n <span className=\"font-medium text-text-primary font-mono\">\n {confirmRevoke?.name}\n </span>\n ? This bot will no longer be able to authenticate with this key.\n </>\n }\n isPending={revokeKey.isPending}\n error={revokeKey.error as Error | null}\n />\n </div>\n );\n}\n\nfunction RolesSection({ bot }: { bot: BotRecord }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddBotRole();\n const removeRole = useRemoveBotRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = bot.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!newRole.trim()) return;\n addRole.mutate(\n { botId: bot.id, role: newRole.trim(), type: newType },\n { onSuccess: () => { setNewRole(''); setNewType('member'); } },\n );\n };\n\n const handleRemove = (role: string) => {\n removeRole.mutate({ botId: bot.id, role });\n };\n\n return (\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3\">\n Roles\n </p>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary mb-3\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <RolePill role={r.role} />\n <span className=\"text-[9px] text-text-tertiary\">{r.type}</span>\n <button\n onClick={() => handleRemove(r.role)}\n className=\"text-text-tertiary hover:text-status-error transition-colors ml-0.5\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\nexport function BotDetailPanel({ bot }: { bot: BotRecord | null }) {\n if (!bot) {\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-xs text-text-tertiary\">\n Select a service account to manage its API keys and roles.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6\">\n <div>\n <p className=\"text-sm text-text-primary\">{bot.display_name || bot.external_id}</p>\n {bot.description && (\n <p className=\"text-xs text-text-tertiary mt-0.5\">{bot.description}</p>\n )}\n </div>\n\n <ApiKeysSection botId={bot.id} />\n <RolesSection bot={bot} />\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { Pencil, Trash2, Search } from 'lucide-react';\nimport { useBots, useDeleteBot } from '../../../api/bots';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport type { BotRecord } from '../../../api/types';\nimport { CreateBotModal } from './CreateBotModal';\nimport { EditBotModal } from './EditBotModal';\nimport { BotDetailPanel } from './BotDetailPanel';\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function BotsPage({ embedded = false }: { embedded?: boolean }) {\n const { pagination } = useFilterParams({ filters: {} });\n const deleteBot = useDeleteBot();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingBot, setEditingBot] = useState<BotRecord | null>(null);\n const [selectedBot, setSelectedBot] = useState<BotRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<BotRecord | null>(null);\n const [search, setSearch] = useState('');\n\n const { data, isLoading } = useBots({\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const bots = data?.bots ?? [];\n\n const activeBot = useMemo(() => {\n if (!selectedBot) return null;\n return bots.find((b) => b.id === selectedBot.id) ?? selectedBot;\n }, [bots, selectedBot]);\n\n const filtered = useMemo(() => {\n if (!search.trim()) return bots;\n const q = search.toLowerCase();\n return bots.filter(\n (b) =>\n (b.display_name ?? '').toLowerCase().includes(q) ||\n b.external_id.toLowerCase().includes(q) ||\n (b.description ?? '').toLowerCase().includes(q),\n );\n }, [bots, search]);\n\n const columns: Column<BotRecord>[] = [\n {\n key: 'display_name',\n label: 'Service Account',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <div>\n <p className=\"text-sm text-text-primary\">\n {row.display_name || row.external_id}\n </p>\n {row.description && (\n <p className=\"text-xs text-text-tertiary\">{row.description}</p>\n )}\n </div>\n </div>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-1 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit service account\"\n onClick={() => setEditingBot(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete service account\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteBot.mutate(confirmDelete.id, {\n onSuccess: () => {\n setConfirmDelete(null);\n if (selectedBot?.id === confirmDelete.id) setSelectedBot(null);\n },\n });\n };\n\n return (\n <div>\n {embedded ? (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n </div>\n ) : (\n <PageHeader\n title=\"Service Accounts\"\n actions={\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add Service Account\n </button>\n }\n />\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6 items-start\">\n <div className=\"overflow-x-clip\">\n {/* Sticky search bar */}\n <div className=\"sticky top-0 z-20 bg-surface pt-3 pb-3\">\n <div className=\"bg-surface-sunken rounded-lg px-5 py-2\">\n <div className=\"relative w-1/2\">\n <Search className=\"absolute left-0 top-1/2 -translate-y-1/2 w-3 h-3 text-text-quaternary\" />\n <input\n type=\"text\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={`Search ${bots.length} service accounts…`}\n className=\"w-full pl-5 py-1 text-sm bg-transparent border-b border-surface-border/60 text-text-primary placeholder:text-text-quaternary focus:outline-none focus:border-accent/50 transition-colors\"\n />\n </div>\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={filtered}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No service accounts yet\"\n onRowClick={(row) => setSelectedBot(row)}\n activeRowKey={activeBot?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n <div className=\"sticky top-4\">\n <BotDetailPanel bot={activeBot} />\n </div>\n </div>\n\n <CreateBotModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditBotModal\n open={!!editingBot}\n onClose={() => setEditingBot(null)}\n bot={editingBot}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete Service Account\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This will also revoke all API keys. This action cannot be undone.\n </>\n }\n isPending={deleteBot.isPending}\n error={deleteBot.error as Error | null}\n />\n </div>\n );\n}\n","import { Eye, Pencil } from 'lucide-react';\nimport type { LTReadScope, LTWriteScope } from '../../../api/types';\n\nconst SEE: Record<LTReadScope, string> = { self: 'Self', all: 'All' };\nconst ACT: Record<LTWriteScope, string> = { none: 'None', self: 'Self', all: 'All' };\n\n/**\n * Renders a member's work-surface scope as two aligned facts rather than a\n * sentence: what they can **see** (Eye) and what they can **act on** (Pencil).\n * The value cells are fixed-width so `All` / `Self` / `None` line up in a column\n * across stacked rows.\n */\nexport function ScopeBadge({\n read,\n write,\n className = '',\n}: {\n read: LTReadScope;\n write: LTWriteScope;\n className?: string;\n}) {\n return (\n <span className={`inline-flex items-center gap-2.5 text-[10px] text-text-tertiary ${className}`}>\n <span className=\"inline-flex items-center gap-1\" title=\"Can see\">\n <Eye className=\"w-3 h-3 shrink-0 opacity-70\" />\n <span className=\"w-7\">{SEE[read]}</span>\n </span>\n <span className=\"inline-flex items-center gap-1\" title=\"Can act on\">\n <Pencil className=\"w-3 h-3 shrink-0 opacity-70\" />\n <span className=\"w-7\">{ACT[write]}</span>\n </span>\n </span>\n );\n}\n","import type { LTReadScope, LTWriteScope } from '../api/types';\n\n// The work-surface scope a `member` carries, presented as named grants. Each\n// preset is a point in the (read, write) lattice (write ⊆ read). admin/superadmin\n// always act on all and never show a scope picker.\nexport interface ScopePreset {\n value: string; // `${read}|${write}`\n label: string;\n read_scope: LTReadScope;\n write_scope: LTWriteScope;\n}\n\n// Labels are parallel and structured around the two axes (see / act) so the\n// difference between profiles is scannable, not a run-on sentence.\nexport const SCOPE_PRESETS: ScopePreset[] = [\n { value: 'all|all', label: 'See all · act on all', read_scope: 'all', write_scope: 'all' },\n { value: 'all|self', label: 'See all · act on self', read_scope: 'all', write_scope: 'self' },\n { value: 'self|self', label: 'See self · act on self', read_scope: 'self', write_scope: 'self' },\n { value: 'all|none', label: 'See all · read-only', read_scope: 'all', write_scope: 'none' },\n { value: 'self|none', label: 'See self · read-only', read_scope: 'self', write_scope: 'none' },\n];\n\nexport const DEFAULT_SCOPE_VALUE = 'all|all';\n\nexport function scopeKey(read: LTReadScope, write: LTWriteScope): string {\n return `${read}|${write}`;\n}\n\nexport function scopePreset(value: string): ScopePreset {\n return SCOPE_PRESETS.find((p) => p.value === value) ?? SCOPE_PRESETS[0];\n}\n","import { useState, useMemo } from 'react';\nimport { useRoles } from '../../../api/roles';\nimport { useAddUserRole, useRemoveUserRole } from '../../../api/users';\nimport type { LTUserRecord, LTRoleType } from '../../../api/types';\nimport { User } from 'lucide-react';\nimport { ScopeBadge } from '../../../components/common/display/ScopeBadge';\nimport {\n SCOPE_PRESETS,\n DEFAULT_SCOPE_VALUE,\n scopePreset,\n} from '../../../lib/roleScope';\n\nexport function RolePanel({ user }: { user: LTUserRecord | null }) {\n const { data: allRolesData } = useRoles();\n const addRole = useAddUserRole();\n const removeRole = useRemoveUserRole();\n const [newRole, setNewRole] = useState('');\n const [newType, setNewType] = useState<LTRoleType>('member');\n // Work-surface scope applies to `member`; admin/superadmin act on the whole queue.\n const [newScope, setNewScope] = useState(DEFAULT_SCOPE_VALUE);\n\n const allRoles = allRolesData?.roles ?? [];\n const currentRoles = user?.roles ?? [];\n\n const available = useMemo(() => {\n const assigned = new Set(currentRoles.map((r) => r.role));\n return allRoles.filter((r) => !assigned.has(r));\n }, [allRoles, currentRoles]);\n\n const handleAdd = () => {\n if (!user || !newRole.trim()) return;\n const preset = newType === 'member' ? scopePreset(newScope) : scopePreset(DEFAULT_SCOPE_VALUE);\n addRole.mutate(\n {\n userId: user.id,\n role: newRole.trim(),\n type: newType,\n read_scope: preset.read_scope,\n write_scope: preset.write_scope,\n },\n { onSuccess: () => { setNewRole(''); setNewType('member'); setNewScope(DEFAULT_SCOPE_VALUE); } },\n );\n };\n\n const handleRemove = (role: string) => {\n if (!user) return;\n removeRole.mutate({ userId: user.id, role });\n };\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px]\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4\">\n Role Membership\n </p>\n\n {!user ? (\n <p className=\"text-xs text-text-tertiary\">\n Select a user to manage their roles.\n </p>\n ) : (\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-primary\">{user.display_name || user.external_id}</p>\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">Member of:</p>\n </div>\n\n {currentRoles.length === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No roles assigned.</p>\n ) : (\n <div className=\"flex flex-col gap-2 items-start\">\n {currentRoles.map((r) => (\n <span\n key={r.role}\n className=\"flex items-center gap-2.5 pl-2.5 pr-2 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary\"\n >\n <span className=\"inline-flex items-center gap-1 w-24 shrink-0 min-w-0\">\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n <span className=\"truncate\" title={r.role}>{r.role}</span>\n </span>\n <span className=\"w-14 shrink-0 text-[9px] uppercase tracking-wide text-text-tertiary\">{r.type}</span>\n {r.type === 'member' && (\n <>\n <span className=\"w-px h-3 bg-surface-border shrink-0\" aria-hidden />\n <ScopeBadge read={r.read_scope} write={r.write_scope} />\n </>\n )}\n <button\n onClick={() => handleRemove(r.role)}\n className=\"shrink-0 text-text-tertiary hover:text-status-error transition-colors ml-1\"\n title={`Remove ${r.role}`}\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n\n {available.length > 0 && (\n <div className=\"pt-3 border-t border-surface-border\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Add Role\n </p>\n <div className=\"flex items-center gap-2\">\n <select\n value={newRole}\n onChange={(e) => setNewRole(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n aria-label=\"Role\"\n >\n <option value=\"\">Select a role...</option>\n {available.map((r) => (\n <option key={r} value={r}>{r}</option>\n ))}\n </select>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value as LTRoleType)}\n className=\"select text-xs w-24\"\n aria-label=\"Role type\"\n >\n <option value=\"member\">member</option>\n <option value=\"admin\">admin</option>\n <option value=\"superadmin\">superadmin</option>\n </select>\n <button\n onClick={handleAdd}\n disabled={!newRole || addRole.isPending}\n className=\"btn-primary text-xs\"\n >\n {addRole.isPending ? '...' : 'Add'}\n </button>\n </div>\n {newType === 'member' && (\n <div className=\"mt-2\">\n <label className=\"block text-[10px] text-text-tertiary mb-1\">Scope</label>\n <select\n value={newScope}\n onChange={(e) => setNewScope(e.target.value)}\n className=\"select text-xs w-full\"\n aria-label=\"Work-surface scope\"\n >\n {SCOPE_PRESETS.map((p) => (\n <option key={p.value} value={p.value}>{p.label}</option>\n ))}\n </select>\n </div>\n )}\n {addRole.error && (\n <p className=\"text-[10px] text-status-error mt-1\">{(addRole.error as Error).message}</p>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { User, Bot } from 'lucide-react';\n\nexport type AccountTab = 'users' | 'service-accounts';\n\nexport function AccountTabToggle({ active, onChange }: { active: AccountTab; onChange: (t: AccountTab) => void }) {\n const btn = (tab: AccountTab, icon: React.ReactNode, label: string) => (\n <button\n onClick={() => onChange(tab)}\n className={`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${\n active === tab\n ? 'bg-accent/10 text-accent font-medium'\n : 'text-text-tertiary hover:text-text-secondary hover:bg-surface-hover'\n }`}\n >\n {icon}\n {label}\n </button>\n );\n\n return (\n <div className=\"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit\">\n {btn('users', <User className=\"w-3.5 h-3.5\" />, 'User Accounts')}\n {btn('service-accounts', <Bot className=\"w-3.5 h-3.5\" />, 'Service Accounts')}\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { useAccess } from '../../../hooks/useAccess';\nimport { useUsers, useDeleteUser } from '../../../api/users';\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 { DateValue } from '../../../components/common/display/DateValue';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { LTUserRecord } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { CreateUserModal } from './CreateUserModal';\nimport { EditUserModal } from './EditUserModal';\nimport { BotsPage } from '../bots/BotsPage';\nimport { RolePanel } from './RolePanel';\nimport { AccountTabToggle, type AccountTab } from './AccountTabToggle';\n\nconst statusOptions = [\n { value: 'active', label: 'Active' },\n { value: 'inactive', label: 'Inactive' },\n { value: 'suspended', label: 'Suspended' },\n];\n\nconst statusDot: Record<string, string> = {\n active: 'bg-status-success',\n inactive: 'bg-text-tertiary',\n suspended: 'bg-status-error',\n};\n\nexport function UsersPage() {\n const { isBuilder } = useAccess();\n const [searchParams, setSearchParams] = useSearchParams();\n const tabParam = searchParams.get('tab');\n const activeTab: AccountTab = (isBuilder && tabParam === 'service-accounts') ? 'service-accounts' : 'users';\n\n const handleTabChange = (tab: AccountTab) => {\n if (tab === 'users') {\n setSearchParams({});\n } else {\n setSearchParams({ tab });\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Accounts\"\n docsHash=\"#docs:dashboard.md:accounts\"\n actions={isBuilder ? <AccountTabToggle active={activeTab} onChange={handleTabChange} /> : undefined}\n />\n {activeTab === 'users' ? <UserAccountsPanel /> : <BotsPage embedded />}\n </div>\n );\n}\n\nfunction UserAccountsPanel() {\n const { isBuilder } = useAccess();\n const { filters, setFilter, pagination } = useFilterParams({\n filters: { status: '' },\n });\n const deleteUser = useDeleteUser();\n\n const [showCreate, setShowCreate] = useState(false);\n const [editingUser, setEditingUser] = useState<LTUserRecord | null>(null);\n const [selectedUser, setSelectedUser] = useState<LTUserRecord | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<LTUserRecord | null>(null);\n\n const { data, isLoading } = useUsers({\n status: filters.status || undefined,\n limit: pagination.pageSize,\n offset: pagination.offset,\n });\n\n const total = data?.total ?? 0;\n const users = data?.users ?? [];\n\n const activeUser = useMemo(() => {\n if (!selectedUser) return null;\n return users.find((u) => u.id === selectedUser.id) ?? selectedUser;\n }, [users, selectedUser]);\n\n const columns: Column<LTUserRecord>[] = [\n {\n key: 'display_name',\n label: 'User',\n render: (row) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className={`w-2 h-2 rounded-full dot-ring shrink-0 ${statusDot[row.status] ?? 'bg-status-pending'}`}\n title={row.status}\n />\n <span className=\"text-xs text-text-primary whitespace-nowrap\">\n {row.display_name || row.external_id}\n </span>\n </div>\n ),\n },\n {\n key: 'email',\n label: 'Email',\n render: (row) =>\n row.email ? (\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{row.email}</span>\n ) : (\n <span className=\"text-xs text-text-quaternary\">—</span>\n ),\n },\n {\n key: 'roles',\n label: 'Roles',\n render: (row) => (\n <div className=\"flex gap-2 flex-wrap\">\n {(row.roles ?? []).map((r) => (\n <RolePill key={r.role} role={r.role} size=\"md\" />\n ))}\n </div>\n ),\n },\n {\n key: 'created_at',\n label: 'Created',\n render: (row) => <DateValue date={row.created_at} />,\n className: 'w-36 whitespace-nowrap',\n },\n ...(isBuilder ? [{\n key: 'actions' as const,\n label: '',\n render: (row: LTUserRecord) => (\n <RowActionGroup>\n <RowAction\n icon={Pencil}\n title=\"Edit user\"\n onClick={() => setEditingUser(row)}\n />\n <RowAction\n icon={Trash2}\n title=\"Delete user\"\n onClick={() => setConfirmDelete(row)}\n colorClass=\"text-text-tertiary hover:text-status-error\"\n />\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n }] : []),\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteUser.mutate(confirmDelete.id, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n return (\n <div>\n {isBuilder && (\n <div className=\"flex justify-end mb-4\">\n <button onClick={() => setShowCreate(true)} className=\"btn-primary text-xs\">\n Add User\n </button>\n </div>\n )}\n\n <FilterBar>\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={statusOptions}\n />\n </FilterBar>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6 items-start\">\n {/* Left — users table */}\n <div className=\"overflow-x-clip\">\n <DataTable\n columns={columns}\n data={users}\n keyFn={(row) => row.id}\n isLoading={isLoading}\n emptyMessage=\"No users found\"\n onRowClick={(row) => setSelectedUser(row)}\n activeRowKey={activeUser?.id ?? null}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n\n {/* Right — role management panel */}\n <div className=\"sticky top-4\">\n <RolePanel user={activeUser} />\n </div>\n </div>\n\n <CreateUserModal open={showCreate} onClose={() => setShowCreate(false)} />\n\n <EditUserModal\n open={!!editingUser}\n onClose={() => setEditingUser(null)}\n user={editingUser}\n />\n\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"Delete User\"\n description={\n <>\n Delete{' '}\n <span className=\"font-medium text-text-primary\">\n {confirmDelete?.display_name || confirmDelete?.external_id}\n </span>\n ? This action cannot be undone.\n </>\n }\n isPending={deleteUser.isPending}\n error={deleteUser.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["CreateUserModal","open","onClose","createUser","useCreateUser","form","setForm","useState","prevOpen","setPrevOpen","handleCreate","set","field","value","f","jsx","Modal","jsxs","e","EditUserModal","user","updateUser","useUpdateUser","prevUser","setPrevUser","handleSave","CreateBotModal","createBot","useCreateBot","EditBotModal","bot","updateBot","useUpdateBot","prevBot","setPrevBot","ApiKeysSection","botId","data","useBotApiKeys","createKey","useCreateBotApiKey","revokeKey","useRevokeBotApiKey","newKeyName","setNewKeyName","selectedScope","setSelectedScope","generatedKey","setGeneratedKey","copied","setCopied","confirmRevoke","setConfirmRevoke","keys","SCOPE_PRESETS","handleGenerate","result","handleCopy","handleRevoke","Check","Copy","k","Key","s","TimeAgo","Trash2","key","preset","Plus","ConfirmDeleteModal","Fragment","RolesSection","allRolesData","useRoles","addRole","useAddBotRole","removeRole","useRemoveBotRole","newRole","setNewRole","newType","setNewType","allRoles","currentRoles","available","useMemo","assigned","r","handleAdd","handleRemove","role","RolePill","BotDetailPanel","statusDot","BotsPage","embedded","pagination","useFilterParams","deleteBot","useDeleteBot","showCreate","setShowCreate","editingBot","setEditingBot","selectedBot","setSelectedBot","confirmDelete","setConfirmDelete","search","setSearch","isLoading","useBots","total","bots","activeBot","b","filtered","q","columns","row","TimestampCell","RowActionGroup","RowAction","Pencil","handleDelete","PageHeader","Search","DataTable","StickyPagination","SEE","ACT","ScopeBadge","read","write","className","Eye","DEFAULT_SCOPE_VALUE","scopePreset","p","RolePanel","useAddUserRole","useRemoveUserRole","newScope","setNewScope","User","AccountTabToggle","active","onChange","btn","tab","icon","label","Bot","statusOptions","UsersPage","isBuilder","useAccess","searchParams","setSearchParams","useSearchParams","tabParam","activeTab","handleTabChange","UserAccountsPanel","filters","setFilter","deleteUser","useDeleteUser","editingUser","setEditingUser","selectedUser","setSelectedUser","useUsers","users","activeUser","u","DateValue","FilterBar","FilterSelect","v"],"mappings":"+gCAIO,SAASA,GAAgB,CAC9B,KAAAC,EACA,QAAAC,CACF,EAGG,CACD,MAAMC,EAAaC,EAAA,EACb,CAACC,EAAMC,CAAO,EAAIC,WAAS,CAC/B,YAAa,GACb,MAAO,GACP,aAAc,GACd,SAAU,EAAA,CACX,EAEK,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAASN,CAAI,EACzCA,IAASO,IACXC,EAAYR,CAAI,EACZA,GAAMK,EAAQ,CAAE,YAAa,GAAI,MAAO,GAAI,aAAc,GAAI,SAAU,EAAA,CAAI,GAGlF,MAAMI,EAAe,IAAM,CACpBL,EAAK,YAAY,QACtBF,EAAW,OACT,CACE,YAAaE,EAAK,YAAY,KAAA,EAC9B,MAAOA,EAAK,MAAM,KAAA,GAAU,OAC5B,aAAcA,EAAK,aAAa,KAAA,GAAU,OAC1C,SAAUA,EAAK,UAAY,MAAA,EAE7B,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEMS,EAAM,CAACC,EAAeC,IAC1BP,EAASQ,IAAO,CAAE,GAAGA,EAAG,CAACF,CAAK,EAAGC,GAAQ,EAE3C,OACEE,EAAAA,IAACC,GAAM,KAAAf,EAAY,QAAAC,EAAkB,MAAM,cACzC,SAAAe,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,yBAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMP,EAAI,cAAeO,EAAE,OAAO,KAAK,EAClD,YAAY,iBACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,eAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMP,EAAI,eAAgBO,EAAE,OAAO,KAAK,EACnD,YAAY,WACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,QAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,MACZ,SAAWa,GAAMP,EAAI,QAASO,EAAE,OAAO,KAAK,EAC5C,YAAY,mBACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,WAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,MAAOV,EAAK,SACZ,SAAWa,GAAMP,EAAI,WAAYO,EAAE,OAAO,KAAK,EAC/C,YAAY,8BACZ,UAAU,sBAAA,CAAA,CACZ,EACF,EAECf,EAAW,OACVY,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAZ,EAAW,MAAgB,OAAA,CAAQ,EAGhFc,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,SAAU,CAACL,EAAK,YAAY,KAAA,GAAUF,EAAW,UACjD,UAAU,sBAET,SAAAA,EAAW,UAAY,cAAgB,QAAA,CAAA,CAC1C,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC3GO,SAASgB,GAAc,CAC5B,KAAAlB,EACA,QAAAC,EACA,KAAAkB,CACF,EAIG,CACD,MAAMC,EAAaC,EAAA,EACb,CAACjB,EAAMC,CAAO,EAAIC,WAAS,CAC/B,aAAc,GACd,MAAO,GACP,OAAQ,QAAA,CACT,EAEK,CAACgB,EAAUC,CAAW,EAAIjB,EAAAA,SAASa,CAAI,EACzCA,IAASG,IACXC,EAAYJ,CAAI,EACZA,GACFd,EAAQ,CACN,aAAcc,EAAK,cAAgB,GACnC,MAAOA,EAAK,OAAS,GACrB,OAAQA,EAAK,MAAA,CACd,GAIL,MAAMK,EAAa,IAAM,CAClBL,GACLC,EAAW,OACT,CACE,GAAID,EAAK,GACT,aAAcf,EAAK,aAAa,KAAA,GAAU,OAC1C,MAAOA,EAAK,MAAM,KAAA,GAAU,OAC5B,OAAQA,EAAK,MAAA,EAEf,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEA,OACEa,EAAAA,IAACC,EAAA,CACC,KAAAf,EACA,QAAAC,EACA,MAAO,WAAUkB,GAAA,YAAAA,EAAM,gBAAgBA,GAAA,YAAAA,EAAM,cAAe,EAAE,GAE9D,SAAAH,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,eAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,aAAcI,EAAE,OAAO,OAAQ,EACxE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,QAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,MACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,MAAOI,EAAE,OAAO,OAAQ,EACjE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,SAErG,EACAE,EAAAA,KAAC,SAAA,CACC,MAAOZ,EAAK,OACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,OAAQI,EAAE,OAAO,OAAQ,EAClE,UAAU,wBAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,WAAW,SAAA,WAAQ,EACjCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,WAAA,CAAS,CAAA,CAAA,CAAA,CACrC,EACF,EAECM,EAAW,OACVN,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAM,EAAW,MAAgB,OAAA,CAAQ,EAGhFJ,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASU,EACT,SAAUJ,EAAW,UACrB,UAAU,sBAET,SAAAA,EAAW,UAAY,YAAc,MAAA,CAAA,CACxC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CCzGO,SAASK,GAAe,CAC7B,KAAAzB,EACA,QAAAC,CACF,EAGG,CACD,MAAMyB,EAAYC,EAAA,EACZ,CAACvB,EAAMC,CAAO,EAAIC,WAAS,CAC/B,KAAM,GACN,aAAc,GACd,YAAa,EAAA,CACd,EAEK,CAACC,EAAUC,CAAW,EAAIF,EAAAA,SAASN,CAAI,EACzCA,IAASO,IACXC,EAAYR,CAAI,EACZA,KAAc,CAAE,KAAM,GAAI,aAAc,GAAI,YAAa,GAAI,GAGnE,MAAMS,EAAe,IAAM,CACpBL,EAAK,KAAK,QACfsB,EAAU,OACR,CACE,KAAMtB,EAAK,KAAK,KAAA,EAChB,aAAcA,EAAK,aAAa,KAAA,GAAU,OAC1C,YAAaA,EAAK,YAAY,QAAU,MAAA,EAE1C,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEMS,EAAM,CAACC,EAAeC,IAC1BP,EAASQ,IAAO,CAAE,GAAGA,EAAG,CAACF,CAAK,EAAGC,GAAQ,EAE3C,OACEE,EAAAA,IAACC,GAAM,KAAAf,EAAY,QAAAC,EAAkB,MAAM,yBACzC,SAAAe,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,kBAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,KACZ,SAAWa,GAAMP,EAAI,OAAQO,EAAE,OAAO,MAAM,QAAQ,OAAQ,GAAG,EAAE,aAAa,EAC9E,YAAY,eACZ,UAAU,gCAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,eAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMP,EAAI,eAAgBO,EAAE,OAAO,KAAK,EACnD,YAAY,SACZ,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,cAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMP,EAAI,cAAeO,EAAE,OAAO,KAAK,EAClD,YAAY,2BACZ,UAAU,sBAAA,CAAA,CACZ,EACF,EAECS,EAAU,OACTZ,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAY,EAAU,MAAgB,OAAA,CAAQ,EAG/EV,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASL,EACT,SAAU,CAACL,EAAK,KAAK,KAAA,GAAUsB,EAAU,UACzC,UAAU,sBAET,SAAAA,EAAU,UAAY,cAAgB,QAAA,CAAA,CACzC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CC7FO,SAASE,GAAa,CAC3B,KAAA5B,EACA,QAAAC,EACA,IAAA4B,CACF,EAIG,CACD,MAAMC,EAAYC,EAAA,EACZ,CAAC3B,EAAMC,CAAO,EAAIC,WAAS,CAC/B,aAAc,GACd,YAAa,GACb,OAAQ,QAAA,CACT,EAEK,CAAC0B,EAASC,CAAU,EAAI3B,EAAAA,SAASuB,CAAG,EACtCA,IAAQG,IACVC,EAAWJ,CAAG,EACVA,GACFxB,EAAQ,CACN,aAAcwB,EAAI,cAAgB,GAClC,YAAaA,EAAI,aAAe,GAChC,OAAQA,EAAI,MAAA,CACb,GAIL,MAAML,EAAa,IAAM,CAClBK,GACLC,EAAU,OACR,CACE,GAAID,EAAI,GACR,aAAczB,EAAK,aAAa,KAAA,GAAU,OAC1C,YAAaA,EAAK,YAAY,KAAA,GAAU,OACxC,OAAQA,EAAK,MAAA,EAEf,CAAE,UAAWH,CAAA,CAAQ,CAEzB,EAEA,OACEa,EAAAA,IAACC,EAAA,CACC,KAAAf,EACA,QAAAC,EACA,MAAO,WAAU4B,GAAA,YAAAA,EAAK,gBAAgBA,GAAA,YAAAA,EAAK,cAAe,EAAE,GAE5D,SAAAb,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,eAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,aACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,aAAcI,EAAE,OAAO,OAAQ,EACxE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,cAErG,EACAA,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOV,EAAK,YACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,YAAaI,EAAE,OAAO,OAAQ,EACvE,UAAU,sBAAA,CAAA,CACZ,EACF,SACC,MAAA,CACC,SAAA,CAAAH,EAAAA,IAAC,QAAA,CAAM,UAAU,oFAAoF,SAAA,SAErG,EACAE,EAAAA,KAAC,SAAA,CACC,MAAOZ,EAAK,OACZ,SAAWa,GAAMZ,EAASQ,IAAO,CAAE,GAAGA,EAAG,OAAQI,EAAE,OAAO,OAAQ,EAClE,UAAU,wBAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,WAAW,SAAA,WAAQ,EACjCA,EAAAA,IAAC,SAAA,CAAO,MAAM,YAAY,SAAA,WAAA,CAAS,CAAA,CAAA,CAAA,CACrC,EACF,EAECgB,EAAU,OACThB,MAAC,IAAA,CAAE,UAAU,4BAA8B,SAAAgB,EAAU,MAAgB,OAAA,CAAQ,EAG/Ed,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAF,MAAC,SAAA,CAAO,QAASb,EAAS,UAAU,wBAAwB,SAAA,SAE5D,EACAa,EAAAA,IAAC,SAAA,CACC,QAASU,EACT,SAAUM,EAAU,UACpB,UAAU,sBAET,SAAAA,EAAU,UAAY,YAAc,MAAA,CAAA,CACvC,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CAGN,CC9FA,SAASI,GAAe,CAAE,MAAAC,GAA4B,CACpD,KAAM,CAAE,KAAAC,CAAA,EAASC,EAAcF,CAAK,EAC9BG,EAAYC,GAAA,EACZC,EAAYC,GAAA,EAEZ,CAACC,EAAYC,CAAa,EAAIrC,EAAAA,SAAS,EAAE,EACzC,CAACsC,EAAeC,CAAgB,EAAIvC,EAAAA,SAA0B,MAAM,EACpE,CAACwC,EAAcC,CAAe,EAAIzC,EAAAA,SAAwB,IAAI,EAC9D,CAAC0C,EAAQC,CAAS,EAAI3C,EAAAA,SAAS,EAAK,EACpC,CAAC4C,EAAeC,CAAgB,EAAI7C,EAAAA,SAAiC,IAAI,EAEzE8C,GAAOhB,GAAA,YAAAA,EAAM,OAAQ,CAAA,EAErBiB,EAAgB,CACpB,KAAM,CAAE,MAAO,YAAa,OAAQ,CAAC,UAAU,EAAG,KAAM,iDAAA,EACxD,KAAM,CAAE,MAAO,cAAe,OAAQ,CAAC,WAAY,UAAU,EAAG,KAAM,8BAAA,CAA+B,EAGjGC,EAAiB,IAAM,CACtBZ,EAAW,QAChBJ,EAAU,OACR,CAAE,MAAAH,EAAO,KAAMO,EAAW,KAAA,EAAQ,OAAQW,EAAcT,CAAa,EAAE,MAAA,EACvE,CACE,UAAYW,GAAgB,CAC1BR,EAAgBQ,EAAO,MAAM,EAC7BZ,EAAc,EAAE,CAClB,CAAA,CACF,CAEJ,EAEMa,EAAa,IAAM,CAClBV,IACL,UAAU,UAAU,UAAUA,CAAY,EAC1CG,EAAU,EAAI,EACd,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,EACzC,EAEMQ,EAAe,IAAM,CACpBP,GACLV,EAAU,OACR,CAAE,MAAAL,EAAO,MAAOe,EAAc,EAAA,EAC9B,CAAE,UAAW,IAAMC,EAAiB,IAAI,CAAA,CAAE,CAE9C,EAEA,cACG,MAAA,CACC,SAAA,CAAArC,EAAAA,IAAC,IAAA,CAAE,UAAU,8EAA8E,SAAA,WAE3F,EAECgC,GACC9B,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,qDAAqD,SAAA,oDAElE,EACAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,mHACb,SAAAgC,EACH,EACAhC,EAAAA,IAAC,SAAA,CACC,QAAS0C,EACT,UAAU,sDACV,MAAM,oBAEL,SAAAR,QAAUU,GAAA,CAAM,UAAU,kCAAkC,EAAK5C,EAAAA,IAAC6C,GAAA,CAAK,UAAU,aAAA,CAAc,CAAA,CAAA,CAClG,CAAA,CACF,CAAA,EACF,EAGDP,EAAK,SAAW,EACftC,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAkC,SAAA,cAAA,CAAY,EAE3DA,MAAC,OAAI,UAAU,mBACZ,SAAAsC,EAAK,IAAKQ,GACT5C,EAAAA,KAAC,MAAA,CAEC,UAAU,8FAEV,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACb,SAAA,CAAAF,EAAAA,IAAC+C,GAAA,CAAI,UAAU,4BAAA,CAA6B,EAC5C/C,EAAAA,IAAC,OAAA,CAAK,UAAU,8BAA+B,WAAE,KAAK,GACpD8C,EAAE,QAAU,CAAA,GAAI,IAAKE,SACpB,OAAA,CAAa,UAAW,8CAA8CA,EAAE,SAAS,MAAM,EAAI,2CAA6C,0BAA0B,GAChK,SAAAA,GADQA,CAEX,CACD,EACAF,EAAE,cACD5C,OAAC,OAAA,CAAK,UAAU,iCAAiC,SAAA,CAAA,QAC1CF,EAAAA,IAACiD,GAAA,CAAQ,KAAMH,EAAE,YAAA,CAAc,CAAA,CAAA,CACtC,CAAA,EAEJ,EACA9C,EAAAA,IAAC,SAAA,CACC,QAAS,IAAMqC,EAAiBS,CAAC,EACjC,UAAU,sGACV,MAAM,aAEN,SAAA9C,EAAAA,IAACkD,EAAA,CAAO,UAAU,SAAA,CAAU,CAAA,CAAA,CAC9B,CAAA,EAvBKJ,EAAE,EAAA,CAyBV,EACH,EAGF5C,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAO4B,EACP,SAAWzB,GAAM0B,EAAc1B,EAAE,OAAO,KAAK,EAC7C,YAAY,cACZ,UAAU,gCAAA,CAAA,EAEZH,EAAAA,IAAC,MAAA,CAAI,UAAU,wEACX,SAAA,OAAO,QAAQuC,CAAa,EAAuF,IAAI,CAAC,CAACY,EAAKC,CAAM,IACpIpD,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,QAAS,IAAM+B,EAAiBoB,CAAG,EACnC,MAAOC,EAAO,KACd,UAAW,yDACTtB,IAAkBqB,EACd,uBACA,uDACN,GAEC,SAAAC,EAAO,KAAA,EAVHD,CAAA,CAYR,EACH,EACAjD,EAAAA,KAAC,SAAA,CACC,QAASsC,EACT,SAAU,CAACZ,EAAW,KAAA,GAAUJ,EAAU,UAC1C,UAAU,qDAEV,SAAA,CAAAxB,EAAAA,IAACqD,GAAA,CAAK,UAAU,SAAA,CAAU,EACzB7B,EAAU,UAAY,MAAQ,UAAA,CAAA,CAAA,CACjC,EACF,EACCA,EAAU,OACTxB,MAAC,IAAA,CAAE,UAAU,qCAAuC,SAAAwB,EAAU,MAAgB,OAAA,CAAQ,EAGxFxB,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAAClB,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWM,EACX,MAAM,iBACN,YACEzC,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,iBACe,IACfvD,EAAAA,IAAC,OAAA,CAAK,UAAU,0CACb,0BAAe,KAClB,EAAO,kEAAA,EAET,EAEF,UAAW0B,EAAU,UACrB,MAAOA,EAAU,KAAA,CAAA,CACnB,EACF,CAEJ,CAEA,SAAS8B,GAAa,CAAE,IAAAzC,GAA2B,CACjD,KAAM,CAAE,KAAM0C,CAAA,EAAiBC,EAAA,EACzBC,EAAUC,GAAA,EACVC,EAAaC,GAAA,EACb,CAACC,EAASC,CAAU,EAAIxE,EAAAA,SAAS,EAAE,EACnC,CAACyE,EAASC,CAAU,EAAI1E,EAAAA,SAAqB,QAAQ,EAErD2E,GAAWV,GAAA,YAAAA,EAAc,QAAS,CAAA,EAClCW,EAAerD,EAAI,OAAS,CAAA,EAE5BsD,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAW,IAAI,IAAIH,EAAa,IAAKI,GAAMA,EAAE,IAAI,CAAC,EACxD,OAAOL,EAAS,OAAQK,GAAM,CAACD,EAAS,IAAIC,CAAC,CAAC,CAChD,EAAG,CAACL,EAAUC,CAAY,CAAC,EAErBK,EAAY,IAAM,CACjBV,EAAQ,QACbJ,EAAQ,OACN,CAAE,MAAO5C,EAAI,GAAI,KAAMgD,EAAQ,KAAA,EAAQ,KAAME,CAAA,EAC7C,CAAE,UAAW,IAAM,CAAED,EAAW,EAAE,EAAGE,EAAW,QAAQ,CAAG,CAAA,CAAE,CAEjE,EAEMQ,EAAgBC,GAAiB,CACrCd,EAAW,OAAO,CAAE,MAAO9C,EAAI,GAAI,KAAA4D,EAAM,CAC3C,EAEA,cACG,MAAA,CACC,SAAA,CAAA3E,EAAAA,IAAC,IAAA,CAAE,UAAU,8EAA8E,SAAA,QAE3F,EAECoE,EAAa,SAAW,EACvBpE,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAkC,SAAA,oBAAA,CAAkB,EAEjEA,MAAC,OAAI,UAAU,4BACZ,SAAAoE,EAAa,IAAKI,GACjBtE,EAAAA,KAAC,OAAA,CAEC,UAAU,0GAEV,SAAA,CAAAF,EAAAA,IAAC4E,EAAA,CAAS,KAAMJ,EAAE,IAAA,CAAM,EACxBxE,EAAAA,IAAC,OAAA,CAAK,UAAU,gCAAiC,WAAE,KAAK,EACxDA,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0E,EAAaF,EAAE,IAAI,EAClC,UAAU,sEACV,MAAO,UAAUA,EAAE,IAAI,GACxB,SAAA,GAAA,CAAA,CAED,CAAA,EAXKA,EAAE,IAAA,CAaV,EACH,EAGDH,EAAU,OAAS,GAClBnE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,MAAO6D,EACP,SAAW5D,GAAM6D,EAAW7D,EAAE,OAAO,KAAK,EAC1C,UAAU,kCAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,mBAAgB,EAChCqE,EAAU,IAAKG,GACdxE,EAAAA,IAAC,UAAe,MAAOwE,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAC9B,CAAA,CAAA,CAAA,EAEHtE,EAAAA,KAAC,SAAA,CACC,MAAO+D,EACP,SAAW9D,GAAM+D,EAAW/D,EAAE,OAAO,KAAmB,EACxD,UAAU,sBAEV,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,QAAQ,SAAA,QAAK,EAC3BA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,YAAA,CAAU,CAAA,CAAA,CAAA,EAEvCA,EAAAA,IAAC,SAAA,CACC,QAASyE,EACT,SAAU,CAACV,GAAWJ,EAAQ,UAC9B,UAAU,sBAET,SAAAA,EAAQ,UAAY,MAAQ,KAAA,CAAA,CAC/B,EACF,EAEDA,EAAQ,OACP3D,MAAC,IAAA,CAAE,UAAU,qCAAuC,SAAA2D,EAAQ,MAAgB,OAAA,CAAQ,CAAA,EAExF,CAEJ,CAEO,SAASkB,GAAe,CAAE,IAAA9D,GAAkC,CACjE,OAAKA,EAWHb,EAAAA,KAAC,MAAA,CAAI,UAAU,mEACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,MAAC,KAAE,UAAU,4BAA6B,SAAAe,EAAI,cAAgBA,EAAI,YAAY,EAC7EA,EAAI,aACHf,EAAAA,IAAC,KAAE,UAAU,oCAAqC,WAAI,WAAA,CAAY,CAAA,EAEtE,EAEAA,EAAAA,IAACoB,GAAA,CAAe,MAAOL,EAAI,EAAA,CAAI,EAC/Bf,MAACwD,IAAa,IAAAzC,CAAA,CAAU,CAAA,EAC1B,EAnBEf,EAAAA,IAAC,OAAI,UAAU,yDACb,eAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,4DAAA,CAE1C,CAAA,CACF,CAiBN,CC1RA,MAAM8E,GAAoC,CACxC,OAAQ,oBACR,SAAU,mBACV,UAAW,iBACb,EAEO,SAASC,GAAS,CAAE,SAAAC,EAAW,IAAiC,CACrE,KAAM,CAAE,WAAAC,GAAeC,EAAgB,CAAE,QAAS,CAAA,EAAI,EAChDC,EAAYC,GAAA,EAEZ,CAACC,EAAYC,CAAa,EAAI9F,EAAAA,SAAS,EAAK,EAC5C,CAAC+F,EAAYC,CAAa,EAAIhG,EAAAA,SAA2B,IAAI,EAC7D,CAACiG,EAAaC,CAAc,EAAIlG,EAAAA,SAA2B,IAAI,EAC/D,CAACmG,EAAeC,CAAgB,EAAIpG,EAAAA,SAA2B,IAAI,EACnE,CAACqG,EAAQC,CAAS,EAAItG,EAAAA,SAAS,EAAE,EAEjC,CAAE,KAAA8B,EAAM,UAAAyE,CAAA,EAAcC,GAAQ,CAClC,MAAOf,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKgB,GAAQ3E,GAAA,YAAAA,EAAM,QAAS,EACvB4E,GAAO5E,GAAA,YAAAA,EAAM,OAAQ,CAAA,EAErB6E,EAAY7B,EAAAA,QAAQ,IACnBmB,EACES,EAAK,KAAME,GAAMA,EAAE,KAAOX,EAAY,EAAE,GAAKA,EAD3B,KAExB,CAACS,EAAMT,CAAW,CAAC,EAEhBY,EAAW/B,EAAAA,QAAQ,IAAM,CAC7B,GAAI,CAACuB,EAAO,KAAA,EAAQ,OAAOK,EAC3B,MAAMI,EAAIT,EAAO,YAAA,EACjB,OAAOK,EAAK,OACTE,IACEA,EAAE,cAAgB,IAAI,YAAA,EAAc,SAASE,CAAC,GAC/CF,EAAE,YAAY,cAAc,SAASE,CAAC,IACrCF,EAAE,aAAe,IAAI,cAAc,SAASE,CAAC,CAAA,CAEpD,EAAG,CAACJ,EAAML,CAAM,CAAC,EAEXU,EAA+B,CACnC,CACE,IAAK,eACL,MAAO,kBACP,OAASC,GACPtG,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CACC,UAAW,0CAA0C8E,GAAU0B,EAAI,MAAM,GAAK,mBAAmB,GACjG,MAAOA,EAAI,MAAA,CAAA,SAEZ,MAAA,CACC,SAAA,CAAAxG,MAAC,KAAE,UAAU,4BACV,SAAAwG,EAAI,cAAgBA,EAAI,YAC3B,EACCA,EAAI,aACHxG,EAAAA,IAAC,KAAE,UAAU,6BAA8B,WAAI,WAAA,CAAY,CAAA,CAAA,CAE/D,CAAA,CAAA,CACF,CAAA,EAGJ,CACE,IAAK,QACL,MAAO,QACP,OAASwG,GACPxG,EAAAA,IAAC,OAAI,UAAU,uBACX,UAAAwG,EAAI,OAAS,CAAA,GAAI,IAAKhC,SACrBI,EAAA,CAAsB,KAAMJ,EAAE,IAAA,EAAhBA,EAAE,IAAoB,CACtC,CAAA,CACH,CAAA,EAGJ,CACE,IAAK,aACL,MAAO,UACP,OAASgC,SAASC,GAAA,CAAc,KAAMD,EAAI,WAAY,EACtD,UAAW,MAAA,EAEb,CACE,IAAK,UACL,MAAO,GACP,OAASA,GACPtG,EAAAA,KAACwG,EAAA,CACC,SAAA,CAAA1G,EAAAA,IAAC2G,EAAA,CACC,KAAMC,EACN,MAAM,uBACN,QAAS,IAAMpB,EAAcgB,CAAG,CAAA,CAAA,EAElCxG,EAAAA,IAAC2G,EAAA,CACC,KAAMzD,EACN,MAAM,yBACN,QAAS,IAAM0C,EAAiBY,CAAG,EACnC,WAAW,4CAAA,CAAA,CACb,EACF,EAEF,UAAW,iBAAA,CACb,EAGIK,EAAe,IAAM,CACpBlB,GACLR,EAAU,OAAOQ,EAAc,GAAI,CACjC,UAAW,IAAM,CACfC,EAAiB,IAAI,GACjBH,GAAA,YAAAA,EAAa,MAAOE,EAAc,MAAmB,IAAI,CAC/D,CAAA,CACD,CACH,EAEA,cACG,MAAA,CACE,SAAA,CAAAX,EACChF,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,eAAC,SAAA,CAAO,QAAS,IAAMsF,EAAc,EAAI,EAAG,UAAU,sBAAsB,SAAA,qBAAA,CAE5E,EACF,EAEAtF,EAAAA,IAAC8G,EAAA,CACC,MAAM,mBACN,QACE9G,EAAAA,IAAC,SAAA,CAAO,QAAS,IAAMsF,EAAc,EAAI,EAAG,UAAU,sBAAsB,SAAA,qBAAA,CAE5E,CAAA,CAAA,EAKNpF,EAAAA,KAAC,MAAA,CAAI,UAAU,8DACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBAEb,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,yCACb,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,yCACb,SAAAE,OAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAF,EAAAA,IAAC+G,GAAA,CAAO,UAAU,uEAAA,CAAwE,EAC1F/G,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAO6F,EACP,SAAW1F,GAAM2F,EAAU3F,EAAE,OAAO,KAAK,EACzC,YAAa,UAAU+F,EAAK,MAAM,qBAClC,UAAU,0LAAA,CAAA,CACZ,CAAA,CACF,EACF,EACF,EAEAlG,EAAAA,IAACgH,EAAA,CACC,QAAAT,EACA,KAAMF,EACN,MAAQG,GAAQA,EAAI,GACpB,UAAAT,EACA,aAAa,0BACb,WAAaS,GAAQd,EAAec,CAAG,EACvC,cAAcL,GAAA,YAAAA,EAAW,KAAM,IAAA,CAAA,EAGjCnG,EAAAA,IAACiH,EAAA,CACC,KAAMhC,EAAW,KACjB,WAAYA,EAAW,WAAWgB,CAAK,EACvC,aAAchB,EAAW,QACzB,MAAAgB,EACA,SAAUhB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,EAEAjF,EAAAA,IAAC,OAAI,UAAU,eACb,eAAC6E,GAAA,CAAe,IAAKsB,EAAW,CAAA,CAClC,CAAA,EACF,EAEAnG,MAACW,IAAe,KAAM0E,EAAY,QAAS,IAAMC,EAAc,EAAK,EAAG,EAEvEtF,EAAAA,IAACc,GAAA,CACC,KAAM,CAAC,CAACyE,EACR,QAAS,IAAMC,EAAc,IAAI,EACjC,IAAKD,CAAA,CAAA,EAGPvF,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAACqC,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWiB,EACX,MAAM,yBACN,YACE3G,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,SACO,UACN,OAAA,CAAK,UAAU,gCACb,UAAAoC,GAAA,YAAAA,EAAe,gBAAgBA,GAAA,YAAAA,EAAe,aACjD,EAAO,qEAAA,EAET,EAEF,UAAWR,EAAU,UACrB,MAAOA,EAAU,KAAA,CAAA,CACnB,EACF,CAEJ,CCpNA,MAAM+B,GAAmC,CAAE,KAAM,OAAQ,IAAK,KAAA,EACxDC,GAAoC,CAAE,KAAM,OAAQ,KAAM,OAAQ,IAAK,KAAA,EAQtE,SAASC,GAAW,CACzB,KAAAC,EACA,MAAAC,EACA,UAAAC,EAAY,EACd,EAIG,CACD,OACErH,EAAAA,KAAC,OAAA,CAAK,UAAW,mEAAmEqH,CAAS,GAC3F,SAAA,CAAArH,EAAAA,KAAC,OAAA,CAAK,UAAU,iCAAiC,MAAM,UACrD,SAAA,CAAAF,EAAAA,IAACwH,GAAA,CAAI,UAAU,6BAAA,CAA8B,QAC5C,OAAA,CAAK,UAAU,MAAO,SAAAN,GAAIG,CAAI,CAAA,CAAE,CAAA,EACnC,EACAnH,EAAAA,KAAC,OAAA,CAAK,UAAU,iCAAiC,MAAM,aACrD,SAAA,CAAAF,EAAAA,IAAC4G,EAAA,CAAO,UAAU,6BAAA,CAA8B,QAC/C,OAAA,CAAK,UAAU,MAAO,SAAAO,GAAIG,CAAK,CAAA,CAAE,CAAA,CAAA,CACpC,CAAA,EACF,CAEJ,CCnBO,MAAM/E,EAA+B,CAC1C,CAAE,MAAO,UAAW,MAAO,uBAAwB,WAAY,MAAO,YAAa,KAAA,EACnF,CAAE,MAAO,WAAY,MAAO,wBAAyB,WAAY,MAAO,YAAa,MAAA,EACrF,CAAE,MAAO,YAAa,MAAO,yBAA0B,WAAY,OAAQ,YAAa,MAAA,EACxF,CAAE,MAAO,WAAY,MAAO,sBAAuB,WAAY,MAAO,YAAa,MAAA,EACnF,CAAE,MAAO,YAAa,MAAO,uBAAwB,WAAY,OAAQ,YAAa,MAAA,CACxF,EAEakF,EAAsB,UAM5B,SAASC,EAAY5H,EAA4B,CACtD,OAAOyC,EAAc,KAAMoF,GAAMA,EAAE,QAAU7H,CAAK,GAAKyC,EAAc,CAAC,CACxE,CClBO,SAASqF,GAAU,CAAE,KAAAvH,GAAuC,CACjE,KAAM,CAAE,KAAMoD,CAAA,EAAiBC,EAAA,EACzBC,EAAUkE,EAAA,EACVhE,EAAaiE,EAAA,EACb,CAAC/D,EAASC,CAAU,EAAIxE,EAAAA,SAAS,EAAE,EACnC,CAACyE,EAASC,CAAU,EAAI1E,EAAAA,SAAqB,QAAQ,EAErD,CAACuI,EAAUC,CAAW,EAAIxI,EAAAA,SAASiI,CAAmB,EAEtDtD,GAAWV,GAAA,YAAAA,EAAc,QAAS,CAAA,EAClCW,GAAe/D,GAAA,YAAAA,EAAM,QAAS,CAAA,EAE9BgE,EAAYC,EAAAA,QAAQ,IAAM,CAC9B,MAAMC,EAAW,IAAI,IAAIH,EAAa,IAAKI,GAAMA,EAAE,IAAI,CAAC,EACxD,OAAOL,EAAS,OAAQK,GAAM,CAACD,EAAS,IAAIC,CAAC,CAAC,CAChD,EAAG,CAACL,EAAUC,CAAY,CAAC,EAErBK,EAAY,IAAM,CACtB,GAAI,CAACpE,GAAQ,CAAC0D,EAAQ,OAAQ,OAC9B,MAAMX,EAAgCsE,EAAvBzD,IAAY,SAAuB8D,EAAwBN,CAAhB,EAC1D9D,EAAQ,OACN,CACE,OAAQtD,EAAK,GACb,KAAM0D,EAAQ,KAAA,EACd,KAAME,EACN,WAAYb,EAAO,WACnB,YAAaA,EAAO,WAAA,EAEtB,CAAE,UAAW,IAAM,CAAEY,EAAW,EAAE,EAAGE,EAAW,QAAQ,EAAG8D,EAAYP,CAAmB,CAAG,CAAA,CAAE,CAEnG,EAEM/C,EAAgBC,GAAiB,CAChCtE,GACLwD,EAAW,OAAO,CAAE,OAAQxD,EAAK,GAAI,KAAAsE,EAAM,CAC7C,EAEA,OACEzE,EAAAA,KAAC,MAAA,CAAI,UAAU,yDACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8EAA8E,SAAA,kBAE3F,EAEEK,EAKAH,EAAAA,KAAC,MAAA,CAAI,UAAU,YACb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAF,MAAC,KAAE,UAAU,4BAA6B,SAAAK,EAAK,cAAgBA,EAAK,YAAY,EAChFL,EAAAA,IAAC,IAAA,CAAE,UAAU,wCAAwC,SAAA,YAAA,CAAU,CAAA,EACjE,EAECoE,EAAa,SAAW,EACvBpE,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,oBAAA,CAAkB,EAE5DA,MAAC,OAAI,UAAU,kCACZ,SAAAoE,EAAa,IAAKI,GACjBtE,EAAAA,KAAC,OAAA,CAEC,UAAU,wGAEV,SAAA,CAAAA,EAAAA,KAAC,OAAA,CAAK,UAAU,uDACd,SAAA,CAAAF,EAAAA,IAACiI,EAAA,CAAK,UAAU,qCAAA,CAAsC,EACtDjI,EAAAA,IAAC,QAAK,UAAU,WAAW,MAAOwE,EAAE,KAAO,WAAE,IAAA,CAAK,CAAA,EACpD,EACAxE,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAuE,WAAE,KAAK,EAC7FwE,EAAE,OAAS,UACVtE,EAAAA,KAAAqD,EAAAA,SAAA,CACE,SAAA,CAAAvD,EAAAA,IAAC,OAAA,CAAK,UAAU,sCAAsC,cAAW,GAAC,QACjEoH,GAAA,CAAW,KAAM5C,EAAE,WAAY,MAAOA,EAAE,WAAA,CAAa,CAAA,EACxD,EAEFxE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM0E,EAAaF,EAAE,IAAI,EAClC,UAAU,6EACV,MAAO,UAAUA,EAAE,IAAI,GACxB,SAAA,GAAA,CAAA,CAED,CAAA,EApBKA,EAAE,IAAA,CAsBV,EACH,EAGDH,EAAU,OAAS,GAClBnE,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAF,EAAAA,IAAC,IAAA,CAAE,UAAU,8EAA8E,SAAA,WAE3F,EACAE,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,SAAA,CACC,MAAO6D,EACP,SAAW5D,GAAM6D,EAAW7D,EAAE,OAAO,KAAK,EAC1C,UAAU,kCACV,aAAW,OAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,GAAG,SAAA,mBAAgB,EAChCqE,EAAU,IAAKG,GACdxE,EAAAA,IAAC,UAAe,MAAOwE,EAAI,SAAAA,CAAA,EAAdA,CAAgB,CAC9B,CAAA,CAAA,CAAA,EAEHtE,EAAAA,KAAC,SAAA,CACC,MAAO+D,EACP,SAAW9D,GAAM+D,EAAW/D,EAAE,OAAO,KAAmB,EACxD,UAAU,sBACV,aAAW,YAEX,SAAA,CAAAH,EAAAA,IAAC,SAAA,CAAO,MAAM,SAAS,SAAA,SAAM,EAC7BA,EAAAA,IAAC,SAAA,CAAO,MAAM,QAAQ,SAAA,QAAK,EAC3BA,EAAAA,IAAC,SAAA,CAAO,MAAM,aAAa,SAAA,YAAA,CAAU,CAAA,CAAA,CAAA,EAEvCA,EAAAA,IAAC,SAAA,CACC,QAASyE,EACT,SAAU,CAACV,GAAWJ,EAAQ,UAC9B,UAAU,sBAET,SAAAA,EAAQ,UAAY,MAAQ,KAAA,CAAA,CAC/B,EACF,EACCM,IAAY,UACX/D,OAAC,MAAA,CAAI,UAAU,OACb,SAAA,CAAAF,EAAAA,IAAC,QAAA,CAAM,UAAU,4CAA4C,SAAA,QAAK,EAClEA,EAAAA,IAAC,SAAA,CACC,MAAO+H,EACP,SAAW5H,GAAM6H,EAAY7H,EAAE,OAAO,KAAK,EAC3C,UAAU,wBACV,aAAW,qBAEV,SAAAoC,EAAc,IAAKoF,GAClB3H,EAAAA,IAAC,SAAA,CAAqB,MAAO2H,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,EACF,EAEDhE,EAAQ,OACP3D,MAAC,IAAA,CAAE,UAAU,qCAAuC,SAAA2D,EAAQ,MAAgB,OAAA,CAAQ,CAAA,CAAA,CAExF,CAAA,CAAA,CAEJ,EAjGA3D,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,sCAAA,CAE1C,CA+FA,EAEJ,CAEJ,CCzJO,SAASkI,GAAiB,CAAE,OAAAC,EAAQ,SAAAC,GAAuE,CAChH,MAAMC,EAAM,CAACC,EAAiBC,EAAuBC,IACnDtI,EAAAA,KAAC,SAAA,CACC,QAAS,IAAMkI,EAASE,CAAG,EAC3B,UAAW,8EACTH,IAAWG,EACP,uCACA,qEACN,GAEC,SAAA,CAAAC,EACAC,CAAA,CAAA,CAAA,EAIL,OACEtI,EAAAA,KAAC,MAAA,CAAI,UAAU,sDACZ,SAAA,CAAAmI,EAAI,QAASrI,EAAAA,IAACiI,EAAA,CAAK,UAAU,aAAA,CAAc,EAAI,eAAe,EAC9DI,EAAI,mBAAoBrI,MAACyI,IAAI,UAAU,aAAA,CAAc,EAAI,kBAAkB,CAAA,EAC9E,CAEJ,CCJA,MAAMC,GAAgB,CACpB,CAAE,MAAO,SAAU,MAAO,QAAA,EAC1B,CAAE,MAAO,WAAY,MAAO,UAAA,EAC5B,CAAE,MAAO,YAAa,MAAO,WAAA,CAC/B,EAEM5D,GAAoC,CACxC,OAAQ,oBACR,SAAU,mBACV,UAAW,iBACb,EAEO,SAAS6D,IAAY,CAC1B,KAAM,CAAE,UAAAC,CAAA,EAAcC,EAAA,EAChB,CAACC,EAAcC,CAAe,EAAIC,GAAA,EAClCC,EAAWH,EAAa,IAAI,KAAK,EACjCI,EAAyBN,GAAaK,IAAa,mBAAsB,mBAAqB,QAE9FE,EAAmBb,GAAoB,CAEzCS,EADET,IAAQ,QACM,CAAA,EAEA,CAAE,IAAAA,EAFA,CAItB,EAEA,cACG,MAAA,CACC,SAAA,CAAAtI,EAAAA,IAAC8G,EAAA,CACC,MAAM,WACN,SAAS,8BACT,QAAS8B,EAAY5I,EAAAA,IAACkI,GAAA,CAAiB,OAAQgB,EAAW,SAAUC,EAAiB,EAAK,MAAA,CAAA,EAE3FD,IAAc,QAAUlJ,EAAAA,IAACoJ,GAAA,CAAA,CAAkB,EAAKpJ,EAAAA,IAAC+E,GAAA,CAAS,SAAQ,EAAA,CAAC,CAAA,EACtE,CAEJ,CAEA,SAASqE,IAAoB,CAC3B,KAAM,CAAE,UAAAR,CAAA,EAAcC,EAAA,EAChB,CAAE,QAAAQ,EAAS,UAAAC,EAAW,WAAArE,CAAA,EAAeC,EAAgB,CACzD,QAAS,CAAE,OAAQ,EAAA,CAAG,CACvB,EACKqE,EAAaC,EAAA,EAEb,CAACnE,EAAYC,CAAa,EAAI9F,EAAAA,SAAS,EAAK,EAC5C,CAACiK,EAAaC,CAAc,EAAIlK,EAAAA,SAA8B,IAAI,EAClE,CAACmK,EAAcC,CAAe,EAAIpK,EAAAA,SAA8B,IAAI,EACpE,CAACmG,EAAeC,CAAgB,EAAIpG,EAAAA,SAA8B,IAAI,EAEtE,CAAE,KAAA8B,EAAM,UAAAyE,CAAA,EAAc8D,EAAS,CACnC,OAAQR,EAAQ,QAAU,OAC1B,MAAOpE,EAAW,SAClB,OAAQA,EAAW,MAAA,CACpB,EAEKgB,GAAQ3E,GAAA,YAAAA,EAAM,QAAS,EACvBwI,GAAQxI,GAAA,YAAAA,EAAM,QAAS,CAAA,EAEvByI,EAAazF,EAAAA,QAAQ,IACpBqF,EACEG,EAAM,KAAME,GAAMA,EAAE,KAAOL,EAAa,EAAE,GAAKA,EAD5B,KAEzB,CAACG,EAAOH,CAAY,CAAC,EAElBpD,EAAkC,CACtC,CACE,IAAK,eACL,MAAO,OACP,OAASC,GACPtG,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAF,EAAAA,IAAC,OAAA,CACC,UAAW,0CAA0C8E,GAAU0B,EAAI,MAAM,GAAK,mBAAmB,GACjG,MAAOA,EAAI,MAAA,CAAA,QAEZ,OAAA,CAAK,UAAU,8CACb,SAAAA,EAAI,cAAgBA,EAAI,WAAA,CAC3B,CAAA,CAAA,CACF,CAAA,EAGJ,CACE,IAAK,QACL,MAAO,QACP,OAASA,GACPA,EAAI,YACD,OAAA,CAAK,UAAU,gDAAiD,SAAAA,EAAI,MAAM,EAE3ExG,MAAC,OAAA,CAAK,UAAU,+BAA+B,SAAA,GAAA,CAAC,CAAA,EAGtD,CACE,IAAK,QACL,MAAO,QACP,OAASwG,GACPxG,EAAAA,IAAC,MAAA,CAAI,UAAU,uBACX,UAAAwG,EAAI,OAAS,CAAA,GAAI,IAAKhC,GACtBxE,EAAAA,IAAC4E,EAAA,CAAsB,KAAMJ,EAAE,KAAM,KAAK,IAAA,EAA3BA,EAAE,IAA8B,CAChD,CAAA,CACH,CAAA,EAGJ,CACE,IAAK,aACL,MAAO,UACP,OAASgC,SAASyD,EAAA,CAAU,KAAMzD,EAAI,WAAY,EAClD,UAAW,wBAAA,EAEb,GAAIoC,EAAY,CAAC,CACf,IAAK,UACL,MAAO,GACP,OAASpC,GACPtG,EAAAA,KAACwG,EAAA,CACC,SAAA,CAAA1G,EAAAA,IAAC2G,EAAA,CACC,KAAMC,EACN,MAAM,YACN,QAAS,IAAM8C,EAAelD,CAAG,CAAA,CAAA,EAEnCxG,EAAAA,IAAC2G,EAAA,CACC,KAAMzD,EACN,MAAM,cACN,QAAS,IAAM0C,EAAiBY,CAAG,EACnC,WAAW,4CAAA,CAAA,CACb,EACF,EAEF,UAAW,iBAAA,CACZ,EAAI,CAAA,CAAC,EAGFK,EAAe,IAAM,CACpBlB,GACL4D,EAAW,OAAO5D,EAAc,GAAI,CAClC,UAAW,IAAMC,EAAiB,IAAI,CAAA,CACvC,CACH,EAEA,cACG,MAAA,CACE,SAAA,CAAAgD,GACC5I,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,eAAC,SAAA,CAAO,QAAS,IAAMsF,EAAc,EAAI,EAAG,UAAU,sBAAsB,oBAE5E,EACF,QAGD4E,EAAA,CACC,SAAAlK,EAAAA,IAACmK,EAAA,CACC,MAAM,SACN,MAAOd,EAAQ,OACf,SAAWe,GAAMd,EAAU,SAAUc,CAAC,EACtC,QAAS1B,EAAA,CAAA,EAEb,EAEAxI,EAAAA,KAAC,MAAA,CAAI,UAAU,8DAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACb,SAAA,CAAAF,EAAAA,IAACgH,EAAA,CACC,QAAAT,EACA,KAAMuD,EACN,MAAQtD,GAAQA,EAAI,GACpB,UAAAT,EACA,aAAa,iBACb,WAAaS,GAAQoD,EAAgBpD,CAAG,EACxC,cAAcuD,GAAA,YAAAA,EAAY,KAAM,IAAA,CAAA,EAGlC/J,EAAAA,IAACiH,EAAA,CACC,KAAMhC,EAAW,KACjB,WAAYA,EAAW,WAAWgB,CAAK,EACvC,aAAchB,EAAW,QACzB,MAAAgB,EACA,SAAUhB,EAAW,SACrB,iBAAkBA,EAAW,WAAA,CAAA,CAC/B,EACF,EAGAjF,EAAAA,IAAC,OAAI,UAAU,eACb,eAAC4H,GAAA,CAAU,KAAMmC,EAAY,CAAA,CAC/B,CAAA,EACF,EAEA/J,MAACf,IAAgB,KAAMoG,EAAY,QAAS,IAAMC,EAAc,EAAK,EAAG,EAExEtF,EAAAA,IAACI,GAAA,CACC,KAAM,CAAC,CAACqJ,EACR,QAAS,IAAMC,EAAe,IAAI,EAClC,KAAMD,CAAA,CAAA,EAGRzJ,EAAAA,IAACsD,EAAA,CACC,KAAM,CAAC,CAACqC,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWiB,EACX,MAAM,cACN,YACE3G,EAAAA,KAAAqD,WAAA,CAAE,SAAA,CAAA,SACO,UACN,OAAA,CAAK,UAAU,gCACb,UAAAoC,GAAA,YAAAA,EAAe,gBAAgBA,GAAA,YAAAA,EAAe,aACjD,EAAO,iCAAA,EAET,EAEF,UAAW4D,EAAW,UACtB,MAAOA,EAAW,KAAA,CAAA,CACpB,EACF,CAEJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as p,j as a}from"./vendor-query-B2UbickB.js";import{a as N}from"./vendor-react-CXumBFUA.js";import{u as P,a as T,b as F,S as C,c as M,d as O,e as $}from"./StreamMessageDetail-70kDFH4o.js";import{u as z}from"./useFilterParams-x-Dg0Vgz.js";import{u as A}from"./useNamespace-DQMc77ok.js";import{b as D}from"./api-path-u2Jf9QXS.js";import{D as R}from"./DataTable-ZWgVQg7F.js";import{S as E}from"./StickyPagination-3eCY2-_V.js";import{F as L,b as u,a as b}from"./FilterBar-B4Mk2PvT.js";import{T as x}from"./TimestampCell-CDR6cTyq.js";import{P as U}from"./PageHeader-DJo7yMUR.js";import{L as I}from"./ListToolbar-d4MGQefV.js";import{X as f}from"./vendor-icons-DOIDKgo6.js";import"./index-C8k3Z2su.js";import"./controlplane-BstXtPbV.js";import"./EmptyState-BcsfPq9T.js";function B(o,i){if(o.length<=i)return o;const s=Math.floor((i-1)/2);return`${o.slice(0,s)}…${o.slice(-s)}`}function oe(){const{namespace:o,available:i}=A("namespace"),{filters:s,setFilter:t,pagination:r,sort:n,setSort:_}=z({filters:{namespace:"",source:"worker",status:"",stream_name:"",msg_type:"",topic:"",workflow_name:"",jid:"",aid:""}}),[m,g]=p.useState(null),h=p.useMemo(()=>i.map(e=>({value:e,label:e})),[i]),{data:l,isLoading:j,refetch:v,isFetching:k}=P({namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0}),d=(l==null?void 0:l.messages)??[],y=(l==null?void 0:l.total)??0,c=p.useMemo(()=>m?d.find(e=>e.id===m.id&&e.source===m.source)??m:null,[d,m]),S=!!c,w=[{key:"status",label:"Status",render:e=>a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:`w-2 h-2 rounded-full dot-ring shrink-0 ${M[e.status]}`}),a.jsx("span",{className:"text-xs",children:O[e.status]})]}),className:"w-28"},{key:"source",label:"Source",render:e=>a.jsx("span",{className:$,children:e.source}),className:"w-20"},{key:"stream_name",label:"Stream",sortable:!0,render:e=>a.jsx("span",{className:"font-mono text-xs text-text-secondary truncate block max-w-[240px]",title:e.stream_name,children:e.stream_name})},{key:"msg_type",label:"Type",render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.msg_type||"—"}),className:"w-24"},{key:"created_at",label:"Created",sortable:!0,render:e=>a.jsx(x,{date:e.created_at}),className:"w-44"},{key:"reserved_at",label:"Reserved",render:e=>e.reserved_at?a.jsx(x,{date:e.reserved_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"expired_at",label:"Processed",render:e=>e.expired_at?a.jsx(x,{date:e.expired_at}):a.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"w-44"},{key:"priority",label:"Pri",sortable:!0,render:e=>a.jsx("span",{className:"text-xs text-text-secondary",children:e.priority}),className:"w-12 text-right"},{key:"retry_attempt",label:"Retries",render:e=>a.jsxs("span",{className:"text-xs text-text-secondary",children:[e.retry_attempt,"/",e.max_retry_attempts]}),className:"w-16"}];return a.jsxs("div",{children:[a.jsx(U,{title:"Messages",docsHash:"#docs:dashboard.md:messages"}),a.jsxs(L,{actions:a.jsx(I,{onRefresh:()=>v(),isFetching:k,apiPath:D("/controlplane/stream-messages",{namespace:s.namespace||o,source:s.source||"worker",limit:r.pageSize,offset:r.offset,sort_by:n.sort_by||"created_at",order:n.order||"desc",status:s.status||void 0,stream_name:s.stream_name||void 0,msg_type:s.msg_type||void 0,topic:s.topic||void 0,workflow_name:s.workflow_name||void 0,jid:s.jid||void 0,aid:s.aid||void 0})}),children:[a.jsx(u,{label:"Namespace",value:s.namespace,onChange:e=>t("namespace",e),options:h,required:!0}),a.jsx(u,{label:"Source",value:s.source,onChange:e=>t("source",e),options:T,required:!0}),a.jsx(u,{label:"Status",value:s.status,onChange:e=>t("status",e),options:F}),a.jsx(b,{label:"Stream",value:s.stream_name,onChange:e=>t("stream_name",e),placeholder:"Filter by stream name…"}),a.jsx(b,{label:"Job ID",value:s.jid,onChange:e=>t("jid",e),placeholder:"Filter by jid…"}),[{key:"topic",label:"Topic",value:s.topic},{key:"workflow_name",label:"Workflow",value:s.workflow_name},{key:"aid",label:"Activity",value:s.aid},{key:"msg_type",label:"Type",value:s.msg_type}].filter(e=>e.value).map(e=>a.jsxs("button",{onClick:()=>t(e.key,""),className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors",title:`Clear ${e.label} filter: ${e.value}`,children:[e.label,": ",B(e.value,12),a.jsx(f,{className:"w-2.5 h-2.5"})]},e.key))]}),a.jsx(R,{columns:w,data:d,keyFn:e=>`${e.source}:${e.id}`,isLoading:j,emptyMessage:"No stream messages found",onRowClick:e=>g(e),activeRowKey:c?`${c.source}:${c.id}`:null,sort:n,onSort:_}),a.jsx(E,{page:r.page,totalPages:r.totalPages(y),onPageChange:r.setPage,total:y,pageSize:r.pageSize,onPageSizeChange:r.setPageSize}),S&&N.createPortal(a.jsxs("div",{className:"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg",style:{top:"3.5rem"},children:[a.jsxs("div",{className:"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50",children:[a.jsx("span",{className:"text-xs font-medium text-text-primary",children:"Message Detail"}),a.jsx("button",{onClick:()=>g(null),className:"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors",title:"Close",children:a.jsx(f,{className:"w-4 h-4"})})]}),a.jsx("div",{className:"px-4 py-4",children:a.jsx(C,{message:c,filters:{onFilterStatus:e=>t("status",e),onFilterStreamName:e=>t("stream_name",e),onFilterMsgType:e=>t("msg_type",e),onFilterTopic:e=>t("topic",e),onFilterWorkflow:e=>t("workflow_name",e),onFilterJid:e=>t("jid",e),onFilterAid:e=>t("aid",e)}})})]}),document.body)]})}export{oe as StreamMessagesPage};
|
|
2
|
+
//# sourceMappingURL=index-BY5m8rhE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-CwAmiy_j.js","sources":["../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useNamespace } from '../../../hooks/useNamespace';\nimport { buildApiPath } from '../../../lib/api-path';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nfunction truncateMiddle(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor((max - 1) / 2);\n return `${str.slice(0, half)}…${str.slice(-half)}`;\n}\n\nexport function StreamMessagesPage() {\n const { namespace, available } = useNamespace('namespace');\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: '', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const namespaceOptions = useMemo(\n () => available.map((id) => ({ value: id, label: id })),\n [available],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || namespace,\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full dot-ring shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/controlplane/stream-messages', {\n namespace: filters.namespace || namespace,\n source: filters.source || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: filters.status || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n <FilterInput\n label=\"Job ID\"\n value={filters.jid}\n onChange={(v) => setFilter('jid', v)}\n placeholder=\"Filter by jid…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter: ${f.value}`}\n >\n {f.label}: {truncateMiddle(f.value, 12)}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\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 {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["truncateMiddle","str","max","half","StreamMessagesPage","namespace","available","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","namespaceOptions","useMemo","id","data","isLoading","refetch","isFetching","useStreamMessages","messages","total","activeMessage","m","panelOpen","columns","row","jsxDEV","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","TimestampCell","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","SOURCE_OPTIONS","STATUS_OPTIONS","FilterInput","f","X","DataTable","StickyPagination","createPortal","StreamMessageDetail"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-BY5m8rhE.js","sources":["../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useNamespace } from '../../../hooks/useNamespace';\nimport { buildApiPath } from '../../../lib/api-path';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nfunction truncateMiddle(str: string, max: number): string {\n if (str.length <= max) return str;\n const half = Math.floor((max - 1) / 2);\n return `${str.slice(0, half)}…${str.slice(-half)}`;\n}\n\nexport function StreamMessagesPage() {\n const { namespace, available } = useNamespace('namespace');\n\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: '', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const namespaceOptions = useMemo(\n () => available.map((id) => ({ value: id, label: id })),\n [available],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || namespace,\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full dot-ring shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/controlplane/stream-messages', {\n namespace: filters.namespace || namespace,\n source: filters.source || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: filters.status || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n <FilterInput\n label=\"Job ID\"\n value={filters.jid}\n onChange={(v) => setFilter('jid', v)}\n placeholder=\"Filter by jid…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter: ${f.value}`}\n >\n {f.label}: {truncateMiddle(f.value, 12)}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\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 {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["truncateMiddle","str","max","half","StreamMessagesPage","namespace","available","useNamespace","filters","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","namespaceOptions","useMemo","id","data","isLoading","refetch","isFetching","useStreamMessages","messages","total","activeMessage","m","panelOpen","columns","row","jsxs","jsx","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","TimestampCell","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","SOURCE_OPTIONS","STATUS_OPTIONS","FilterInput","f","X","DataTable","StickyPagination","createPortal","StreamMessageDetail"],"mappings":"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"}
|