@hotmeshio/long-tail 0.4.0 → 0.4.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/build/api/controlplane.d.ts +1 -0
- package/build/api/controlplane.js +1 -0
- package/build/routes/controlplane.js +2 -2
- package/build/services/iam/activity.d.ts +4 -3
- package/build/services/iam/activity.js +5 -5
- package/dashboard/dist/assets/{AdminDashboard-CR0FtTE6.js → AdminDashboard-C0_qN2h3.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-CR0FtTE6.js.map → AdminDashboard-C0_qN2h3.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-BVypgq9m.js → AgentConfigPage-DG1zOIiz.js} +5 -5
- package/dashboard/dist/assets/{AgentConfigPage-BVypgq9m.js.map → AgentConfigPage-DG1zOIiz.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-D64ath8c.js → AgentDetailPage-B5kaAJDM.js} +3 -3
- package/dashboard/dist/assets/{AgentDetailPage-D64ath8c.js.map → AgentDetailPage-B5kaAJDM.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-j-zblMNR.js → AgentsPage-DJWSuoJA.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-j-zblMNR.js.map → AgentsPage-DJWSuoJA.js.map} +1 -1
- package/dashboard/dist/assets/{AvailableEscalationsPage-DmUid1h0.js → AvailableEscalationsPage-DrarbHov.js} +2 -2
- package/dashboard/dist/assets/{AvailableEscalationsPage-DmUid1h0.js.map → AvailableEscalationsPage-DrarbHov.js.map} +1 -1
- package/dashboard/dist/assets/{BotPicker-DCScT8BN.js → BotPicker-CvXQwE5Z.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-DCScT8BN.js.map → BotPicker-CvXQwE5Z.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-g5iUvHRL.js → CapabilitiesPage-BiL9QUxI.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-g5iUvHRL.js.map → CapabilitiesPage-BiL9QUxI.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-Dj1YOsVG.js → CollapsibleSection-D9F01Tny.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-Dj1YOsVG.js.map → CollapsibleSection-D9F01Tny.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-Dvb4QelY.js → CredentialsPage-C-rjAIK3.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-Dvb4QelY.js.map → CredentialsPage-C-rjAIK3.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-sk1BkcJd.js → CronLabel-DnZF8_vw.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-sk1BkcJd.js.map → CronLabel-DnZF8_vw.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-C0MV2Q06.js → CustomDurationPicker-BYDrcsYT.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-C0MV2Q06.js.map → CustomDurationPicker-BYDrcsYT.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-DN8uwUtf.js → DropZone-BEW3jBzf.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DN8uwUtf.js.map → DropZone-BEW3jBzf.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-CFXhhKKc.js → ElapsedCell-BkiVdGaJ.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-CFXhhKKc.js.map → ElapsedCell-BkiVdGaJ.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-BEuUFGwC.js → EscalationsOverview-Cg2SN0WK.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-BEuUFGwC.js.map → EscalationsOverview-Cg2SN0WK.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-DcwVWOKb.js → EventTable-B9wYf13g.js} +2 -2
- package/dashboard/dist/assets/{EventTable-DcwVWOKb.js.map → EventTable-B9wYf13g.js.map} +1 -1
- package/dashboard/dist/assets/{EventTopicPill-CWCP1v1O.js → EventTopicPill-By-6sXDp.js} +2 -2
- package/dashboard/dist/assets/{EventTopicPill-CWCP1v1O.js.map → EventTopicPill-By-6sXDp.js.map} +1 -1
- package/dashboard/dist/assets/{HomePage-BH-F5ws9.js → HomePage-74mCQ5nB.js} +2 -2
- package/dashboard/dist/assets/{HomePage-BH-F5ws9.js.map → HomePage-74mCQ5nB.js.map} +1 -1
- package/dashboard/dist/assets/ListToolbar-DL1wEuvL.js +2 -0
- package/dashboard/dist/assets/{ListToolbar-CUxJlz__.js.map → ListToolbar-DL1wEuvL.js.map} +1 -1
- package/dashboard/dist/assets/{McpOverview-O8XrOzy0.js → McpOverview-D34bLMuP.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-O8XrOzy0.js.map → McpOverview-D34bLMuP.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-DhiR0Xrx.js → McpQueryDetailPage-gLGTGX6g.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-DhiR0Xrx.js.map → McpQueryDetailPage-gLGTGX6g.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Czot0nfl.js → McpQueryPage-wPHJkhEp.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Czot0nfl.js.map → McpQueryPage-wPHJkhEp.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-B1kNnD_t.js → McpRunDetailPage-SoXudCbq.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-B1kNnD_t.js.map → McpRunDetailPage-SoXudCbq.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-QUY3pWp9.js → McpRunsPage-BUSxdydO.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-QUY3pWp9.js.map → McpRunsPage-BUSxdydO.js.map} +1 -1
- package/dashboard/dist/assets/{OperatorDashboard-BG1Q9qZk.js → OperatorDashboard-CYCl2our.js} +2 -2
- package/dashboard/dist/assets/{OperatorDashboard-BG1Q9qZk.js.map → OperatorDashboard-CYCl2our.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeader-DlzOOM4Y.js → PageHeader-Bo0SpcCK.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-DlzOOM4Y.js.map → PageHeader-Bo0SpcCK.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-C5cZ3IOO.js → PageHeaderWithStats-7K5BdhOj.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-C5cZ3IOO.js.map → PageHeaderWithStats-7K5BdhOj.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-DS1AwTso.js → ProcessDetailPage-DzGacZpO.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-DS1AwTso.js.map → ProcessDetailPage-DzGacZpO.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-CAmVcn1P.js → ProcessesListPage-Bmn33g_l.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CAmVcn1P.js.map → ProcessesListPage-Bmn33g_l.js.map} +1 -1
- package/dashboard/dist/assets/{RolePill-BZaUpkHg.js → RolePill-BDzPFQUv.js} +2 -2
- package/dashboard/dist/assets/{RolePill-BZaUpkHg.js.map → RolePill-BDzPFQUv.js.map} +1 -1
- package/dashboard/dist/assets/{RolesPage-CFdIXfmv.js → RolesPage-BTtaabkS.js} +2 -2
- package/dashboard/dist/assets/{RolesPage-CFdIXfmv.js.map → RolesPage-BTtaabkS.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-BGww9lta.js → RunAsSelector-B1R8nJvE.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-BGww9lta.js.map → RunAsSelector-B1R8nJvE.js.map} +1 -1
- package/dashboard/dist/assets/{ServerName-DfS3pfon.js → ServerName-CEOFF7UG.js} +2 -2
- package/dashboard/dist/assets/{ServerName-DfS3pfon.js.map → ServerName-CEOFF7UG.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-C2hGjy0V.js → SwimlaneTimeline-CU2ZD9cC.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-C2hGjy0V.js.map → SwimlaneTimeline-CU2ZD9cC.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D21mrQx6.js → TagInput-VBY0xIwb.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D21mrQx6.js.map → TagInput-VBY0xIwb.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-B49WQj8W.js → TaskDetailPage-CZw_F8y4.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-B49WQj8W.js.map → TaskDetailPage-CZw_F8y4.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-D8UMH1rd.js → TaskQueuePill-DZykFijh.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-D8UMH1rd.js.map → TaskQueuePill-DZykFijh.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-CJB-EvKX.js → TasksListPage-D-vHndyV.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-CJB-EvKX.js.map → TasksListPage-D-vHndyV.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CnjY3XDt.js → TimeAgo-B6Gz4RAU.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CnjY3XDt.js.map → TimeAgo-B6Gz4RAU.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-u1YA8eA3.js → TimestampCell-DZu9PtN2.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-u1YA8eA3.js.map → TimestampCell-DZu9PtN2.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-Dmcwmqh2.js → ToolPill-RP2Tvlrx.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-Dmcwmqh2.js.map → ToolPill-RP2Tvlrx.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-B1T4Hk0t.js → ToolTestPanel-D4cgYW2p.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-B1T4Hk0t.js.map → ToolTestPanel-D4cgYW2p.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-ClibbST4.js → TopicDetailPage-C5ZUZpU5.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-ClibbST4.js.map → TopicDetailPage-C5ZUZpU5.js.map} +1 -1
- package/dashboard/dist/assets/{TopicsPage-KjODhitc.js → TopicsPage-Cbc0nVj9.js} +2 -2
- package/dashboard/dist/assets/{TopicsPage-KjODhitc.js.map → TopicsPage-Cbc0nVj9.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DVqimwsO.js → UserName-YUoNrFAq.js} +2 -2
- package/dashboard/dist/assets/{UserName-DVqimwsO.js.map → UserName-YUoNrFAq.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-DYNPy7Gk.js → WorkflowExecutionPage-CVGztAdK.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-DYNPy7Gk.js.map → WorkflowExecutionPage-CVGztAdK.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-h43nlUmM.js → WorkflowPill-pPuGH8v9.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-h43nlUmM.js.map → WorkflowPill-pPuGH8v9.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-DdJm6X7x.js → WorkflowsDashboard-BFzCyvgv.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DdJm6X7x.js.map → WorkflowsDashboard-BFzCyvgv.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CBOYkfpD.js → WorkflowsOverview-C_y7JCg2.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CBOYkfpD.js.map → WorkflowsOverview-C_y7JCg2.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-BZnD_hMw.js → YamlWorkflowsPage-CYQjp3JI.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-BZnD_hMw.js.map → YamlWorkflowsPage-CYQjp3JI.js.map} +1 -1
- package/dashboard/dist/assets/{agents-oHMkS1GD.js → agents-2pDPv2Ww.js} +2 -2
- package/dashboard/dist/assets/{agents-oHMkS1GD.js.map → agents-2pDPv2Ww.js.map} +1 -1
- package/dashboard/dist/assets/{bots-BispbsY3.js → bots-2uGZ2l7A.js} +2 -2
- package/dashboard/dist/assets/{bots-BispbsY3.js.map → bots-2uGZ2l7A.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-CIbrx5rX.js → controlplane-CQ29M7lK.js} +2 -2
- package/dashboard/dist/assets/controlplane-CQ29M7lK.js.map +1 -0
- package/dashboard/dist/assets/{escalation-qhj4TxA3.js → escalation-DWOUjrgL.js} +2 -2
- package/dashboard/dist/assets/{escalation-qhj4TxA3.js.map → escalation-DWOUjrgL.js.map} +1 -1
- package/dashboard/dist/assets/{escalation-columns-Dh_0iVTH.js → escalation-columns-WrgLIl-W.js} +2 -2
- package/dashboard/dist/assets/{escalation-columns-Dh_0iVTH.js.map → escalation-columns-WrgLIl-W.js.map} +1 -1
- package/dashboard/dist/assets/{helpers-BYw1qqKV.js → helpers-LN5b1KBx.js} +2 -2
- package/dashboard/dist/assets/{helpers-BYw1qqKV.js.map → helpers-LN5b1KBx.js.map} +1 -1
- package/dashboard/dist/assets/{index-CVRVw3g_.js → index-BMo7wCw8.js} +2 -2
- package/dashboard/dist/assets/{index-CVRVw3g_.js.map → index-BMo7wCw8.js.map} +1 -1
- package/dashboard/dist/assets/{index-BhhWCADo.js → index-CBS8FBcp.js} +18 -18
- package/dashboard/dist/assets/index-CBS8FBcp.js.map +1 -0
- package/dashboard/dist/assets/{index-ht5r_7jQ.js → index-CFJc47B8.js} +2 -2
- package/dashboard/dist/assets/{index-ht5r_7jQ.js.map → index-CFJc47B8.js.map} +1 -1
- package/dashboard/dist/assets/{index-zHicKKh9.js → index-C_A76Dl1.js} +2 -2
- package/dashboard/dist/assets/{index-zHicKKh9.js.map → index-C_A76Dl1.js.map} +1 -1
- package/dashboard/dist/assets/{index-B9t_vpam.js → index-CdNXBj7w.js} +2 -2
- package/dashboard/dist/assets/{index-B9t_vpam.js.map → index-CdNXBj7w.js.map} +1 -1
- package/dashboard/dist/assets/index-ChGBlYKj.css +1 -0
- package/dashboard/dist/assets/index-CovZsMow.js +15 -0
- package/dashboard/dist/assets/{index-D6YjH5uG.js.map → index-CovZsMow.js.map} +1 -1
- package/dashboard/dist/assets/index-CryoNbg0.js +2 -0
- package/dashboard/dist/assets/index-CryoNbg0.js.map +1 -0
- package/dashboard/dist/assets/{index-Bh9g-EOF.js → index-CvzfRxnj.js} +2 -2
- package/dashboard/dist/assets/{index-Bh9g-EOF.js.map → index-CvzfRxnj.js.map} +1 -1
- package/dashboard/dist/assets/{index-C4W1_Rfk.js → index-DDxZOINn.js} +2 -2
- package/dashboard/dist/assets/{index-C4W1_Rfk.js.map → index-DDxZOINn.js.map} +1 -1
- package/dashboard/dist/assets/{index-C2yJWps6.js → index-DqFfgd-7.js} +2 -2
- package/dashboard/dist/assets/{index-C2yJWps6.js.map → index-DqFfgd-7.js.map} +1 -1
- package/dashboard/dist/assets/index-J0dMfAmE.js +2 -0
- package/dashboard/dist/assets/index-J0dMfAmE.js.map +1 -0
- package/dashboard/dist/assets/{index-CY3EhrEA.js → index-dzxsXeMO.js} +2 -2
- package/dashboard/dist/assets/{index-CY3EhrEA.js.map → index-dzxsXeMO.js.map} +1 -1
- package/dashboard/dist/assets/{index-CEF3Idec.js → index-ugekH3E2.js} +2 -2
- package/dashboard/dist/assets/{index-CEF3Idec.js.map → index-ugekH3E2.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-B23TU6JN.js → knowledge-BhZk3Wy9.js} +2 -2
- package/dashboard/dist/assets/{knowledge-B23TU6JN.js.map → knowledge-BhZk3Wy9.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-Cew_Sb-Q.js → mcp-FOHNY7Zj.js} +2 -2
- package/dashboard/dist/assets/{mcp-Cew_Sb-Q.js.map → mcp-FOHNY7Zj.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-So0Oz5Lx.js → mcp-query-BoNH5uCn.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-So0Oz5Lx.js.map → mcp-query-BoNH5uCn.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-runs-4176y3SA.js → mcp-runs-BhkGaw2y.js} +2 -2
- package/dashboard/dist/assets/{mcp-runs-4176y3SA.js.map → mcp-runs-BhkGaw2y.js.map} +1 -1
- package/dashboard/dist/assets/{namespaces-CqBbWsJx.js → namespaces-duQCQRHq.js} +2 -2
- package/dashboard/dist/assets/{namespaces-CqBbWsJx.js.map → namespaces-duQCQRHq.js.map} +1 -1
- package/dashboard/dist/assets/{roles-BTxMgLE6.js → roles-DW6lI_g5.js} +2 -2
- package/dashboard/dist/assets/{roles-BTxMgLE6.js.map → roles-DW6lI_g5.js.map} +1 -1
- package/dashboard/dist/assets/{settings-CtQNxacL.js → settings-wTRbazzw.js} +2 -2
- package/dashboard/dist/assets/{settings-CtQNxacL.js.map → settings-wTRbazzw.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-CIRlUTbo.js → tasks-C-QX245z.js} +2 -2
- package/dashboard/dist/assets/{tasks-CIRlUTbo.js.map → tasks-C-QX245z.js.map} +1 -1
- package/dashboard/dist/assets/{topics-C8YmK_j2.js → topics-CAnsyo3w.js} +2 -2
- package/dashboard/dist/assets/{topics-C8YmK_j2.js.map → topics-CAnsyo3w.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-BvMUy36X.js → useEventHooks-C689a4F7.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-BvMUy36X.js.map → useEventHooks-C689a4F7.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-DLEzqv-z.js → useYamlActivityEvents-BTHFGIsD.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-DLEzqv-z.js.map → useYamlActivityEvents-BTHFGIsD.js.map} +1 -1
- package/dashboard/dist/assets/{users-C_bD6mzW.js → users--D3LoFOD.js} +2 -2
- package/dashboard/dist/assets/{users-C_bD6mzW.js.map → users--D3LoFOD.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DY1ctJgc.js → vendor-icons-BNtvBbnj.js} +107 -102
- package/dashboard/dist/assets/vendor-icons-BNtvBbnj.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DFR0-hI3.js → workflows-MpNdzreD.js} +2 -2
- package/dashboard/dist/assets/{workflows-DFR0-hI3.js.map → workflows-MpNdzreD.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-wXURdyjP.js → yaml-workflows-CFhnJzQy.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-wXURdyjP.js.map → yaml-workflows-CFhnJzQy.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/package.json +2 -2
- package/dashboard/dist/assets/ListToolbar-CUxJlz__.js +0 -2
- package/dashboard/dist/assets/controlplane-CIbrx5rX.js.map +0 -1
- package/dashboard/dist/assets/index-BhhWCADo.js.map +0 -1
- package/dashboard/dist/assets/index-Bn-VSH41.js +0 -2
- package/dashboard/dist/assets/index-Bn-VSH41.js.map +0 -1
- package/dashboard/dist/assets/index-CHxvfc97.css +0 -1
- package/dashboard/dist/assets/index-D-q2lzup.js +0 -2
- package/dashboard/dist/assets/index-D-q2lzup.js.map +0 -1
- package/dashboard/dist/assets/index-D6YjH5uG.js +0 -15
- package/dashboard/dist/assets/vendor-icons-DY1ctJgc.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as l,j as e}from"./vendor-query-B2UbickB.js";import{P as we}from"./PageHeaderWithStats-C5cZ3IOO.js";import{F as ve,b as Ce}from"./FilterBar-Ck4K4rzu.js";import{u as $e}from"./useFilterParams-DZCAaBC7.js";import{u as Y,a as X,b as Se,c as Te,d as _e}from"./controlplane-CIbrx5rX.js";import{M as Ee}from"./Modal-DEODGeqx.js";import{J as U,am as J,P as Me,an as q,ao as V,n as ee,I as Re,A as Pe,a4 as Ae,R as Fe,S as Qe,ap as We,E as Le,Z as Oe,b as Be,aq as Ie}from"./vendor-icons-DY1ctJgc.js";import{C as I}from"./CollapsibleSection-Dj1YOsVG.js";import{T as Je}from"./TaskQueuePill-D8UMH1rd.js";import{D as Ve}from"./DataTable-D9yuBv0w.js";import{C as A,u as ze,J as De}from"./index-BhhWCADo.js";import{R as Ge,a as K}from"./RowActions-Dg-Fsm5O.js";import"./vendor-react-CX88sFS5.js";import"./EmptyState-BcsfPq9T.js";const He=[{label:"15m",value:"15m"},{label:"30m",value:"30m"},{label:"1h",value:"1h"},{label:"1d",value:"1d"},{label:"7d",value:"7d"}],te={pong:"text-status-success",ping:"text-accent",throttle:"text-status-warning",job:"text-purple-400",work:"text-text-secondary",activate:"text-status-error",cron:"text-text-tertiary",user:"text-text-secondary"},Ue={pong:"roll call",ping:"ping",throttle:"throttle",job:"job",work:"work",activate:"activate",cron:"cron",user:"user"},qe=250;function Q(t){return!!t.worker_topic}function _(t){return typeof t.throttle=="number"&&t.throttle!==0}function z(t){return t===void 0||t===0?"Normal":t===-1?"Paused":t>=864e5?`${(t/864e5).toFixed(0)}d`:t>=36e5?`${(t/36e5).toFixed(1)}h`:t>=6e4?`${(t/6e4).toFixed(1)}m`:t>=1e3?`${(t/1e3).toFixed(1)}s`:`${t}ms`}function Ke(t){if(!t)return null;const s=t.match(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d+)$/);if(s){const[,n,o,a,u,c,h,i]=s;return new Date(`${n}-${o}-${a}T${u}:${c}:${h}.${i}Z`)}const r=new Date(t);return isNaN(r.getTime())?null:r}function se(t){const s=Ke(t);if(!s)return"--";const r=Date.now()-s.getTime();if(r<0||isNaN(r))return"--";const n=Math.floor(r/1e3);if(n<60)return`${n}s`;const o=Math.floor(n/60);if(o<60)return`${o}m`;const a=Math.floor(o/60);return a<24?`${a}h ${o%60}m`:`${Math.floor(a/24)}d ${a%24}h`}function ne(t,s){if(!t||!s)return"—";const r=parseFloat(t),n=parseFloat(s);return isNaN(r)||isNaN(n)?"—":`${(r-n).toFixed(1)} / ${r.toFixed(1)} GB`}function re(t){return t.replace(/^hmsh:[^:]+:x:/,"")||"(engine)"}function W(t){const s=t.match(/^([^:]+)::(.+?)-[A-Za-z0-9_]{10,}$/);return s?s[2]:t.length>20?t.slice(0,20)+"...":t}function ae(t){const s=t.match(/^([^:]+)::/);return(s==null?void 0:s[1])||""}const oe=[{key:"pong",label:"Roll Call",description:"Node health check responses"},{key:"ping",label:"Ping",description:"Health check broadcasts"},{key:"throttle",label:"Throttle",description:"Throttle commands"},{key:"job",label:"Job",description:"Job lifecycle events"},{key:"work",label:"Work",description:"Worker dispatch events"},{key:"activate",label:"Activate",description:"Worker activation"},{key:"cron",label:"Cron",description:"Cron schedule triggers"},{key:"user",label:"User",description:"User-defined messages"}];function L(t){return`${t.engine_id}-${t.worker_topic||"engine"}`}function Ze(t){const s=new Map;for(const r of t){if(!r.worker_topic)continue;const n=r.worker_topic;s.has(n)||s.set(n,[]),s.get(n).push(r)}return s}function O(t){let s=0,r=0,n=0;for(const o of t)if(o.counts)for(const[a,u]of Object.entries(o.counts))s+=u,a==="200"?r+=u:a==="500"&&(n+=u);return{total:s,success:r,errors:n}}function Ye(t){let s=0;for(const r of t)typeof r.stream_depth=="number"&&(s+=r.stream_depth);return s}function Xe(t){if(t.length===0)return"healthy";if(t.every(n=>n.throttle===-1))return"paused";const{errors:r}=O(t);return r>0||t.some(_)?"degraded":"healthy"}function et({activeAppId:t,allProfiles:s,profiles:r}){const n=Y(),[o,a]=l.useState(new Set),[u,c]=l.useState(!1),[h,i]=l.useState([]);l.useEffect(()=>{a(new Set)},[t]);const j=l.useCallback(f=>{a(S=>{const w=new Set(S),T=L(f);return w.has(T)?w.delete(T):w.add(T),w})},[]),m=l.useCallback(()=>{o.size===r.length?a(new Set):a(new Set(r.map(L)))},[r,o.size]),y=l.useMemo(()=>{const f=r.filter(N=>o.has(L(N)));if(f.length===0)return[];if(f.length===s.length)return[{label:"Entire Mesh"}];const S=f.filter(N=>!Q(N)),w=f.filter(Q),T=[];for(const N of S)T.push({label:`Engine ${N.engine_id}`,guid:N.engine_id});const M=new Map;for(const N of w){const E=N.worker_topic;M.has(E)||M.set(E,[]),M.get(E).push(N)}for(const[N,E]of M){const B=s.filter(P=>P.worker_topic===N);if(E.length===B.length)T.push({label:N,topic:N});else for(const P of E)T.push({label:`${N} ${P.engine_id}`,guid:P.engine_id})}return T},[r,s,o]);return{selectedIds:o,setSelectedIds:a,toggleCheckbox:j,toggleAll:m,throttleModalOpen:u,throttleTargets:h,selectedThrottleTargets:y,throttleMutation:n,handleBulkThrottle:f=>{const S=h.length>0?h:y;for(const w of S)n.mutate({appId:t,throttle:f,...w.topic?{topic:w.topic}:{},...w.guid?{guid:w.guid}:{}});c(!1),i([])},handleRowClick:f=>{const S=Q(f)?`${f.worker_topic} ${f.engine_id}`:`Engine ${f.engine_id}`;i([{label:S,guid:f.engine_id}]),c(!0)},handleBulkThrottleOpen:()=>{i(y),c(!0)},handleResumeThrottle:f=>{n.mutate({appId:t,throttle:0,guid:f.engine_id})},handleResumeQueue:f=>{n.mutate({appId:t,throttle:0,topic:f})},handleQueueThrottle:f=>{i([{label:f,topic:f}]),c(!0)},closeThrottleModal:()=>{c(!1),i([])}}}const tt=[{label:"Resume",ms:0},{label:"0.5s",ms:500},{label:"1s",ms:1e3},{label:"5s",ms:5e3},{label:"30s",ms:3e4},{label:"Pause",ms:-1}];function st({target:t}){const s=t.label==="Entire Mesh",r=t.label==="All Engines"||t.label.startsWith("Engine "),n=s?"bg-status-error/10 text-status-error":r?"bg-blue-500/10 text-blue-500":"bg-accent/[0.06] text-text-secondary",o=t.guid?"guid":t.topic?"topic":"mesh";return e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${n}`,children:[t.label,e.jsx("span",{className:"text-[8px] opacity-50",children:o})]})}function nt({open:t,onClose:s,targets:r,onApply:n,isPending:o}){const[a,u]=l.useState("");return e.jsx(Ee,{open:t,onClose:s,title:"Adjust Throttle",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Targets"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:r.map((c,h)=>e.jsx(st,{target:c},c.guid||c.topic||h))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Presets"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:tt.map(c=>e.jsx("button",{onClick:()=>n(c.ms),disabled:o,className:`px-3 py-1.5 text-xs rounded transition-colors ${c.ms===-1?"bg-status-error/10 text-status-error hover:bg-status-error/20":c.ms===0?"bg-status-success/10 text-status-success hover:bg-status-success/20":"bg-surface-sunken text-text-secondary hover:bg-surface-hover"} disabled:opacity-50`,children:c.label},c.label))})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Custom delay (seconds)"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("input",{type:"number",step:"0.1",min:"0",value:a,onChange:c=>u(c.target.value),placeholder:"e.g. 2.5",className:"input text-xs py-1.5 px-3 w-28"}),e.jsx("button",{onClick:()=>{const c=parseFloat(a);isNaN(c)||c<0||n(Math.round(c*1e3))},disabled:o,className:"btn-primary text-xs py-1.5 px-4 disabled:opacity-50",children:"Apply"})]})]})]})})}function rt(){const{data:t}=X(),s=Y(),[r,n]=l.useState(!1),[o,a]=l.useState(!1),u=(t==null?void 0:t.apps)??[],c=l.useCallback(async h=>{if(u.length===0)return;a(!0);const i=await Promise.allSettled(u.map(m=>s.mutateAsync({appId:m.appId,throttle:h}))),j=i.filter(m=>m.status==="rejected").length;j>0&&console.error(`Emergency throttle: ${j}/${i.length} apps failed`),a(!1),n(!1)},[u,s]);return r?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-xs text-status-error",children:["Pause all ",u.length," app",u.length!==1?"s":"","?"]}),e.jsx("button",{onClick:()=>c(-1),disabled:o,className:"px-2.5 py-1 text-xs rounded-md bg-status-error text-white hover:bg-status-error/90 transition-colors disabled:opacity-50",children:o?e.jsx(U,{className:"w-3.5 h-3.5 animate-spin"}):"Confirm"}),e.jsx("button",{onClick:()=>n(!1),disabled:o,className:"px-2.5 py-1 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50",children:"Cancel"})]}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:()=>n(!0),disabled:o,className:"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-error/80 hover:text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50",title:"Pause all queues across all applications",children:[e.jsx(J,{className:"w-3.5 h-3.5"}),"Pause All"]}),e.jsxs("button",{onClick:()=>c(0),disabled:o,className:"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-success/80 hover:text-status-success hover:bg-status-success/10 transition-colors disabled:opacity-50",title:"Resume all queues across all applications",children:[o?e.jsx(U,{className:"w-3.5 h-3.5 animate-spin"}):e.jsx(Me,{className:"w-3.5 h-3.5"}),"Resume All"]})]})}function at({byStream:t,onNodeFilter:s}){const[r,n]=l.useState(!1);if(l.useEffect(()=>{n(!1);const i=requestAnimationFrame(()=>n(!0));return()=>cancelAnimationFrame(i)},[t]),t.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary py-4 text-center",children:"No activity in this period"});const o=t.filter(i=>i.stream_type==="engine"),a=t.filter(i=>i.stream_type==="worker"),u=Math.max(...t.map(i=>i.count)),c=i=>{const j=u>0?i.count/u*100:0,m=i.stream_type==="engine",y=m?"(all engines)":re(i.stream_name),k=m?"bg-blue-500/70":"bg-accent/60",b=m?"text-blue-500":"text-text-tertiary";return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:`text-[9px] font-mono ${b} w-36 truncate text-right shrink-0`,title:i.stream_name,children:y}),e.jsx("div",{className:"flex-1 h-4 bg-surface-sunken rounded overflow-hidden",children:e.jsx("div",{className:`h-full ${k} rounded transition-all duration-500 ease-out`,style:{width:r?`${j}%`:"0%"}})}),e.jsx("span",{className:"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0",children:i.count.toLocaleString()})]},`${i.stream_type}-${i.stream_name}`)},h="text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline";return e.jsxs("div",{className:"space-y-1.5",children:[o.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${h} text-blue-500/70 hover:text-blue-500`,onClick:()=>s==null?void 0:s("engines"),children:"Engine Message Volume"}),o.map(c),a.length>0&&e.jsx("div",{className:"h-2"})]}),a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${h} text-accent/70 hover:text-accent`,onClick:()=>s==null?void 0:s("workers"),children:"Worker Message Volume"}),a.map(c)]})]})}function ot({queue:t,workers:s,expanded:r,onToggle:n,onWorkerClick:o,onResumeThrottle:a,onQueueThrottle:u,onResumeQueue:c,byStream:h,activeDuration:i}){const j=l.useMemo(()=>{const d=h.find(p=>p.stream_type==="worker"&&re(p.stream_name)===t);return(d==null?void 0:d.count)??0},[h,t]),m=l.useMemo(()=>Xe(s),[s]),y=l.useMemo(()=>Ye(s),[s]),{errors:k}=l.useMemo(()=>O(s),[s]),b=m==="paused"?"bg-status-error":m==="degraded"?"bg-status-warning":"bg-status-success",x=l.useMemo(()=>[{key:"engine_id",label:"Worker ID",render:d=>e.jsx("span",{className:"text-xs font-mono text-text-tertiary",children:d.engine_id}),className:"w-48"},{key:"throttle",label:"Throttle",render:d=>{const p=d.throttle;return p===-1?e.jsx("span",{className:"text-xs text-status-error font-medium",children:"Paused"}):p&&p>0?e.jsx("span",{className:"text-xs text-status-warning font-medium",children:z(p)}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"0"})},className:"w-24"},{key:"memory",label:"Memory",render:d=>{var p,v;return e.jsx("span",{className:"text-xs font-mono text-text-tertiary",children:ne((p=d.system)==null?void 0:p.TotalMemoryGB,(v=d.system)==null?void 0:v.FreeMemoryGB)})},className:"w-36"},{key:"actions",label:"",render:d=>e.jsxs(Ge,{children:[_(d)&&e.jsx(K,{icon:q,title:"Resume (remove throttle)",onClick:()=>a(d),colorClass:"text-text-tertiary hover:text-status-success"}),e.jsx(K,{icon:V,title:"Adjust throttle",onClick:()=>o(d)})]}),className:"w-16"}],[o,a]);return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>n(t),className:"group/row relative flex items-center gap-3 w-full py-2 hover:bg-surface-hover transition-colors text-left rounded",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${b}`,title:m}),e.jsx(ee,{className:`w-3.5 h-3.5 text-text-tertiary/50 transition-transform duration-200 ${r?"rotate-90":""}`,strokeWidth:2}),e.jsx(Je,{queue:t,size:"sm"}),e.jsx("span",{className:"flex-1"}),k>0&&e.jsxs("span",{className:"text-[10px] text-status-error font-medium mr-2",children:[k," errors"]}),y>0&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-status-warning w-20",children:[e.jsx(Re,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"font-mono tabular-nums",children:y.toLocaleString()})]}),e.jsxs("span",{className:`flex items-center gap-1 text-xs w-24 ${s.some(_)?"text-status-warning":"text-text-tertiary"}`,children:[e.jsx(Pe,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"font-mono tabular-nums",children:s.length}),e.jsx("span",{children:"workers"})]}),e.jsx("span",{className:"flex items-center gap-1 text-xs font-mono text-text-tertiary w-28 justify-end mr-16",children:j>0?e.jsxs(e.Fragment,{children:[e.jsx(Ae,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),j.toLocaleString()," in ",i]}):e.jsx("span",{className:"text-text-tertiary/40",children:"—"})}),e.jsxs("span",{className:"absolute right-3 top-1/2 -translate-y-1/2 opacity-0 group-hover/row:opacity-100 transition-opacity flex items-center gap-2",children:[s.some(_)&&e.jsx(q,{className:"w-4 h-4 text-text-tertiary hover:text-status-success",strokeWidth:1.5,onClick:d=>{d.stopPropagation(),c(t)}}),e.jsx(V,{className:"w-4 h-4 text-text-tertiary hover:text-accent",strokeWidth:1.5,onClick:d=>{d.stopPropagation(),u(t)}})]})]}),e.jsx(A,{open:r,children:e.jsx("div",{className:"ml-6",children:e.jsx(Ve,{columns:x,data:s,keyFn:L,onRowClick:o,emptyMessage:"No workers",inline:!0})})})]})}let lt=0;function it(t){const s=t.data||{},r=s.topic?String(s.topic):"",n=s.guid?String(s.guid).slice(0,8):"";switch(t.type){case"pong":return r?`Worker ${n}... on "${r}" responded`:`Engine ${n}... responded`;case"ping":return"Roll call broadcast";case"throttle":{const o=s.throttle,a=r?`queue "${r}"`:n?`node ${n}...`:"all nodes";return`${z(o)} applied to ${a}`}case"job":return`Job ${n?n+"...":""} ${s.status||"updated"}`;case"work":return`Dispatched to "${r||"worker"}" ${n?"("+n+"...)":""}`;case"activate":return`Worker "${r||"unknown"}" activated`;case"cron":return`Cron triggered ${r?'"'+r+'"':""}`;default:return r||n||t.type}}function ct(t){const s=[];let r=0;for(;r<t.length;){const n=t[r];if(n.type==="pong"){let o=r+1;for(;o<t.length&&t[o].type==="pong";)o++;const a=t.slice(r,o);if(a.length>=3)s.push({kind:"group",type:"pong",count:a.length,firstTimestamp:a[a.length-1].timestamp,lastTimestamp:a[0].timestamp,events:a});else for(const u of a)s.push({kind:"single",event:u});r=o}else s.push({kind:"single",event:n}),r++}return s}function le({event:t}){const[s,r]=l.useState(!1);return e.jsxs("div",{className:"border-b border-surface-border/50 last:border-b-0",children:[e.jsxs("button",{onClick:()=>r(!s),className:"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors",children:[e.jsx("span",{className:"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0",children:new Date(t.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}),e.jsx("span",{className:`text-[9px] font-medium px-1 py-0.5 rounded ${te[t.type]||"text-text-tertiary"} bg-surface-sunken whitespace-nowrap shrink-0`,children:Ue[t.type]||t.type}),e.jsx("span",{className:"text-[9px] text-text-secondary flex-1 min-w-0 truncate",children:it(t)}),e.jsx("svg",{className:`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${s?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),e.jsx(A,{open:s,children:e.jsx("div",{className:"pb-2",children:e.jsx(De,{data:t.data})})})]})}function dt({group:t}){const[s,r]=l.useState(!1),n=t.events.filter(a=>{var u;return!((u=a.data)!=null&&u.topic)}).length,o=t.count-n;return e.jsxs("div",{className:"border-b border-surface-border/50 last:border-b-0",children:[e.jsxs("button",{onClick:()=>r(!s),className:"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors",children:[e.jsx("span",{className:"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0",children:new Date(t.lastTimestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}),e.jsx("span",{className:`text-[9px] font-medium px-1 py-0.5 rounded ${te.pong} bg-surface-sunken whitespace-nowrap shrink-0`,children:"roll call"}),e.jsxs("span",{className:"text-[9px] text-text-secondary flex-1 min-w-0 truncate",children:[t.count," nodes responded",n>0&&o>0?` (${n} engine${n!==1?"s":""}, ${o} worker${o!==1?"s":""})`:n>0?` (${n} engine${n!==1?"s":""})`:` (${o} worker${o!==1?"s":""})`]}),e.jsx("svg",{className:`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${s?"rotate-180":""}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"})})]}),e.jsx(A,{open:s,children:e.jsx("div",{className:"ml-4",children:t.events.map(a=>e.jsx(le,{event:a},a.id))})})]})}function ut({channels:t,onToggle:s,customFilter:r,onCustomFilterChange:n}){return e.jsxs("div",{className:"space-y-3 pb-3 border-b border-surface-border mb-3",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Channels"}),e.jsx("p",{className:"text-[9px] text-text-tertiary",children:"Unchecked channels are dropped before buffering"})]}),e.jsx("div",{className:"grid grid-cols-2 gap-1",children:oe.map(o=>e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer py-0.5",children:[e.jsx("input",{type:"checkbox",checked:t.has(o.key),onChange:()=>s(o.key),className:"w-3 h-3 rounded border-border accent-accent"}),e.jsx("span",{className:"text-[10px] text-text-secondary",title:o.description,children:o.label})]},o.key))}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Text Filter"}),e.jsx("input",{type:"text",value:r,onChange:o=>n(o.target.value),placeholder:"pong",className:"input text-[10px] font-mono py-1 px-2 w-full"}),e.jsxs("p",{className:"text-[9px] text-text-tertiary mt-1",children:["Filter by event type, e.g. ",e.jsx("span",{className:"font-mono",children:"pong"}),", ",e.jsx("span",{className:"font-mono",children:"throttle"}),", or any text in the event data."]})]})]})}function xt({bridgeActive:t}){const[s,r]=l.useState(!1),[n,o]=l.useState(!1),[a,u]=l.useState([]),[c,h]=l.useState(()=>new Set(oe.map(x=>x.key))),[i,j]=l.useState(""),m=l.useRef(c);l.useEffect(()=>{m.current=c},[c]);const y=l.useRef(i);l.useEffect(()=>{y.current=i},[i]);const k=x=>{h(d=>{const p=new Set(d);return p.has(x)?p.delete(x):p.add(x),p})};ze("lt.events.mesh.>",l.useCallback(x=>{var v;const d=((v=x.type)==null?void 0:v.replace("mesh.",""))||"unknown";if(!m.current.has(d))return;const p=y.current;p&&!`${d} ${JSON.stringify(x.data||x)}`.toLowerCase().includes(p.toLowerCase())||u(R=>[{id:++lt,type:d,timestamp:x.timestamp||new Date().toISOString(),data:x.data||x},...R].slice(0,qe))},[]));const b=()=>u([]);return e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Event Stream"}),e.jsx(Fe,{className:`w-3 h-3 ${t?"text-status-success animate-pulse":"text-text-tertiary"}`}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:t?"Live":"..."}),e.jsxs("span",{className:"ml-auto flex items-center gap-1",children:[e.jsx("button",{onClick:()=>{r(x=>!x),o(!1)},className:`p-1 rounded transition-colors ${s?"text-accent bg-accent/10":"text-text-tertiary hover:text-text-primary"}`,title:"Configure channels",children:e.jsx(Qe,{className:"w-3.5 h-3.5"})}),e.jsx("button",{onClick:()=>{o(x=>!x),r(!1)},className:`p-1 rounded transition-colors ${n?"text-accent bg-accent/10":"text-text-tertiary hover:text-text-primary"}`,title:"View raw JSON",children:e.jsx(We,{className:"w-3.5 h-3.5"})}),a.length>0&&e.jsx("button",{onClick:b,className:"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors",title:"Clear events",children:e.jsx(Le,{className:"w-3.5 h-3.5"})})]})]}),e.jsx(A,{open:s,children:e.jsx(ut,{channels:c,onToggle:k,customFilter:i,onCustomFilterChange:j})}),e.jsx(A,{open:n,children:e.jsx("div",{className:"pb-3 border-b border-surface-border mb-3",children:e.jsx("pre",{className:"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap",children:JSON.stringify(a.slice(0,50),null,2)})})}),a.length>0&&e.jsxs("p",{className:"text-[9px] text-text-tertiary mb-2",children:[a.length," events"]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:a.length===0?e.jsx("p",{className:"text-xs text-text-tertiary py-6 text-center",children:t?"Waiting for events...":"Subscribing..."}):ct(a).map((x,d)=>x.kind==="group"?e.jsx(dt,{group:x},`grp-${d}`):e.jsx(le,{event:x.event},x.event.id))})]})}function pt(t){if(t.length===0)return null;const s=t.filter(o=>!_(o));if(s.length===0)return null;let r=null,n=-1;for(const o of s){const a=O([o]).total;a>n&&(n=a,r=o)}return r||s[0]}function F({value:t,label:s,warn:r,title:n}){return e.jsxs("div",{title:n,children:[e.jsx("p",{className:`text-sm font-mono tabular-nums ${r?"text-status-warning":"text-text-primary"}`,children:typeof t=="number"?t.toLocaleString():t}),e.jsx("p",{className:"text-[9px] text-text-tertiary uppercase tracking-widest",children:s})]})}function Z({engine:t}){const s=W(t.engine_id),r=ae(t.engine_id),n=_(t);return e.jsxs("div",{className:"flex items-center gap-3 py-1.5",children:[e.jsx(Be,{className:"w-3 h-3 text-text-tertiary/40 shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[180px]",title:t.engine_id,children:s}),r&&e.jsx("span",{className:"text-[10px] text-text-tertiary/50",children:r}),e.jsx("span",{className:"flex-1"}),n&&e.jsx("span",{className:"text-[10px] text-status-warning",children:t.throttle===-1?"Paused":z(t.throttle)}),e.jsx("span",{className:"text-[10px] font-mono text-text-tertiary/50",children:se(t.inited)})]})}function mt({engines:t,onThrottle:s,isLoading:r}){var y,k;const[n,o]=l.useState(!1),a=l.useMemo(()=>pt(t),[t]),u=l.useMemo(()=>t.filter(b=>b!==a).sort((b,x)=>{const d=_(b)?0:1,p=_(x)?0:1;return d!==p?d-p:W(b.engine_id).localeCompare(W(x.engine_id))}),[t,a]),c=t.filter(_).length;if(r)return e.jsx("p",{className:"text-xs text-text-tertiary",children:"Discovering engines..."});if(t.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary",children:"No engines found."});if(!a)return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 py-2",children:[e.jsx(J,{className:"w-4 h-4 text-status-error shrink-0",strokeWidth:1.5}),e.jsxs("span",{className:"text-base text-status-error font-medium",children:["All ",t.length," engines paused"]}),e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"Messages are accumulating. Resume at least one engine to restore processing."})]}),e.jsx("div",{className:"mt-2",children:t.map(b=>e.jsx(Z,{engine:b},b.engine_id))})]});const h=W(a.engine_id),i=ae(a.engine_id),j=O([a]),m=a.stream_depth??0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 py-2",children:[e.jsx(Oe,{className:"w-4 h-4 text-status-success shrink-0",strokeWidth:1.5}),e.jsx("span",{className:"text-base text-text-primary font-medium",children:h}),i&&e.jsx("span",{className:"text-[10px] text-text-tertiary/60",children:i}),e.jsx("span",{className:"text-[9px] text-status-success uppercase tracking-widest",children:"active"}),e.jsx("span",{className:"flex-1"}),e.jsxs("button",{onClick:()=>s(a),className:"flex items-center gap-1 text-[10px] text-text-tertiary hover:text-status-warning transition-colors",title:"Pause to force failover to standby",children:[e.jsx(J,{className:"w-3.5 h-3.5"}),"Pause"]}),e.jsx("button",{onClick:()=>s(a),className:"text-text-tertiary hover:text-accent transition-colors",title:"Adjust throttle",children:e.jsx(V,{className:"w-3.5 h-3.5",strokeWidth:1.5})})]}),e.jsxs("div",{className:"flex items-center gap-8 ml-7 mt-1",children:[e.jsx(F,{value:j.total,label:"processed"}),e.jsx(F,{value:m,label:"queued",warn:m>100,title:"Total messages waiting in the engine stream (shared across all engines)"}),j.errors>0&&e.jsx(F,{value:j.errors,label:"errors",warn:!0}),e.jsx(F,{value:se(a.inited),label:"uptime"}),e.jsx(F,{value:ne((y=a.system)==null?void 0:y.TotalMemoryGB,(k=a.system)==null?void 0:k.FreeMemoryGB),label:"memory"})]}),u.length>0&&e.jsxs("div",{className:"mt-4 ml-7",children:[e.jsxs("button",{onClick:()=>o(!n),className:"flex items-center gap-1.5 text-[10px] text-text-tertiary hover:text-text-secondary transition-colors",children:[e.jsx(ee,{className:`w-3 h-3 transition-transform duration-200 ${n?"rotate-90":""}`,strokeWidth:2}),u.length," standby",c>0?` (${c} paused)`:""]}),e.jsx(A,{open:n,children:e.jsx("div",{className:"mt-1",children:u.map(b=>e.jsx(Z,{engine:b},b.engine_id))})})]})]})}function ht({collapsed:t,toggleSection:s,activeDuration:r,streamStats:n,isLoading:o,queueMap:a,expandedQueues:u,toggleQueue:c,allQueuesExpanded:h,toggleAllQueues:i,handleRowClick:j,handleResumeThrottle:m,handleQueueThrottle:y,handleResumeQueue:k,engines:b,bridgeActive:x}){return e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6",children:[e.jsxs("div",{className:"flex flex-col gap-12 mt-10",children:[e.jsx(I,{title:`Stream Volume (${r})`,sectionKey:"volume",isCollapsed:!!t.volume,onToggle:s,contentClassName:"mt-4 ml-7",children:e.jsx(at,{byStream:(n==null?void 0:n.byStream)??[],onNodeFilter:()=>{},onQueueFilter:()=>{}})}),e.jsx(I,{title:"Worker Queues",sectionKey:"queues",isCollapsed:!!t.queues,onToggle:s,contentClassName:"mt-4 ml-7 flex flex-col gap-0",children:o?e.jsx("p",{className:"text-xs text-text-tertiary",children:"Discovering mesh nodes..."}):a.size===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:'No worker queues found. Click "Roll Call" to discover.'}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex justify-end mb-2",children:e.jsx("button",{onClick:i,className:"text-[10px] text-accent hover:underline",children:h?"Collapse all":"Expand all"})}),[...a.entries()].sort(([d],[p])=>d.localeCompare(p)).map(([d,p])=>e.jsx(ot,{queue:d,workers:p,expanded:u.has(d),onToggle:c,onWorkerClick:j,onResumeThrottle:m,onQueueThrottle:y,onResumeQueue:k,byStream:(n==null?void 0:n.byStream)??[],activeDuration:r},d))]})}),e.jsx(I,{title:`Engine Cluster (${b.length})`,sectionKey:"engines",isCollapsed:!!t.engines,onToggle:s,contentClassName:"mt-4 ml-7",children:e.jsx(mt,{engines:b,onThrottle:j,onResumeThrottle:m,isLoading:o})})]}),e.jsx(xt,{bridgeActive:x})]})}function Et(){var H;const{data:t}=X(),s=(t==null?void 0:t.apps)??[],{filters:r,setFilter:n}=$e({filters:{app_id:"",duration:"1h"}}),o=((H=s[0])==null?void 0:H.appId)??"durable",a=r.app_id||o,u=r.duration||"1h",c=Se(),h=6e4,{data:i,isLoading:j,error:m,refetch:y,isFetching:k}=Te(a,h),{data:b}=_e(a,u,void 0,h),x=l.useMemo(()=>[...(i==null?void 0:i.profiles)??[]].sort((C,$)=>{const Ne=C.worker_topic||C.stream||"",ke=$.worker_topic||$.stream||"";return!C.worker_topic&&$.worker_topic?-1:C.worker_topic&&!$.worker_topic?1:Ne.localeCompare(ke)}),[i==null?void 0:i.profiles]),d=l.useMemo(()=>x.filter(g=>!Q(g)),[x]),p=l.useMemo(()=>x.filter(Q),[x]),v=l.useMemo(()=>Ze(x),[x]),R=x.filter(_).length,f=l.useMemo(()=>{const g=new Set(s.map(C=>C.appId));return a&&g.add(a),[...g].sort().map(C=>({value:C,label:C}))},[s,a]),[S,w]=l.useState(new Set),T=l.useCallback(g=>{w(C=>{const $=new Set(C);return $.has(g)?$.delete(g):$.add(g),$})},[]),M=v.size>0&&[...v.keys()].every(g=>S.has(g)),N=l.useCallback(()=>{w(M?new Set:new Set(v.keys()))},[M,v]),E="lt:controlplane:collapsed",[B,P]=l.useState(()=>{try{return JSON.parse(localStorage.getItem(E)||"{}")}catch{return{}}}),ie=l.useCallback(g=>{P(C=>{const $={...C,[g]:!C[g]};return localStorage.setItem(E,JSON.stringify($)),$})},[]),{throttleModalOpen:ce,throttleTargets:D,selectedThrottleTargets:de,throttleMutation:ue,handleBulkThrottle:xe,handleRowClick:pe,handleResumeThrottle:me,handleResumeQueue:he,handleQueueThrottle:fe,closeThrottleModal:ge}=et({activeAppId:a,allProfiles:x,profiles:x}),be=l.useMemo(()=>{const g=[{label:"Engines",value:d.length,dotClass:"bg-blue-500"},{label:"Workers",value:p.length,dotClass:"bg-text-secondary"},{label:"Queues",value:v.size}];return R>0&&g.push({label:"Throttled",value:R,dotClass:"bg-status-warning"}),g},[d.length,p.length,v.size,R]),[G,je]=l.useState(!1),ye=l.useCallback(()=>{c.mutate({appId:a},{onSuccess:()=>je(!0)})},[a,c]);return l.useEffect(()=>{!G&&a&&ye()},[a]),e.jsxs("div",{children:[e.jsx(we,{title:"Queues",docsHash:"#docs:dashboard.md:task-queues",stats:be,actions:e.jsx(rt,{})}),e.jsxs(ve,{actions:e.jsx("div",{className:"flex items-center gap-1",children:He.map(g=>e.jsx("button",{onClick:()=>n("duration",g.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${u===g.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:g.label},g.value))}),children:[e.jsx(Ce,{label:"Application",value:r.app_id,onChange:g=>n("app_id",g),options:f}),e.jsxs("button",{onClick:()=>y(),disabled:k,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50",children:[e.jsx(Ie,{className:`w-3.5 h-3.5 ${k?"animate-spin":""}`}),"Roll Call"]})]}),m&&e.jsx("div",{className:"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20",children:e.jsx("p",{className:"text-xs text-status-error font-medium",children:m.message==="Session expired"?"Session expired — please log in again.":`Failed to load mesh data: ${m.message}`})}),e.jsx(ht,{collapsed:B,toggleSection:ie,activeDuration:u,streamStats:b,isLoading:j,queueMap:v,expandedQueues:S,toggleQueue:T,allQueuesExpanded:M,toggleAllQueues:N,handleRowClick:pe,handleResumeThrottle:me,handleQueueThrottle:fe,handleResumeQueue:he,engines:d,bridgeActive:G}),e.jsx(nt,{open:ce,onClose:ge,targets:D.length>0?D:de,onApply:xe,isPending:ue.isPending})]})}export{Et as ControlPlanePage};
|
|
2
|
-
//# sourceMappingURL=index-Bn-VSH41.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-Bn-VSH41.js","sources":["../../src/pages/admin/controlplane/helpers.ts","../../src/pages/admin/controlplane/useMeshSelection.ts","../../src/pages/admin/controlplane/ThrottleModal.tsx","../../src/pages/admin/controlplane/EmergencyControls.tsx","../../src/pages/admin/controlplane/StreamVolumeChart.tsx","../../src/pages/admin/controlplane/QueueCard.tsx","../../src/pages/admin/controlplane/QuorumFeed.tsx","../../src/pages/admin/controlplane/EngineCluster.tsx","../../src/pages/admin/controlplane/ControlPlaneContent.tsx","../../src/pages/admin/controlplane/ControlPlanePage.tsx"],"sourcesContent":["import type { QuorumProfile } from '../../../api/controlplane';\n\nexport const DURATIONS = [\n { label: '15m', value: '15m' },\n { label: '30m', value: '30m' },\n { label: '1h', value: '1h' },\n { label: '1d', value: '1d' },\n { label: '7d', value: '7d' },\n] as const;\n\nexport type Duration = (typeof DURATIONS)[number]['value'];\n\nexport interface QuorumEvent {\n id: number;\n type: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\nexport const EVENT_TYPE_COLORS: Record<string, string> = {\n pong: 'text-status-success',\n ping: 'text-accent',\n throttle: 'text-status-warning',\n job: 'text-purple-400',\n work: 'text-text-secondary',\n activate: 'text-status-error',\n cron: 'text-text-tertiary',\n user: 'text-text-secondary',\n};\n\n/** Human-friendly labels for quorum event types. */\nexport const EVENT_TYPE_LABELS: Record<string, string> = {\n pong: 'roll call',\n ping: 'ping',\n throttle: 'throttle',\n job: 'job',\n work: 'work',\n activate: 'activate',\n cron: 'cron',\n user: 'user',\n};\n\nexport const MAX_EVENTS = 250;\n\nexport function isWorker(p: QuorumProfile): boolean {\n return !!p.worker_topic;\n}\n\nexport function isThrottled(p: QuorumProfile): boolean {\n return typeof p.throttle === 'number' && p.throttle !== 0;\n}\n\nexport function formatThrottleHuman(ms?: number): string {\n if (ms === undefined || ms === 0) return 'Normal';\n if (ms === -1) return 'Paused';\n if (ms >= 86_400_000) return `${(ms / 86_400_000).toFixed(0)}d`;\n if (ms >= 3_600_000) return `${(ms / 3_600_000).toFixed(1)}h`;\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nexport function parseTimestamp(ts?: string): Date | null {\n if (!ts) return null;\n // Handle YYYYMMDDHHMMSS.mmm format (quorum timestamps)\n const match = ts.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, y, mo, d, h, mi, s, ms] = match;\n return new Date(`${y}-${mo}-${d}T${h}:${mi}:${s}.${ms}Z`);\n }\n // Fallback to standard Date parsing\n const date = new Date(ts);\n return isNaN(date.getTime()) ? null : date;\n}\n\nexport function formatUptime(inited?: string): string {\n const date = parseTimestamp(inited);\n if (!date) return '--';\n const ms = Date.now() - date.getTime();\n if (ms < 0 || isNaN(ms)) return '--';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ${m % 60}m`;\n const d = Math.floor(h / 24);\n return `${d}d ${h % 24}h`;\n}\n\nexport function formatMemory(total?: string, free?: string): string {\n if (!total || !free) return '—';\n const t = parseFloat(total);\n const f = parseFloat(free);\n if (isNaN(t) || isNaN(f)) return '—';\n return `${(t - f).toFixed(1)} / ${t.toFixed(1)} GB`;\n}\n\nexport function stripStreamPrefix(name: string): string {\n return name.replace(/^hmsh:[^:]+:x:/, '') || '(engine)';\n}\n\n/** Engine streams have no suffix after hmsh:{app}:x: */\nexport function isEngineStream(streamName: string): boolean {\n return stripStreamPrefix(streamName) === '(engine)';\n}\n\n/** Extract a human-friendly label from engine_id like \"controlplane::durable-Hxyz...\" → \"durable\" */\nexport function engineLabel(engineId: string): string {\n // Format: {source}::{name}-{guid}\n const match = engineId.match(/^([^:]+)::(.+?)-[A-Za-z0-9_]{10,}$/);\n if (match) return match[2];\n // Fallback: just truncate\n return engineId.length > 20 ? engineId.slice(0, 20) + '...' : engineId;\n}\n\n/** Extract the source/app prefix from engine_id like \"controlplane::durable-Hxyz...\" → \"controlplane\" */\nexport function engineSource(engineId: string): string {\n const match = engineId.match(/^([^:]+)::/);\n return match?.[1] || '';\n}\n\nexport type NodeFilter = 'all' | 'workers' | 'engines';\n\n/** Known quorum message types published via the bridge. */\nexport const QUORUM_CHANNELS = [\n { key: 'pong', label: 'Roll Call', description: 'Node health check responses' },\n { key: 'ping', label: 'Ping', description: 'Health check broadcasts' },\n { key: 'throttle', label: 'Throttle', description: 'Throttle commands' },\n { key: 'job', label: 'Job', description: 'Job lifecycle events' },\n { key: 'work', label: 'Work', description: 'Worker dispatch events' },\n { key: 'activate', label: 'Activate', description: 'Worker activation' },\n { key: 'cron', label: 'Cron', description: 'Cron schedule triggers' },\n { key: 'user', label: 'User', description: 'User-defined messages' },\n] as const;\n\n/** Typed throttle target with display label and API params. */\nexport interface ThrottleTarget {\n label: string;\n /** API param: topic-based throttle (queues, all engines) */\n topic?: string;\n /** API param: guid-based throttle (single engine/worker) */\n guid?: string;\n}\n\nexport const NODE_FILTER_OPTIONS = [\n { value: 'all', label: 'All Nodes' },\n { value: 'workers', label: 'Workers' },\n { value: 'engines', label: 'Engines' },\n] as const;\n\nexport function rowKey(p: QuorumProfile): string {\n return `${p.engine_id}-${p.worker_topic || 'engine'}`;\n}\n\n// ── Queue-level helpers ────────────────────────────────────────────────\n\n/** Group worker profiles by `worker_topic` (engines excluded). */\nexport function groupByQueue(profiles: QuorumProfile[]): Map<string, QuorumProfile[]> {\n const map = new Map<string, QuorumProfile[]>();\n for (const p of profiles) {\n if (!p.worker_topic) continue;\n const q = p.worker_topic;\n if (!map.has(q)) map.set(q, []);\n map.get(q)!.push(p);\n }\n return map;\n}\n\n/** Aggregate `counts` across profiles: 200 = success, 500 = error, all = total. */\nexport function sumCounts(profiles: QuorumProfile[]): { total: number; success: number; errors: number } {\n let total = 0;\n let success = 0;\n let errors = 0;\n for (const p of profiles) {\n if (!p.counts) continue;\n for (const [code, n] of Object.entries(p.counts)) {\n total += n;\n if (code === '200') success += n;\n else if (code === '500') errors += n;\n }\n }\n return { total, success, errors };\n}\n\n/** Sum `stream_depth` across profiles. */\nexport function totalPending(profiles: QuorumProfile[]): number {\n let sum = 0;\n for (const p of profiles) {\n if (typeof p.stream_depth === 'number') sum += p.stream_depth;\n }\n return sum;\n}\n\n/** Derive queue health from member profiles. */\nexport function queueHealth(profiles: QuorumProfile[]): 'healthy' | 'degraded' | 'paused' {\n if (profiles.length === 0) return 'healthy';\n const allPaused = profiles.every((p) => p.throttle === -1);\n if (allPaused) return 'paused';\n const { errors } = sumCounts(profiles);\n if (errors > 0 || profiles.some(isThrottled)) return 'degraded';\n return 'healthy';\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { useThrottle } from '../../../api/controlplane';\nimport { isWorker, rowKey, type ThrottleTarget } from './helpers';\n\ninterface UseMeshSelectionOptions {\n activeAppId: string;\n allProfiles: QuorumProfile[];\n profiles: QuorumProfile[];\n}\n\nexport function useMeshSelection({\n activeAppId,\n allProfiles,\n profiles,\n}: UseMeshSelectionOptions) {\n const throttleMutation = useThrottle();\n\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [throttleModalOpen, setThrottleModalOpen] = useState(false);\n const [throttleTargets, setThrottleTargets] = useState<ThrottleTarget[]>([]);\n\n useEffect(() => { setSelectedIds(new Set()); }, [activeAppId]);\n\n const toggleCheckbox = useCallback((profile: QuorumProfile) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n const key = rowKey(profile);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n\n const toggleAll = useCallback(() => {\n if (selectedIds.size === profiles.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(profiles.map(rowKey)));\n }\n }, [profiles, selectedIds.size]);\n\n /**\n * Build throttle targets from checkbox selection.\n *\n * Smart grouping:\n * - All nodes selected -> no topic/guid (entire mesh)\n * - All engines selected -> topic = engine stream (all engines)\n * - All workers on a queue selected -> topic = queue (all workers on queue)\n * - Subset of a group -> individual guid targets\n */\n const selectedThrottleTargets = useMemo((): ThrottleTarget[] => {\n const selected = profiles.filter((p) => selectedIds.has(rowKey(p)));\n if (selected.length === 0) return [];\n\n // All nodes -> entire mesh\n if (selected.length === allProfiles.length) {\n return [{ label: 'Entire Mesh' }];\n }\n\n const engines = selected.filter((p) => !isWorker(p));\n const workers = selected.filter(isWorker);\n const targets: ThrottleTarget[] = [];\n\n // Engines — always guid-per-engine (each engine subscribes to its own guid channel)\n for (const e of engines) {\n targets.push({ label: `Engine ${e.engine_id}`, guid: e.engine_id });\n }\n\n // Workers — topic targets the queue; guid targets a single instance\n const queues = new Map<string, QuorumProfile[]>();\n for (const w of workers) {\n const q = w.worker_topic!;\n if (!queues.has(q)) queues.set(q, []);\n queues.get(q)!.push(w);\n }\n for (const [queue, members] of queues) {\n const allOnQueue = allProfiles.filter((p) => p.worker_topic === queue);\n if (members.length === allOnQueue.length) {\n targets.push({ label: queue, topic: queue });\n } else {\n for (const w of members) {\n targets.push({ label: `${queue} ${w.engine_id}`, guid: w.engine_id });\n }\n }\n }\n\n return targets;\n }, [profiles, allProfiles, selectedIds]);\n\n // ── Throttle handlers ─────────────────────────────────────────\n const handleBulkThrottle = (ms: number) => {\n const targets = throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets;\n for (const t of targets) {\n throttleMutation.mutate({\n appId: activeAppId,\n throttle: ms,\n ...(t.topic ? { topic: t.topic } : {}),\n ...(t.guid ? { guid: t.guid } : {}),\n });\n }\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n const handleRowClick = (profile: QuorumProfile) => {\n const label = isWorker(profile)\n ? `${profile.worker_topic} ${profile.engine_id}`\n : `Engine ${profile.engine_id}`;\n // guid-only: workers and engines both subscribe to their own guid channel\n setThrottleTargets([{ label, guid: profile.engine_id }]);\n setThrottleModalOpen(true);\n };\n\n const handleBulkThrottleOpen = () => {\n setThrottleTargets(selectedThrottleTargets);\n setThrottleModalOpen(true);\n };\n\n const handleResumeThrottle = (profile: QuorumProfile) => {\n // guid-only: both engines and workers subscribe to their own guid channel\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, guid: profile.engine_id });\n };\n\n const handleResumeQueue = (queueName: string) => {\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, topic: queueName });\n };\n\n const handleQueueThrottle = (queueName: string) => {\n setThrottleTargets([{ label: queueName, topic: queueName }]);\n setThrottleModalOpen(true);\n };\n\n const closeThrottleModal = () => {\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n return {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n toggleAll,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n };\n}\n","import { useState } from 'react';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { ThrottleTarget } from './helpers';\n\ninterface ThrottleModalProps {\n open: boolean;\n onClose: () => void;\n targets: ThrottleTarget[];\n onApply: (ms: number) => void;\n isPending: boolean;\n}\n\nconst PRESETS = [\n { label: 'Resume', ms: 0 },\n { label: '0.5s', ms: 500 },\n { label: '1s', ms: 1000 },\n { label: '5s', ms: 5000 },\n { label: '30s', ms: 30000 },\n { label: 'Pause', ms: -1 },\n];\n\nfunction TargetPill({ target }: { target: ThrottleTarget }) {\n const isMesh = target.label === 'Entire Mesh';\n const isEngine = target.label === 'All Engines' || target.label.startsWith('Engine ');\n const color = isMesh\n ? 'bg-status-error/10 text-status-error'\n : isEngine\n ? 'bg-blue-500/10 text-blue-500'\n : 'bg-accent/[0.06] text-text-secondary';\n const scope = target.guid ? 'guid' : target.topic ? 'topic' : 'mesh';\n\n return (\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${color}`}>\n {target.label}\n <span className=\"text-[8px] opacity-50\">{scope}</span>\n </span>\n );\n}\n\nexport function ThrottleModal({ open, onClose, targets, onApply, isPending }: ThrottleModalProps) {\n const [seconds, setSeconds] = useState('');\n\n return (\n <Modal open={open} onClose={onClose} title=\"Adjust Throttle\">\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Targets</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t, i) => (\n <TargetPill key={t.guid || t.topic || i} target={t} />\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Presets</p>\n <div className=\"flex flex-wrap gap-2\">\n {PRESETS.map((p) => (\n <button\n key={p.label}\n onClick={() => onApply(p.ms)}\n disabled={isPending}\n className={`px-3 py-1.5 text-xs rounded transition-colors ${\n p.ms === -1\n ? 'bg-status-error/10 text-status-error hover:bg-status-error/20'\n : p.ms === 0\n ? 'bg-status-success/10 text-status-success hover:bg-status-success/20'\n : 'bg-surface-sunken text-text-secondary hover:bg-surface-hover'\n } disabled:opacity-50`}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Custom delay (seconds)\n </p>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={seconds}\n onChange={(e) => setSeconds(e.target.value)}\n placeholder=\"e.g. 2.5\"\n className=\"input text-xs py-1.5 px-3 w-28\"\n />\n <button\n onClick={() => {\n const s = parseFloat(seconds);\n if (isNaN(s) || s < 0) return;\n onApply(Math.round(s * 1000));\n }}\n disabled={isPending}\n className=\"btn-primary text-xs py-1.5 px-4 disabled:opacity-50\"\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { CirclePause, Play, Loader2 } from 'lucide-react';\nimport { useControlPlaneApps, useThrottle } from '../../../api/controlplane';\n\nexport function EmergencyControls() {\n const { data: appsData } = useControlPlaneApps();\n const throttle = useThrottle();\n const [confirming, setConfirming] = useState(false);\n const [inflight, setInflight] = useState(false);\n\n const apps = appsData?.apps ?? [];\n\n const applyAll = useCallback(async (ms: number) => {\n if (apps.length === 0) return;\n setInflight(true);\n\n // Use mutateAsync so each call returns a real promise.\n // Promise.allSettled ensures all apps get throttled even if some fail.\n const results = await Promise.allSettled(\n apps.map((app) => throttle.mutateAsync({ appId: app.appId, throttle: ms })),\n );\n\n const failed = results.filter((r) => r.status === 'rejected').length;\n if (failed > 0) {\n console.error(`Emergency throttle: ${failed}/${results.length} apps failed`);\n }\n\n setInflight(false);\n setConfirming(false);\n }, [apps, throttle]);\n\n if (confirming) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-status-error\">\n Pause all {apps.length} app{apps.length !== 1 ? 's' : ''}?\n </span>\n <button\n onClick={() => applyAll(-1)}\n disabled={inflight}\n className=\"px-2.5 py-1 text-xs rounded-md bg-status-error text-white hover:bg-status-error/90 transition-colors disabled:opacity-50\"\n >\n {inflight ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : 'Confirm'}\n </button>\n <button\n onClick={() => setConfirming(false)}\n disabled={inflight}\n className=\"px-2.5 py-1 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n Cancel\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setConfirming(true)}\n disabled={inflight}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-error/80 hover:text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50\"\n title=\"Pause all queues across all applications\"\n >\n <CirclePause className=\"w-3.5 h-3.5\" />\n Pause All\n </button>\n <button\n onClick={() => applyAll(0)}\n disabled={inflight}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-success/80 hover:text-status-success hover:bg-status-success/10 transition-colors disabled:opacity-50\"\n title=\"Resume all queues across all applications\"\n >\n {inflight ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Play className=\"w-3.5 h-3.5\" />}\n Resume All\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { stripStreamPrefix, type NodeFilter } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface StreamVolumeChartProps {\n byStream: StreamEntry[];\n onNodeFilter?: (filter: NodeFilter) => void;\n onQueueFilter?: (queue: string) => void;\n}\n\nexport function StreamVolumeChart({ byStream, onNodeFilter }: StreamVolumeChartProps) {\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n setAnimated(false);\n const raf = requestAnimationFrame(() => setAnimated(true));\n return () => cancelAnimationFrame(raf);\n }, [byStream]);\n\n if (byStream.length === 0) {\n return <p className=\"text-xs text-text-tertiary py-4 text-center\">No activity in this period</p>;\n }\n\n const engineStreams = byStream.filter((s) => s.stream_type === 'engine');\n const workerStreams = byStream.filter((s) => s.stream_type === 'worker');\n const maxCount = Math.max(...byStream.map((s) => s.count));\n\n const renderBar = (s: StreamEntry) => {\n const pct = maxCount > 0 ? (s.count / maxCount) * 100 : 0;\n const isEngine = s.stream_type === 'engine';\n const label = isEngine ? '(all engines)' : stripStreamPrefix(s.stream_name);\n const barColor = isEngine ? 'bg-blue-500/70' : 'bg-accent/60';\n const labelColor = isEngine ? 'text-blue-500' : 'text-text-tertiary';\n return (\n <div key={`${s.stream_type}-${s.stream_name}`} className=\"flex items-center gap-3\">\n <span\n className={`text-[9px] font-mono ${labelColor} w-36 truncate text-right shrink-0`}\n title={s.stream_name}\n >\n {label}\n </span>\n <div className=\"flex-1 h-4 bg-surface-sunken rounded overflow-hidden\">\n <div\n className={`h-full ${barColor} rounded transition-all duration-500 ease-out`}\n style={{ width: animated ? `${pct}%` : '0%' }}\n />\n </div>\n <span className=\"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0\">\n {s.count.toLocaleString()}\n </span>\n </div>\n );\n };\n\n const labelCls = 'text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline';\n\n return (\n <div className=\"space-y-1.5\">\n {engineStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-blue-500/70 hover:text-blue-500`}\n onClick={() => onNodeFilter?.('engines')}\n >\n Engine Message Volume\n </p>\n {engineStreams.map(renderBar)}\n {workerStreams.length > 0 && <div className=\"h-2\" />}\n </>\n )}\n {workerStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-accent/70 hover:text-accent`}\n onClick={() => onNodeFilter?.('workers')}\n >\n Worker Message Volume\n </p>\n {workerStreams.map(renderBar)}\n </>\n )}\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { ChevronRight, Gauge, CirclePlay, Activity, Clock, Inbox } from 'lucide-react';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { isThrottled, formatThrottleHuman, formatMemory, rowKey, stripStreamPrefix, queueHealth, totalPending, sumCounts } from './helpers';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport type { Duration } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface QueueCardProps {\n queue: string;\n workers: QuorumProfile[];\n expanded: boolean;\n onToggle: (queue: string) => void;\n onWorkerClick: (p: QuorumProfile) => void;\n onResumeThrottle: (p: QuorumProfile) => void;\n onQueueThrottle: (queue: string) => void;\n onResumeQueue: (queue: string) => void;\n byStream: StreamEntry[];\n activeDuration: Duration;\n}\n\nexport function QueueCard({\n queue,\n workers,\n expanded,\n onToggle,\n onWorkerClick,\n onResumeThrottle,\n onQueueThrottle,\n onResumeQueue,\n byStream,\n activeDuration,\n}: QueueCardProps) {\n const streamCount = useMemo(() => {\n const match = byStream.find(\n (s) => s.stream_type === 'worker' && stripStreamPrefix(s.stream_name) === queue,\n );\n return match?.count ?? 0;\n }, [byStream, queue]);\n\n const health = useMemo(() => queueHealth(workers), [workers]);\n const pending = useMemo(() => totalPending(workers), [workers]);\n const { errors } = useMemo(() => sumCounts(workers), [workers]);\n\n const healthDot = health === 'paused'\n ? 'bg-status-error'\n : health === 'degraded'\n ? 'bg-status-warning'\n : 'bg-status-success';\n\n const columns = useMemo((): Column<QuorumProfile>[] => [\n {\n key: 'engine_id',\n label: 'Worker ID',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {row.engine_id}\n </span>\n ),\n className: 'w-48',\n },\n {\n key: 'throttle',\n label: 'Throttle',\n render: (row) => {\n const t = row.throttle;\n if (t === -1) return <span className=\"text-xs text-status-error font-medium\">Paused</span>;\n if (t && t > 0) return <span className=\"text-xs text-status-warning font-medium\">{formatThrottleHuman(t)}</span>;\n return <span className=\"text-xs text-text-tertiary\">0</span>;\n },\n className: 'w-24',\n },\n {\n key: 'memory',\n label: 'Memory',\n render: (row) => (\n <span className=\"text-xs font-mono text-text-tertiary\">\n {formatMemory(row.system?.TotalMemoryGB, row.system?.FreeMemoryGB)}\n </span>\n ),\n className: 'w-36',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {isThrottled(row) && (\n <RowAction\n icon={CirclePlay}\n title=\"Resume (remove throttle)\"\n onClick={() => onResumeThrottle(row)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction\n icon={Gauge}\n title=\"Adjust throttle\"\n onClick={() => onWorkerClick(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16',\n },\n ], [onWorkerClick, onResumeThrottle]);\n\n return (\n <div>\n <button\n onClick={() => onToggle(queue)}\n className=\"group/row relative flex items-center gap-3 w-full py-2 hover:bg-surface-hover transition-colors text-left rounded\"\n >\n <span className={`w-2 h-2 rounded-full shrink-0 ${healthDot}`} title={health} />\n <ChevronRight\n className={`w-3.5 h-3.5 text-text-tertiary/50 transition-transform duration-200 ${expanded ? 'rotate-90' : ''}`}\n strokeWidth={2}\n />\n <TaskQueuePill queue={queue} size=\"sm\" />\n\n <span className=\"flex-1\" />\n\n {errors > 0 && (\n <span className=\"text-[10px] text-status-error font-medium mr-2\">\n {errors} errors\n </span>\n )}\n\n {pending > 0 && (\n <span className=\"flex items-center gap-1 text-[10px] text-status-warning w-20\">\n <Inbox className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n <span className=\"font-mono tabular-nums\">{pending.toLocaleString()}</span>\n </span>\n )}\n\n <span className={`flex items-center gap-1 text-xs w-24 ${workers.some(isThrottled) ? 'text-status-warning' : 'text-text-tertiary'}`}>\n <Activity className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n <span className=\"font-mono tabular-nums\">{workers.length}</span>\n <span>workers</span>\n </span>\n\n <span className=\"flex items-center gap-1 text-xs font-mono text-text-tertiary w-28 justify-end mr-16\">\n {streamCount > 0 ? (\n <>\n <Clock className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n {streamCount.toLocaleString()} in {activeDuration}\n </>\n ) : (\n <span className=\"text-text-tertiary/40\">—</span>\n )}\n </span>\n\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-0 group-hover/row:opacity-100 transition-opacity flex items-center gap-2\">\n {workers.some(isThrottled) && (\n <CirclePlay\n className=\"w-4 h-4 text-text-tertiary hover:text-status-success\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onResumeQueue(queue);\n }}\n />\n )}\n <Gauge\n className=\"w-4 h-4 text-text-tertiary hover:text-accent\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onQueueThrottle(queue);\n }}\n />\n </span>\n </button>\n\n <Collapsible open={expanded}>\n <div className=\"ml-6\">\n <DataTable\n columns={columns}\n data={workers}\n keyFn={rowKey}\n onRowClick={onWorkerClick}\n emptyMessage=\"No workers\"\n inline\n />\n </div>\n </Collapsible>\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { Radio, Settings, Eraser, Code } from 'lucide-react';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { useEventSubscription } from '../../../hooks/useEventContext';\nimport {\n EVENT_TYPE_COLORS,\n EVENT_TYPE_LABELS,\n QUORUM_CHANNELS,\n MAX_EVENTS,\n formatThrottleHuman,\n type QuorumEvent,\n} from './helpers';\n\nlet eventCounter = 0;\n\n// ── Human-readable event summaries ─────────────────────────────────────────\n\nfunction humanizeEvent(event: QuorumEvent): string {\n const d = event.data || {};\n const topic = d.topic ? String(d.topic) : '';\n const guid = d.guid ? String(d.guid).slice(0, 8) : '';\n\n switch (event.type) {\n case 'pong':\n return topic\n ? `Worker ${guid}... on \"${topic}\" responded`\n : `Engine ${guid}... responded`;\n case 'ping':\n return 'Roll call broadcast';\n case 'throttle': {\n const ms = d.throttle as number;\n const target = topic ? `queue \"${topic}\"` : guid ? `node ${guid}...` : 'all nodes';\n return `${formatThrottleHuman(ms)} applied to ${target}`;\n }\n case 'job':\n return `Job ${guid ? guid + '...' : ''} ${d.status || 'updated'}`;\n case 'work':\n return `Dispatched to \"${topic || 'worker'}\" ${guid ? '(' + guid + '...)' : ''}`;\n case 'activate':\n return `Worker \"${topic || 'unknown'}\" activated`;\n case 'cron':\n return `Cron triggered ${topic ? '\"' + topic + '\"' : ''}`;\n default:\n return topic || guid || event.type;\n }\n}\n\n// ── Aggregate display items ───────────────────────────────────────────────\n\ninterface DisplayItem {\n kind: 'single';\n event: QuorumEvent;\n}\n\ninterface DisplayGroup {\n kind: 'group';\n type: string;\n count: number;\n firstTimestamp: string;\n lastTimestamp: string;\n events: QuorumEvent[];\n}\n\ntype FeedItem = DisplayItem | DisplayGroup;\n\n/** Collapse consecutive pong events into a summary row. */\nfunction collapseEvents(events: QuorumEvent[]): FeedItem[] {\n const items: FeedItem[] = [];\n let i = 0;\n while (i < events.length) {\n const evt = events[i];\n // Group consecutive pong events\n if (evt.type === 'pong') {\n let j = i + 1;\n while (j < events.length && events[j].type === 'pong') j++;\n const batch = events.slice(i, j);\n if (batch.length >= 3) {\n items.push({\n kind: 'group',\n type: 'pong',\n count: batch.length,\n firstTimestamp: batch[batch.length - 1].timestamp,\n lastTimestamp: batch[0].timestamp,\n events: batch,\n });\n } else {\n for (const e of batch) items.push({ kind: 'single', event: e });\n }\n i = j;\n } else {\n items.push({ kind: 'single', event: evt });\n i++;\n }\n }\n return items;\n}\n\n// ── Event row ───────────────────────────────────────────────────────────────\n\nfunction QuorumEventRow({ event }: { event: QuorumEvent }) {\n const [expanded, setExpanded] = useState(false);\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(event.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS[event.type] || 'text-text-tertiary'} bg-surface-sunken whitespace-nowrap shrink-0`}>\n {EVENT_TYPE_LABELS[event.type] || event.type}\n </span>\n <span className=\"text-[9px] text-text-secondary flex-1 min-w-0 truncate\">\n {humanizeEvent(event)}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"pb-2\">\n <JsonViewer data={event.data} />\n </div>\n </Collapsible>\n </div>\n );\n}\n\n/** Collapsed group row for consecutive pong events. */\nfunction QuorumGroupRow({ group }: { group: DisplayGroup }) {\n const [expanded, setExpanded] = useState(false);\n const engines = group.events.filter((e) => !e.data?.topic).length;\n const workers = group.count - engines;\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(group.lastTimestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS.pong} bg-surface-sunken whitespace-nowrap shrink-0`}>\n roll call\n </span>\n <span className=\"text-[9px] text-text-secondary flex-1 min-w-0 truncate\">\n {group.count} nodes responded\n {engines > 0 && workers > 0\n ? ` (${engines} engine${engines !== 1 ? 's' : ''}, ${workers} worker${workers !== 1 ? 's' : ''})`\n : engines > 0\n ? ` (${engines} engine${engines !== 1 ? 's' : ''})`\n : ` (${workers} worker${workers !== 1 ? 's' : ''})`}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"ml-4\">\n {group.events.map((evt) => (\n <QuorumEventRow key={evt.id} event={evt} />\n ))}\n </div>\n </Collapsible>\n </div>\n );\n}\n\n// ── Config panel ────────────────────────────────────────────────────────────\n\ninterface ConfigPanelProps {\n channels: Set<string>;\n onToggle: (key: string) => void;\n customFilter: string;\n onCustomFilterChange: (v: string) => void;\n}\n\nfunction ConfigPanel({ channels, onToggle, customFilter, onCustomFilterChange }: ConfigPanelProps) {\n return (\n <div className=\"space-y-3 pb-3 border-b border-surface-border mb-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Channels\n </p>\n <p className=\"text-[9px] text-text-tertiary\">\n Unchecked channels are dropped before buffering\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {QUORUM_CHANNELS.map((ch) => (\n <label key={ch.key} className=\"flex items-center gap-2 cursor-pointer py-0.5\">\n <input\n type=\"checkbox\"\n checked={channels.has(ch.key)}\n onChange={() => onToggle(ch.key)}\n className=\"w-3 h-3 rounded border-border accent-accent\"\n />\n <span className=\"text-[10px] text-text-secondary\" title={ch.description}>\n {ch.label}\n </span>\n </label>\n ))}\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Text Filter\n </p>\n <input\n type=\"text\"\n value={customFilter}\n onChange={(e) => onCustomFilterChange(e.target.value)}\n placeholder=\"pong\"\n className=\"input text-[10px] font-mono py-1 px-2 w-full\"\n />\n <p className=\"text-[9px] text-text-tertiary mt-1\">\n Filter by event type, e.g. <span className=\"font-mono\">pong</span>, <span className=\"font-mono\">throttle</span>, or any text in the event data.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Feed panel ──────────────────────────────────────────────────────────────\n\ninterface QuorumFeedProps {\n bridgeActive: boolean;\n}\n\nexport function QuorumFeed({ bridgeActive }: QuorumFeedProps) {\n const [showConfig, setShowConfig] = useState(false);\n const [showRaw, setShowRaw] = useState(false);\n const [events, setEvents] = useState<QuorumEvent[]>([]);\n const [channels, setChannels] = useState<Set<string>>(\n () => new Set(QUORUM_CHANNELS.map((c) => c.key)),\n );\n const [customFilter, setCustomFilter] = useState('');\n\n // Keep a ref to channels so the event callback reads the latest without re-subscribing\n const channelsRef = useRef(channels);\n useEffect(() => { channelsRef.current = channels; }, [channels]);\n const customFilterRef = useRef(customFilter);\n useEffect(() => { customFilterRef.current = customFilter; }, [customFilter]);\n\n const toggleChannel = (key: string) => {\n setChannels((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Subscribe to NATS and filter on intake (before buffer)\n useEventSubscription('lt.events.mesh.>', useCallback((raw: any) => {\n const type = raw.type?.replace('mesh.', '') || 'unknown';\n\n // Channel filter: drop events for unchecked channels at intake\n if (!channelsRef.current.has(type)) return;\n\n // Text filter: if set, match against type or stringified data\n const cf = customFilterRef.current;\n if (cf) {\n const haystack = `${type} ${JSON.stringify(raw.data || raw)}`.toLowerCase();\n if (!haystack.includes(cf.toLowerCase())) return;\n }\n\n setEvents((prev) => {\n const next = [{\n id: ++eventCounter,\n type,\n timestamp: raw.timestamp || new Date().toISOString(),\n data: raw.data || raw,\n }, ...prev];\n return next.slice(0, MAX_EVENTS);\n });\n }, []));\n\n const handleClear = () => setEvents([]);\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Event Stream\n </p>\n <Radio className={`w-3 h-3 ${bridgeActive ? 'text-status-success animate-pulse' : 'text-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {bridgeActive ? 'Live' : '...'}\n </span>\n\n <span className=\"ml-auto flex items-center gap-1\">\n <button\n onClick={() => { setShowConfig((v) => !v); setShowRaw(false); }}\n className={`p-1 rounded transition-colors ${showConfig ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"Configure channels\"\n >\n <Settings className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => { setShowRaw((v) => !v); setShowConfig(false); }}\n className={`p-1 rounded transition-colors ${showRaw ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"View raw JSON\"\n >\n <Code className=\"w-3.5 h-3.5\" />\n </button>\n {events.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Clear events\"\n >\n <Eraser className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </span>\n </div>\n\n {/* Config panel (animated) */}\n <Collapsible open={showConfig}>\n <ConfigPanel\n channels={channels}\n onToggle={toggleChannel}\n customFilter={customFilter}\n onCustomFilterChange={setCustomFilter}\n />\n </Collapsible>\n\n {/* Raw JSON view */}\n <Collapsible open={showRaw}>\n <div className=\"pb-3 border-b border-surface-border mb-3\">\n <pre className=\"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap\">\n {JSON.stringify(events.slice(0, 50), null, 2)}\n </pre>\n </div>\n </Collapsible>\n\n {/* Event count */}\n {events.length > 0 && (\n <p className=\"text-[9px] text-text-tertiary mb-2\">\n {events.length} events\n </p>\n )}\n\n {/* Event list */}\n <div className=\"flex-1 overflow-y-auto\">\n {events.length === 0 ? (\n <p className=\"text-xs text-text-tertiary py-6 text-center\">\n {bridgeActive ? 'Waiting for events...' : 'Subscribing...'}\n </p>\n ) : (\n collapseEvents(events).map((item, idx) =>\n item.kind === 'group' ? (\n <QuorumGroupRow key={`grp-${idx}`} group={item} />\n ) : (\n <QuorumEventRow key={item.event.id} event={item.event} />\n ),\n )\n )}\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { Zap, Server, CirclePause, ChevronRight, Gauge } from 'lucide-react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { sumCounts, formatUptime, engineLabel, engineSource, formatMemory, isThrottled, formatThrottleHuman } from './helpers';\n\ninterface EngineClusterProps {\n engines: QuorumProfile[];\n onThrottle: (profile: QuorumProfile) => void;\n onResumeThrottle: (profile: QuorumProfile) => void;\n isLoading: boolean;\n}\n\n/** Identify the active engine: the non-paused engine with the most processed messages. */\nfunction findActive(engines: QuorumProfile[]): QuorumProfile | null {\n if (engines.length === 0) return null;\n // Only consider engines that aren't paused/throttled\n const candidates = engines.filter((e) => !isThrottled(e));\n // If all are paused, there is no active engine\n if (candidates.length === 0) return null;\n let active: QuorumProfile | null = null;\n let maxCount = -1;\n for (const e of candidates) {\n const total = sumCounts([e]).total;\n if (total > maxCount) {\n maxCount = total;\n active = e;\n }\n }\n return active || candidates[0];\n}\n\nfunction Stat({ value, label, warn, title }: { value: string | number; label: string; warn?: boolean; title?: string }) {\n return (\n <div title={title}>\n <p className={`text-sm font-mono tabular-nums ${warn ? 'text-status-warning' : 'text-text-primary'}`}>\n {typeof value === 'number' ? value.toLocaleString() : value}\n </p>\n <p className=\"text-[9px] text-text-tertiary uppercase tracking-widest\">{label}</p>\n </div>\n );\n}\n\nfunction StandbyRow({ engine }: { engine: QuorumProfile }) {\n const label = engineLabel(engine.engine_id);\n const source = engineSource(engine.engine_id);\n const paused = isThrottled(engine);\n\n return (\n <div className=\"flex items-center gap-3 py-1.5\">\n <Server className=\"w-3 h-3 text-text-tertiary/40 shrink-0\" strokeWidth={1.5} />\n <span className=\"text-xs text-text-secondary truncate max-w-[180px]\" title={engine.engine_id}>{label}</span>\n {source && <span className=\"text-[10px] text-text-tertiary/50\">{source}</span>}\n <span className=\"flex-1\" />\n {paused && (\n <span className=\"text-[10px] text-status-warning\">{engine.throttle === -1 ? 'Paused' : formatThrottleHuman(engine.throttle)}</span>\n )}\n <span className=\"text-[10px] font-mono text-text-tertiary/50\">{formatUptime(engine.inited)}</span>\n </div>\n );\n}\n\nexport function EngineCluster({ engines, onThrottle, isLoading }: EngineClusterProps) {\n const [showStandby, setShowStandby] = useState(false);\n\n const active = useMemo(() => findActive(engines), [engines]);\n const rest = useMemo(\n () => engines.filter((e) => e !== active).sort((a, b) => {\n // Paused engines first in the standby list (they're notable)\n const ap = isThrottled(a) ? 0 : 1;\n const bp = isThrottled(b) ? 0 : 1;\n if (ap !== bp) return ap - bp;\n return engineLabel(a.engine_id).localeCompare(engineLabel(b.engine_id));\n }),\n [engines, active],\n );\n\n const pausedCount = engines.filter(isThrottled).length;\n\n if (isLoading) {\n return <p className=\"text-xs text-text-tertiary\">Discovering engines...</p>;\n }\n\n if (engines.length === 0) {\n return <p className=\"text-xs text-text-tertiary\">No engines found.</p>;\n }\n\n // All engines paused — no active processor\n if (!active) {\n return (\n <div>\n <div className=\"flex items-center gap-3 py-2\">\n <CirclePause className=\"w-4 h-4 text-status-error shrink-0\" strokeWidth={1.5} />\n <span className=\"text-base text-status-error font-medium\">All {engines.length} engines paused</span>\n <span className=\"text-[10px] text-text-tertiary\">Messages are accumulating. Resume at least one engine to restore processing.</span>\n </div>\n <div className=\"mt-2\">\n {engines.map((e) => (\n <StandbyRow key={e.engine_id} engine={e} />\n ))}\n </div>\n </div>\n );\n }\n\n const label = engineLabel(active.engine_id);\n const source = engineSource(active.engine_id);\n const counts = sumCounts([active]);\n const pending = active.stream_depth ?? 0;\n\n return (\n <div>\n {/* Active engine */}\n <div className=\"flex items-center gap-3 py-2\">\n <Zap className=\"w-4 h-4 text-status-success shrink-0\" strokeWidth={1.5} />\n <span className=\"text-base text-text-primary font-medium\">{label}</span>\n {source && <span className=\"text-[10px] text-text-tertiary/60\">{source}</span>}\n <span className=\"text-[9px] text-status-success uppercase tracking-widest\">active</span>\n <span className=\"flex-1\" />\n\n <button\n onClick={() => onThrottle(active)}\n className=\"flex items-center gap-1 text-[10px] text-text-tertiary hover:text-status-warning transition-colors\"\n title=\"Pause to force failover to standby\"\n >\n <CirclePause className=\"w-3.5 h-3.5\" />\n Pause\n </button>\n <button\n onClick={() => onThrottle(active)}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title=\"Adjust throttle\"\n >\n <Gauge className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </div>\n\n {/* Stats row */}\n <div className=\"flex items-center gap-8 ml-7 mt-1\">\n <Stat value={counts.total} label=\"processed\" />\n <Stat value={pending} label=\"queued\" warn={pending > 100} title=\"Total messages waiting in the engine stream (shared across all engines)\" />\n {counts.errors > 0 && <Stat value={counts.errors} label=\"errors\" warn />}\n <Stat value={formatUptime(active.inited)} label=\"uptime\" />\n <Stat value={formatMemory(active.system?.TotalMemoryGB, active.system?.FreeMemoryGB)} label=\"memory\" />\n </div>\n\n {/* Standby / paused list */}\n {rest.length > 0 && (\n <div className=\"mt-4 ml-7\">\n <button\n onClick={() => setShowStandby(!showStandby)}\n className=\"flex items-center gap-1.5 text-[10px] text-text-tertiary hover:text-text-secondary transition-colors\"\n >\n <ChevronRight className={`w-3 h-3 transition-transform duration-200 ${showStandby ? 'rotate-90' : ''}`} strokeWidth={2} />\n {rest.length} standby{pausedCount > 0 ? ` (${pausedCount} paused)` : ''}\n </button>\n <Collapsible open={showStandby}>\n <div className=\"mt-1\">\n {rest.map((e) => (\n <StandbyRow key={e.engine_id} engine={e} />\n ))}\n </div>\n </Collapsible>\n </div>\n )}\n </div>\n );\n}\n","import { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { StreamVolumeChart } from './StreamVolumeChart';\nimport { QueueCard } from './QueueCard';\nimport { QuorumFeed } from './QuorumFeed';\nimport { EngineCluster } from './EngineCluster';\nimport type { Duration } from './helpers';\n\ninterface ControlPlaneContentProps {\n collapsed: Record<string, boolean>;\n toggleSection: (key: string) => void;\n activeDuration: Duration;\n streamStats: { byStream: Array<any> } | undefined;\n isLoading: boolean;\n queueMap: Map<string, Array<any>>;\n expandedQueues: Set<string>;\n toggleQueue: (queue: string) => void;\n allQueuesExpanded: boolean;\n toggleAllQueues: () => void;\n handleRowClick: (profile: any) => void;\n handleResumeThrottle: (profile: any) => void;\n handleQueueThrottle: (queue: string) => void;\n handleResumeQueue: (queue: string) => void;\n engines: Array<any>;\n bridgeActive: boolean;\n}\n\nexport function ControlPlaneContent({\n collapsed,\n toggleSection,\n activeDuration,\n streamStats,\n isLoading,\n queueMap,\n expandedQueues,\n toggleQueue,\n allQueuesExpanded,\n toggleAllQueues,\n handleRowClick,\n handleResumeThrottle,\n handleQueueThrottle,\n handleResumeQueue,\n engines,\n bridgeActive,\n}: ControlPlaneContentProps) {\n return (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6\">\n <div className=\"flex flex-col gap-12 mt-10\">\n {/* Stream Volume section */}\n <CollapsibleSection\n title={`Stream Volume (${activeDuration})`}\n sectionKey=\"volume\"\n isCollapsed={!!collapsed.volume}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <StreamVolumeChart\n byStream={streamStats?.byStream ?? []}\n onNodeFilter={() => {}}\n onQueueFilter={() => {}}\n />\n </CollapsibleSection>\n\n {/* Task Queues section */}\n <CollapsibleSection\n title=\"Worker Queues\"\n sectionKey=\"queues\"\n isCollapsed={!!collapsed.queues}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7 flex flex-col gap-0\"\n >\n {isLoading ? (\n <p className=\"text-xs text-text-tertiary\">Discovering mesh nodes...</p>\n ) : queueMap.size === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No worker queues found. Click \"Roll Call\" to discover.</p>\n ) : (\n <>\n <div className=\"flex justify-end mb-2\">\n <button onClick={toggleAllQueues} className=\"text-[10px] text-accent hover:underline\">\n {allQueuesExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n </div>\n {[...queueMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([queue, qWorkers]) => (\n <QueueCard\n key={queue}\n queue={queue}\n workers={qWorkers}\n expanded={expandedQueues.has(queue)}\n onToggle={toggleQueue}\n onWorkerClick={handleRowClick}\n onResumeThrottle={handleResumeThrottle}\n onQueueThrottle={handleQueueThrottle}\n onResumeQueue={handleResumeQueue}\n byStream={streamStats?.byStream ?? []}\n activeDuration={activeDuration}\n />\n ))}\n </>\n )}\n </CollapsibleSection>\n\n {/* Engine cluster */}\n <CollapsibleSection\n title={`Engine Cluster (${engines.length})`}\n sectionKey=\"engines\"\n isCollapsed={!!collapsed.engines}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <EngineCluster\n engines={engines}\n onThrottle={handleRowClick}\n onResumeThrottle={handleResumeThrottle}\n isLoading={isLoading}\n />\n </CollapsibleSection>\n </div>\n\n <QuorumFeed bridgeActive={bridgeActive} />\n </div>\n );\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { RefreshCw } from 'lucide-react';\nimport { PageHeaderWithStats, type InlineStat } from '../../../components/common/layout/PageHeaderWithStats';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport {\n useControlPlaneApps,\n useRollCall,\n useStreamStats,\n useSubscribeMesh,\n} from '../../../api/controlplane';\nimport {\n DURATIONS,\n isWorker,\n isThrottled,\n groupByQueue,\n type Duration,\n} from './helpers';\nimport { useMeshSelection } from './useMeshSelection';\nimport { ThrottleModal } from './ThrottleModal';\nimport { EmergencyControls } from './EmergencyControls';\nimport { ControlPlaneContent } from './ControlPlaneContent';\n\nexport function ControlPlanePage() {\n const { data: appsData } = useControlPlaneApps();\n const apps = appsData?.apps ?? [];\n\n const { filters, setFilter } = useFilterParams({\n filters: { app_id: '', duration: '1h' },\n });\n\n const firstAppId = apps[0]?.appId ?? 'durable';\n const activeAppId = filters.app_id || firstAppId;\n const activeDuration = (filters.duration || '1h') as Duration;\n\n const subscribeMesh = useSubscribeMesh();\n\n const REFRESH_INTERVAL = 60_000;\n\n const { data: rollCallData, isLoading, error: rollCallError, refetch, isFetching } = useRollCall(activeAppId, REFRESH_INTERVAL);\n const { data: streamStats } = useStreamStats(activeAppId, activeDuration, undefined, REFRESH_INTERVAL);\n\n // ── All profiles (sorted) ───────────────────────────────────\n const allProfiles = useMemo(() => {\n const raw = rollCallData?.profiles ?? [];\n return [...raw].sort((a, b) => {\n const ta = a.worker_topic || a.stream || '';\n const tb = b.worker_topic || b.stream || '';\n if (!a.worker_topic && b.worker_topic) return -1;\n if (a.worker_topic && !b.worker_topic) return 1;\n return ta.localeCompare(tb);\n });\n }, [rollCallData?.profiles]);\n\n // ── Derived data ──────────────────────────────────────────────\n const engines = useMemo(() => allProfiles.filter((p) => !isWorker(p)), [allProfiles]);\n const workers = useMemo(() => allProfiles.filter(isWorker), [allProfiles]);\n const queueMap = useMemo(() => groupByQueue(allProfiles), [allProfiles]);\n const throttledCount = allProfiles.filter(isThrottled).length;\n\n const appOptions = useMemo(() => {\n const ids = new Set(apps.map((a) => a.appId));\n if (activeAppId) ids.add(activeAppId);\n return [...ids].sort().map((id) => ({ value: id, label: id }));\n }, [apps, activeAppId]);\n\n // ── Queue card expand/collapse state ───────────────────────────\n const [expandedQueues, setExpandedQueues] = useState<Set<string>>(new Set());\n const toggleQueue = useCallback((queue: string) => {\n setExpandedQueues((prev) => {\n const next = new Set(prev);\n if (next.has(queue)) next.delete(queue);\n else next.add(queue);\n return next;\n });\n }, []);\n const allQueuesExpanded = queueMap.size > 0 && [...queueMap.keys()].every((q) => expandedQueues.has(q));\n const toggleAllQueues = useCallback(() => {\n if (allQueuesExpanded) setExpandedQueues(new Set());\n else setExpandedQueues(new Set(queueMap.keys()));\n }, [allQueuesExpanded, queueMap]);\n\n // ── Section collapse state (persisted) ─────────────────────────\n const STORAGE_KEY = 'lt:controlplane:collapsed';\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>(() => {\n try {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n } catch { return {}; }\n });\n const toggleSection = useCallback((key: string) => {\n setCollapsed((prev) => {\n const next = { ...prev, [key]: !prev[key] };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n return next;\n });\n }, []);\n\n // ── Selection + throttle logic ─────────────────────────────\n const {\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n } = useMeshSelection({ activeAppId, allProfiles, profiles: allProfiles });\n\n // ── Header stats ──────────────────────────────────────────────\n const headerStats = useMemo((): InlineStat[] => {\n const stats: InlineStat[] = [\n { label: 'Engines', value: engines.length, dotClass: 'bg-blue-500' },\n { label: 'Workers', value: workers.length, dotClass: 'bg-text-secondary' },\n { label: 'Queues', value: queueMap.size },\n ];\n if (throttledCount > 0) {\n stats.push({ label: 'Throttled', value: throttledCount, dotClass: 'bg-status-warning' });\n }\n return stats;\n }, [engines.length, workers.length, queueMap.size, throttledCount]);\n\n // ── Quorum bridge ────────────────────────────────────────────\n const [bridgeActive, setBridgeActive] = useState(false);\n\n const handleStartBridge = useCallback(() => {\n subscribeMesh.mutate({ appId: activeAppId }, {\n onSuccess: () => setBridgeActive(true),\n });\n }, [activeAppId, subscribeMesh]);\n\n useEffect(() => {\n if (!bridgeActive && activeAppId) {\n handleStartBridge();\n }\n }, [activeAppId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Queues\"\n docsHash=\"#docs:dashboard.md:task-queues\"\n stats={headerStats}\n actions={<EmergencyControls />}\n />\n\n <FilterBar\n actions={\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setFilter('duration', d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n activeDuration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n }\n >\n <FilterSelect\n label=\"Application\"\n value={filters.app_id}\n onChange={(v) => setFilter('app_id', v)}\n options={appOptions}\n />\n <button\n onClick={() => refetch()}\n disabled={isFetching}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n Roll Call\n </button>\n </FilterBar>\n\n {/* Error banner */}\n {rollCallError && (\n <div className=\"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20\">\n <p className=\"text-xs text-status-error font-medium\">\n {rollCallError.message === 'Session expired'\n ? 'Session expired — please log in again.'\n : `Failed to load mesh data: ${rollCallError.message}`}\n </p>\n </div>\n )}\n\n <ControlPlaneContent\n collapsed={collapsed}\n toggleSection={toggleSection}\n activeDuration={activeDuration}\n streamStats={streamStats}\n isLoading={isLoading}\n queueMap={queueMap}\n expandedQueues={expandedQueues}\n toggleQueue={toggleQueue}\n allQueuesExpanded={allQueuesExpanded}\n toggleAllQueues={toggleAllQueues}\n handleRowClick={handleRowClick}\n handleResumeThrottle={handleResumeThrottle}\n handleQueueThrottle={handleQueueThrottle}\n handleResumeQueue={handleResumeQueue}\n engines={engines}\n bridgeActive={bridgeActive}\n />\n\n <ThrottleModal\n open={throttleModalOpen}\n onClose={closeThrottleModal}\n targets={throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets}\n onApply={handleBulkThrottle}\n isPending={throttleMutation.isPending}\n />\n </div>\n );\n}\n"],"names":["DURATIONS","EVENT_TYPE_COLORS","EVENT_TYPE_LABELS","MAX_EVENTS","isWorker","p","isThrottled","formatThrottleHuman","ms","parseTimestamp","ts","match","y","mo","d","h","mi","s","date","formatUptime","inited","m","formatMemory","total","free","t","f","stripStreamPrefix","name","engineLabel","engineId","engineSource","QUORUM_CHANNELS","rowKey","groupByQueue","profiles","map","q","sumCounts","success","errors","code","n","totalPending","sum","queueHealth","useMeshSelection","activeAppId","allProfiles","throttleMutation","useThrottle","selectedIds","setSelectedIds","useState","throttleModalOpen","setThrottleModalOpen","throttleTargets","setThrottleTargets","useEffect","toggleCheckbox","useCallback","profile","prev","next","key","toggleAll","selectedThrottleTargets","useMemo","selected","engines","workers","targets","e","queues","w","queue","members","allOnQueue","label","queueName","PRESETS","TargetPill","target","isMesh","isEngine","color","scope","jsxs","jsx","ThrottleModal","open","onClose","onApply","isPending","seconds","setSeconds","Modal","i","EmergencyControls","appsData","useControlPlaneApps","throttle","confirming","setConfirming","inflight","setInflight","apps","applyAll","results","app","failed","r","Loader2","CirclePause","Play","StreamVolumeChart","byStream","onNodeFilter","animated","setAnimated","raf","engineStreams","workerStreams","maxCount","renderBar","pct","barColor","labelColor","labelCls","Fragment","QueueCard","expanded","onToggle","onWorkerClick","onResumeThrottle","onQueueThrottle","onResumeQueue","activeDuration","streamCount","health","pending","healthDot","columns","row","_a","_b","RowActionGroup","RowAction","CirclePlay","Gauge","ChevronRight","TaskQueuePill","Inbox","Activity","Clock","Collapsible","DataTable","eventCounter","humanizeEvent","event","topic","guid","collapseEvents","events","items","evt","j","batch","QuorumEventRow","setExpanded","JsonViewer","QuorumGroupRow","group","ConfigPanel","channels","customFilter","onCustomFilterChange","ch","QuorumFeed","bridgeActive","showConfig","setShowConfig","showRaw","setShowRaw","setEvents","setChannels","c","setCustomFilter","channelsRef","useRef","customFilterRef","toggleChannel","useEventSubscription","raw","type","cf","handleClear","Radio","v","Settings","Code","Eraser","item","idx","findActive","candidates","active","Stat","value","warn","title","StandbyRow","engine","source","paused","Server","EngineCluster","onThrottle","isLoading","showStandby","setShowStandby","rest","a","b","ap","bp","pausedCount","counts","Zap","ControlPlaneContent","collapsed","toggleSection","streamStats","queueMap","expandedQueues","toggleQueue","allQueuesExpanded","toggleAllQueues","handleRowClick","handleResumeThrottle","handleQueueThrottle","handleResumeQueue","CollapsibleSection","qWorkers","ControlPlanePage","filters","setFilter","useFilterParams","firstAppId","subscribeMesh","useSubscribeMesh","REFRESH_INTERVAL","rollCallData","rollCallError","refetch","isFetching","useRollCall","useStreamStats","ta","tb","throttledCount","appOptions","ids","id","setExpandedQueues","STORAGE_KEY","setCollapsed","handleBulkThrottle","closeThrottleModal","headerStats","stats","setBridgeActive","handleStartBridge","PageHeaderWithStats","FilterBar","FilterSelect","RefreshCw"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.btn-primary{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(88 53 219 / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.btn-ghost{border-radius:.375rem;padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.row-hover{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s}.row-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.\!input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input-json{width:100%;resize:vertical;border-radius:.375rem;border-width:1px;border-color:#e0daf066;background-color:transparent;padding:.5rem .75rem;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1.625;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-json::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input-json::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input-json:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.select:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.label{margin-bottom:.125rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.hint{margin-top:.25rem;font-size:9px;line-height:1.375;color:#918aabb3}.section-header{margin-bottom:.75rem;display:block;border-bottom-width:1px;border-color:#e0daf04d;padding-bottom:.375rem;font-size:.75rem;line-height:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:#6c47ffcc}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-y-0{top:0;bottom:0}.-left-\[3px\]{left:-3px}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[45\]{z-index:45}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.float-right{float:right}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-10{margin-left:-2.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-mt-6{margin-top:-1.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[3em\]{margin-top:3em}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-8{height:2rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[30vh\]{max-height:30vh}.max-h-\[400px\]{max-height:400px}.max-h-\[40vh\]{max-height:40vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[28px\]{min-height:28px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[360px\]{min-height:360px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.min-h-\[calc\(100vh-9rem\)\]{min-height:calc(100vh - 9rem)}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[14px\]{width:14px}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[22rem\]{width:22rem}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[40vw\]{width:40vw}.w-\[48rem\]{width:48rem}.w-\[7px\]{width:7px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[180px\]{min-width:180px}.min-w-\[20px\]{min-width:20px}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.max-w-0{max-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.max-w-\[60\%\]{max-width:60%}.max-w-\[65\%\]{max-width:65%}.max-w-\[85\%\]{max-width:85%}.max-w-\[90vw\]{max-width:90vw}.max-w-dashboard{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-14{row-gap:3.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(224 218 240 / var(--tw-divide-opacity, 1))}.divide-surface-border\/20>:not([hidden])~:not([hidden]){border-color:#e0daf033}.divide-surface-border\/30>:not([hidden])~:not([hidden]){border-color:#e0daf04d}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-accent{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(232 226 248 / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(200 190 240 / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:#c8bef066}.border-accent\/10{border-color:#6c47ff1a}.border-accent\/20{border-color:#6c47ff33}.border-accent\/30{border-color:#6c47ff4d}.border-accent\/40{border-color:#6c47ff66}.border-amber-600{--tw-border-opacity: 1;border-color:rgb(217 119 6 / var(--tw-border-opacity, 1))}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-emerald-400\/30{border-color:#34d3994d}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-status-draft{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-status-error{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:#dc262633}.border-status-error\/30{border-color:#dc26264d}.border-status-pending\/30{border-color:#f59e0b4d}.border-status-success{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-status-success\/20{border-color:#16a34a33}.border-status-success\/30{border-color:#16a34a4d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#f59e0b33}.border-status-warning\/30{border-color:#f59e0b4d}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-surface-border\/15{border-color:#e0daf026}.border-surface-border\/30{border-color:#e0daf04d}.border-surface-border\/40{border-color:#e0daf066}.border-surface-border\/50{border-color:#e0daf080}.border-surface-border\/60{border-color:#e0daf099}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/70{border-color:#ffffffb3}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-r-surface-border{--tw-border-opacity: 1;border-right-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-r-transparent{border-right-color:transparent}.\!bg-status-error{--tw-bg-opacity: 1 !important;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))!important}.bg-\[\#6C47FF\]{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-\[a-z\]{background-color:a-z}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(232 226 248 / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:#e8e2f880}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:#c8bef033}.bg-accent\/10{background-color:#6c47ff1a}.bg-accent\/15{background-color:#6c47ff26}.bg-accent\/20{background-color:#6c47ff33}.bg-accent\/5{background-color:#6c47ff0d}.bg-accent\/60{background-color:#6c47ff99}.bg-accent\/\[0\.06\]{background-color:#6c47ff0f}.bg-accent\/\[0\.08\]{background-color:#6c47ff14}.bg-amber-300\/\[0\.08\]{background-color:#fcd34d14}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/15{background-color:#fbbf2426}.bg-amber-400\/\[0\.08\]{background-color:#fbbf2414}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-400\/15{background-color:#60a5fa26}.bg-blue-400\/\[0\.08\]{background-color:#60a5fa14}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/60{background-color:#3b82f699}.bg-blue-500\/70{background-color:#3b82f6b3}.bg-cyan-400\/15{background-color:#22d3ee26}.bg-cyan-400\/\[0\.08\]{background-color:#22d3ee14}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-400\/15{background-color:#34d39926}.bg-emerald-400\/\[0\.08\]{background-color:#34d39914}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-fuchsia-400\/\[0\.08\]{background-color:#e879f914}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/\[0\.08\]{background-color:#4ade8014}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-indigo-400\/\[0\.08\]{background-color:#818cf814}.bg-lime-400\/\[0\.08\]{background-color:#a3e63514}.bg-orange-400\/\[0\.08\]{background-color:#fb923c14}.bg-pink-300\/\[0\.08\]{background-color:#f9a8d414}.bg-pink-400\/\[0\.08\]{background-color:#f472b614}.bg-purple-400\/\[0\.08\]{background-color:#c084fc14}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/\[0\.08\]{background-color:#f8717114}.bg-rose-300\/\[0\.08\]{background-color:#fda4af14}.bg-rose-400\/15{background-color:#fb718526}.bg-rose-400\/\[0\.08\]{background-color:#fb718514}.bg-sky-300\/\[0\.08\]{background-color:#7dd3fc14}.bg-sky-400\/\[0\.08\]{background-color:#38bdf814}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-status-draft\/30{background-color:#f973164d}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:#dc26261a}.bg-status-error\/5{background-color:#dc26260d}.bg-status-error\/70{background-color:#dc2626b3}.bg-status-error\/\[0\.04\]{background-color:#dc26260a}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-pending\/10{background-color:#f59e0b1a}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-status-success\/10{background-color:#16a34a1a}.bg-status-success\/20{background-color:#16a34a33}.bg-status-success\/30{background-color:#16a34a4d}.bg-status-success\/5{background-color:#16a34a0d}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#f59e0b1a}.bg-status-warning\/15{background-color:#f59e0b26}.bg-status-warning\/5{background-color:#f59e0b0d}.bg-stone-400\/\[0\.08\]{background-color:#a8a29e14}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(224 218 240 / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:#e0daf099}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:#f7f4ff4d}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:#ffffff80}.bg-surface-raised\/\[0\.03\]{background-color:#ffffff08}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/20{background-color:#f5f5f733}.bg-surface-sunken\/30{background-color:#f5f5f74d}.bg-surface-sunken\/40{background-color:#f5f5f766}.bg-surface-sunken\/50{background-color:#f5f5f780}.bg-surface-sunken\/80{background-color:#f5f5f7cc}.bg-surface-sunken\/90{background-color:#f5f5f7e6}.bg-surface\/90{background-color:#ffffffe6}.bg-surface\/95{background-color:#fffffff2}.bg-teal-300\/\[0\.08\]{background-color:#5eead414}.bg-teal-400\/\[0\.08\]{background-color:#2dd4bf14}.bg-text-primary\/30{background-color:#1e15354d}.bg-text-secondary{--tw-bg-opacity: 1;background-color:rgb(91 81 115 / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(145 138 171 / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:#918aab4d}.bg-transparent{background-color:transparent}.bg-violet-300\/\[0\.08\]{background-color:#c4b5fd14}.bg-violet-400\/15{background-color:#a78bfa26}.bg-violet-400\/\[0\.08\]{background-color:#a78bfa14}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/\[0\.08\]{background-color:#facc1514}.bg-zinc-400\/15{background-color:#a1a1aa26}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-accent\/\[0\.04\]{--tw-gradient-from: rgb(108 71 255 / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(108 71 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.fill-status-active{fill:#2563eb}.fill-status-error{fill:#dc2626}.fill-status-success{fill:#16a34a}.fill-status-warning{fill:#f59e0b}.fill-text-tertiary{fill:#918aab}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.\!py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-60{padding-bottom:15rem}.pl-0{padding-left:0}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.\!text-\[9px\]{font-size:9px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[a-z\]{color:a-z}.text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(200 190 240 / var(--tw-text-opacity, 1))}.text-accent\/40{color:#6c47ff66}.text-accent\/50{color:#6c47ff80}.text-accent\/60{color:#6c47ff99}.text-accent\/70{color:#6c47ffb3}.text-accent\/75{color:#6c47ffbf}.text-accent\/80{color:#6c47ffcc}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-500\/70{color:#3b82f6b3}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-fuchsia-400{--tw-text-opacity: 1;color:rgb(232 121 249 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-pink-300{--tw-text-opacity: 1;color:rgb(249 168 212 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/60{color:#f8717199}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-error\/50{color:#dc262680}.text-status-error\/70{color:#dc2626b3}.text-status-error\/80{color:#dc2626cc}.text-status-pending{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-status-success\/70{color:#16a34ab3}.text-status-success\/80{color:#16a34acc}.text-status-warning{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-stone-400{--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.text-surface-border{--tw-text-opacity: 1;color:rgb(224 218 240 / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:#918aab4d}.text-text-tertiary\/40{color:#918aab66}.text-text-tertiary\/50{color:#918aab80}.text-text-tertiary\/60{color:#918aab99}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:#918aab4d}.accent-accent{accent-color:#6C47FF}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/5{--tw-shadow-color: rgb(0 0 0 / .05);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.ring-accent\/40{--tw-ring-color: rgb(108 71 255 / .4)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-surface{--tw-ring-offset-color: #FFFFFF}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-150{--tw-brightness: brightness(1.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px #6c47ff26}8.3%{box-shadow:0 0 10px 2px #6c47ff66}16.7%,to{box-shadow:0 0 3px #6c47ff26}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgba(255,255,255,.15) 3px,rgba(255,255,255,.15) 6px);background-color:var(--color-status-warning, #f59e0b)}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary\/40::-moz-placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/40::placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/50::-moz-placeholder{color:#918aab80}.placeholder\:text-text-tertiary\/50::placeholder{color:#918aab80}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent\/40:hover{border-color:#6c47ff66}.hover\:border-accent\/50:hover{border-color:#6c47ff80}.hover\:border-text-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.hover\:\!bg-status-error\/90:hover{background-color:#dc2626e6!important}.hover\:bg-accent-hover:hover{--tw-bg-opacity: 1;background-color:rgb(88 53 219 / var(--tw-bg-opacity, 1))}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/10:hover{background-color:#6c47ff1a}.hover\:bg-accent\/20:hover{background-color:#6c47ff33}.hover\:bg-accent\/25:hover{background-color:#6c47ff40}.hover\:bg-accent\/30:hover{background-color:#6c47ff4d}.hover\:bg-accent\/90:hover{background-color:#6c47ffe6}.hover\:bg-accent\/\[0\.04\]:hover{background-color:#6c47ff0a}.hover\:bg-emerald-600\/10:hover{background-color:#0596691a}.hover\:bg-red-600\/10:hover,.hover\:bg-status-error\/10:hover{background-color:#dc26261a}.hover\:bg-status-error\/20:hover{background-color:#dc262633}.hover\:bg-status-error\/80:hover{background-color:#dc2626cc}.hover\:bg-status-error\/90:hover{background-color:#dc2626e6}.hover\:bg-status-success\/10:hover{background-color:#16a34a1a}.hover\:bg-status-success\/20:hover{background-color:#16a34a33}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/30:hover{background-color:#f7f4ff4d}.hover\:bg-surface-hover\/50:hover{background-color:#f7f4ff80}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-raised\/30:hover{background-color:#ffffff4d}.hover\:bg-surface-raised\/60:hover{background-color:#fff9}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:#f5f5f766}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:#6c47ffcc}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-blue-500:hover{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.hover\:text-emerald-300:hover{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-status-error\/80:hover{color:#dc2626cc}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-status-success\/80:hover{color:#16a34acc}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-status-warning\/80:hover{color:#f59e0bcc}.hover\:text-text-primary:hover{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.focus\:border-accent\/50:focus{border-color:#6c47ff80}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(108 71 255 / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/30:focus{--tw-ring-color: rgb(108 71 255 / .3)}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(108 71 255 / .4)}.focus\:ring-accent\/50:focus{--tw-ring-color: rgb(108 71 255 / .5)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group\/srv:hover .group-hover\/srv\:text-accent,.group:hover .group-hover\:text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/key:hover .group-hover\/key\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100,.group\/sched:hover .group-hover\/sched\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/sub:hover .group-hover\/sub\:opacity-100,.group\/task:hover .group-hover\/task\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:w-72{width:18rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.lg\:grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:grid-cols-\[1fr_400px\]{grid-template-columns:1fr 400px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as k,u as R,b as J,j as e,a as o}from"./vendor-query-B2UbickB.js";import{P as O}from"./PageHeader-DlzOOM4Y.js";import{b as g}from"./index-BhhWCADo.js";import{M as A}from"./Modal-DEODGeqx.js";import{R as F,C as w}from"./constants-BHkpVaqx.js";import{al as b,o as M,a4 as D}from"./vendor-icons-DY1ctJgc.js";import"./vendor-react-CX88sFS5.js";function I(){return R({queryKey:["maintenance"],queryFn:()=>g("/config/maintenance")})}function _(){const t=J();return k({mutationFn:r=>g("/config/maintenance",{method:"PUT",body:JSON.stringify(r)}),onSuccess:()=>{t.invalidateQueries({queryKey:["maintenance"]})}})}function q(){return k({mutationFn:t=>g("/dba/prune",{method:"POST",body:JSON.stringify(t)})})}function h({checked:t,onToggle:r,label:n,hint:s,value:l,onChange:c}){return e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("label",{className:"flex items-center gap-2.5 cursor-pointer w-64 shrink-0",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:i=>r(i.target.checked),className:"w-4 h-4 rounded border-border accent-accent shrink-0"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:n}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:s})]})]}),e.jsx("select",{value:l,onChange:i=>c(i.target.value),disabled:!t,className:`select text-xs w-36 transition-opacity ${t?"":"opacity-40 cursor-not-allowed"}`,children:F.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value))})]})}function f({checked:t,onChange:r,label:n,description:s}){return e.jsxs("label",{className:"flex items-start gap-2.5 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:l=>r(l.target.checked),className:"w-4 h-4 mt-0.5 rounded border-border accent-accent shrink-0"}),e.jsxs("div",{children:[e.jsx("span",{className:"text-xs text-text-primary",children:n}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:s})]})]})}function U(){return e.jsxs("div",{className:"flex items-start gap-2 mt-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsx(b,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"}),e.jsx("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Stripping preserves workflow results and timeline data needed for the execution detail view. Transient jobs are internal bookkeeping that accumulates over time."})]})}const j={pruneJobs:!0,expire:"30 days",engineStreams:!0,engineStreamsExpire:"1 day",workerStreams:!0,workerStreamsExpire:"90 days",stripAttributes:!1,pruneTransient:!1};function S(t){return t.pruneJobs||t.engineStreams||t.workerStreams||t.stripAttributes||t.pruneTransient}function C({fields:t,onChange:r}){const n=(s,l)=>r({...t,[s]:l});return e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Delete Expired Data"}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(h,{checked:t.pruneJobs,onToggle:s=>n("pruneJobs",s),label:"Jobs",hint:"Hard-delete completed job rows",value:t.expire,onChange:s=>n("expire",s)}),e.jsx(h,{checked:t.engineStreams,onToggle:s=>n("engineStreams",s),label:"Engine streams",hint:"Internal routing (prune aggressively)",value:t.engineStreamsExpire,onChange:s=>n("engineStreamsExpire",s)}),e.jsx(h,{checked:t.workerStreams,onToggle:s=>n("workerStreams",s),label:"Worker streams",hint:"Activity payloads for execution playback",value:t.workerStreamsExpire,onChange:s=>n("workerStreamsExpire",s)})]})]}),e.jsxs("div",{className:"lg:w-72",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Cleanup"}),e.jsxs("div",{className:"space-y-4",children:[e.jsx(f,{checked:t.stripAttributes,onChange:s=>n("stripAttributes",s),label:"Strip execution artifacts",description:"Remove step-level detail from completed jobs. Return data and export history are preserved."}),e.jsx(f,{checked:t.pruneTransient,onChange:s=>n("pruneTransient",s),label:"Delete transient jobs",description:"Orphaned jobs without an entity type. Usually safe to remove."}),e.jsx(U,{})]})]})]})}function u({label:t,value:r}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-lg font-light text-text-primary",children:r.toLocaleString()}),e.jsx("p",{className:"text-[10px] text-text-tertiary",children:t})]})}function W(){const t=q(),[r,n]=o.useState(j),[s,l]=o.useState(null),[c,i]=o.useState(!1),a=()=>{l(null),t.mutate({expire:r.expire,jobs:r.pruneJobs,engineStreams:r.engineStreams,engineStreamsExpire:r.engineStreamsExpire,workerStreams:r.workerStreams,workerStreamsExpire:r.workerStreamsExpire,attributes:r.stripAttributes,pruneTransient:r.pruneTransient},{onSuccess:x=>{l(x),i(!1)}})};return e.jsxs("div",{className:"space-y-8",children:[e.jsx(C,{fields:r,onChange:n}),e.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] text-text-tertiary",children:S(r)?"This action permanently deletes data and cannot be undone.":"Select at least one operation to enable pruning."}),e.jsx("button",{onClick:()=>i(!0),disabled:!S(r)||t.isPending,className:"bg-status-error text-white px-4 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity disabled:opacity-40 shrink-0",children:t.isPending?"Pruning...":"Prune Now"})]}),s&&e.jsxs("div",{className:"bg-surface-sunken rounded-md px-4 py-3",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Results"}),e.jsxs("div",{className:"flex flex-wrap gap-6",children:[s.jobs!=null&&s.jobs>0&&e.jsx(u,{label:"Jobs deleted",value:s.jobs}),s.engineStreams!=null&&s.engineStreams>0&&e.jsx(u,{label:"Engine streams",value:s.engineStreams}),s.workerStreams!=null&&s.workerStreams>0&&e.jsx(u,{label:"Worker streams",value:s.workerStreams}),s.streams!=null&&s.engineStreams==null&&s.streams>0&&e.jsx(u,{label:"Streams",value:s.streams}),s.attributes!=null&&s.attributes>0&&e.jsx(u,{label:"Artifacts stripped",value:s.attributes}),s.transient!=null&&s.transient>0&&e.jsx(u,{label:"Transient deleted",value:s.transient}),s.marked!=null&&s.marked>0&&e.jsx(u,{label:"Marked pruned",value:s.marked}),Object.values(s).every(x=>!x||x===0)&&e.jsx("p",{className:"text-xs text-text-tertiary",children:"Nothing to prune within the selected retention windows."})]})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsx(A,{open:c,onClose:()=>i(!1),title:"Confirm Prune",children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-text-secondary",children:"This will permanently delete data. This action cannot be undone."}),e.jsxs("ul",{className:"text-xs text-text-secondary space-y-1 list-disc list-inside",children:[r.pruneJobs&&e.jsxs("li",{children:["Delete jobs older than ",r.expire]}),r.engineStreams&&e.jsxs("li",{children:["Delete engine streams older than ",r.engineStreamsExpire]}),r.workerStreams&&e.jsxs("li",{children:["Delete worker streams older than ",r.workerStreamsExpire]}),r.stripAttributes&&e.jsx("li",{children:"Strip execution artifacts from completed jobs"}),r.pruneTransient&&e.jsx("li",{children:"Delete transient (entity-less) jobs"})]}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:()=>i(!1),className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:a,className:"bg-status-error text-white px-3 py-1.5 rounded-md text-xs hover:opacity-90 transition-opacity",disabled:t.isPending,children:t.isPending?"Pruning...":"Confirm Prune"})]})]})})]})}function v(t){var i;if(!((i=t==null?void 0:t.rules)!=null&&i.length))return j;const r=t.rules,n=r.find(a=>a.target==="streams"&&a.action==="delete"),s=r.find(a=>a.target==="jobs"&&a.action==="delete"&&a.hasEntity===!1),l=r.find(a=>a.target==="jobs"&&a.action==="prune"&&a.hasEntity===!0),c=r.find(a=>a.target==="jobs"&&a.action==="delete"&&a.pruned===!0);return{pruneJobs:!!c,expire:(c==null?void 0:c.olderThan)??"180 days",engineStreams:!!n,engineStreamsExpire:(n==null?void 0:n.olderThan)??"1 day",workerStreams:!!n,workerStreamsExpire:(n==null?void 0:n.olderThan)??"90 days",stripAttributes:!!l,pruneTransient:!!s}}function $(t){const r=[];return t.engineStreams&&r.push({target:"streams",action:"delete",olderThan:t.engineStreamsExpire}),t.workerStreams&&t.workerStreamsExpire!==t.engineStreamsExpire&&r.push({target:"streams",action:"delete",olderThan:t.workerStreamsExpire}),t.pruneTransient&&r.push({target:"jobs",action:"delete",olderThan:t.expire,hasEntity:!1}),t.stripAttributes&&r.push({target:"jobs",action:"prune",olderThan:t.expire,hasEntity:!0}),t.pruneJobs&&r.push({target:"jobs",action:"delete",olderThan:t.expire,pruned:!0}),r}function N(t){var r;return((r=w.find(n=>n.value===t))==null?void 0:r.label)??""}function H(){const{data:t,isLoading:r}=I(),n=_(),[s,l]=o.useState(""),[c,i]=o.useState(j),[a,x]=o.useState(""),p=o.useCallback(()=>{t!=null&&t.config&&(l(t.config.schedule),i(v(t.config)),x(JSON.stringify({schedule:t.config.schedule,fields:v(t.config)})))},[t]);o.useEffect(()=>{p()},[p]);const E=JSON.stringify({schedule:s,fields:c}),y=a!==""&&E!==a,m=(t==null?void 0:t.active)??!1,T=()=>{const d=$(c);n.mutate({schedule:s,rules:d},{onSuccess:()=>{x(JSON.stringify({schedule:s,fields:c}))}})},P=()=>{p()};return r?e.jsx("div",{className:"animate-pulse h-40 bg-surface-sunken rounded"}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_auto] gap-10",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Schedule"}),e.jsxs("div",{className:"flex items-end gap-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] text-text-tertiary mb-1",children:"Cron Expression"}),e.jsx("input",{type:"text",value:s,onChange:d=>l(d.target.value),placeholder:"0 2 * * *",className:"input text-xs font-mono w-48"})]}),e.jsx("div",{children:e.jsxs("div",{className:"flex items-center gap-1.5 h-8",children:[e.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${m?"bg-status-success":"bg-text-tertiary"}`}),e.jsx("span",{className:`text-xs ${m?"text-status-success":"text-text-tertiary"}`,children:m?"Active":"Inactive"})]})}),N(s)&&e.jsx("p",{className:"text-xs text-text-tertiary h-8 flex items-center",children:N(s)})]}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-3",children:w.map(d=>e.jsx("button",{type:"button",onClick:()=>l(d.value),className:`px-2.5 py-1 text-[10px] rounded-full transition-colors ${s===d.value?"bg-accent/10 text-accent font-medium":"bg-surface-sunken text-text-tertiary hover:text-text-secondary"}`,children:d.label},d.value))})]}),e.jsxs("div",{className:"lg:w-72",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"How It Works"}),e.jsxs("div",{className:"flex items-start gap-2 px-3 py-2 rounded bg-surface-sunken",children:[e.jsx(b,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0 mt-0.5"}),e.jsx("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Rules execute sequentially on each cron cycle. Engine streams can be pruned aggressively since they only contain internal routing data. Worker streams should be retained longer to preserve execution playback and input enrichment."})]})]})]}),e.jsx(C,{fields:c,onChange:i}),e.jsxs("div",{className:"flex items-center justify-between pt-2 border-t border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[y&&e.jsx("button",{onClick:P,className:"text-[10px] text-text-tertiary hover:text-text-primary transition-colors",children:"Revert changes"}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message})]}),e.jsx("button",{onClick:T,disabled:!y||!s.trim()||n.isPending,className:"btn-primary text-xs disabled:opacity-40 shrink-0",children:n.isPending?"Saving...":"Save Schedule"})]})]})}function L({mode:t,onChange:r}){const n=(s,l,c)=>e.jsxs("button",{onClick:()=>r(s),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${t===s?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[l,c]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[n("prune",e.jsx(M,{className:"w-3.5 h-3.5"}),"Prune Now"),n("schedule",e.jsx(D,{className:"w-3.5 h-3.5"}),"Schedule")]})}function Y(){const[t,r]=o.useState("schedule");return e.jsxs("div",{children:[e.jsx(O,{title:"DB Maintenance",docsHash:"#docs:dashboard.md:db-maintenance",actions:e.jsx(L,{mode:t,onChange:r})}),e.jsxs("div",{className:"flex items-start gap-2 px-4 py-3 mb-8 rounded-md bg-accent/5 border border-accent/10",children:[e.jsx(b,{className:"w-4 h-4 text-accent shrink-0 mt-0.5"}),e.jsx("p",{className:"text-xs text-text-secondary leading-relaxed",children:"Completed process data grows indefinitely. Schedule regular pruning to keep the database lean and queries fast. Worker streams are retained longer than engine streams to preserve execution playback."})]}),t==="prune"?e.jsx(W,{}):e.jsx(H,{})]})}export{Y as MaintenancePage};
|
|
2
|
-
//# sourceMappingURL=index-D-q2lzup.js.map
|