@hotmeshio/long-tail 0.10.3 → 0.10.4
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/index.js +7 -1
- package/build/modules/branding.d.ts +21 -2
- package/build/modules/branding.js +22 -1
- package/build/routes/settings.js +21 -0
- package/build/shared/form-validation/derive-field-label.d.ts +14 -0
- package/build/shared/form-validation/derive-field-label.js +31 -0
- package/build/shared/form-validation/index.d.ts +1 -0
- package/build/shared/form-validation/index.js +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/startup.d.ts +26 -0
- package/dashboard/dist/assets/{AdminDashboard-DQLGybZ9.js → AdminDashboard-Cma2NGsF.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-DQLGybZ9.js.map → AdminDashboard-Cma2NGsF.js.map} +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +16 -0
- package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js.map +1 -0
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +4 -0
- package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +1 -0
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +2 -0
- package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +1 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +1 -0
- package/dashboard/dist/assets/BotPicker-CidlGr6f.js +2 -0
- package/dashboard/dist/assets/BotPicker-CidlGr6f.js.map +1 -0
- package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-CJ5ldY8w.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BXOpfs3z.js → CollapsibleSection-W9F9lziT.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BXOpfs3z.js.map → CollapsibleSection-W9F9lziT.js.map} +1 -1
- package/dashboard/dist/assets/ConfirmDeleteModal-BUh-Dzba.js +2 -0
- package/dashboard/dist/assets/{ConfirmDeleteModal-C0x0HcHX.js.map → ConfirmDeleteModal-BUh-Dzba.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-uot2mE_g.js → CopyableId-B1mxKfVb.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-uot2mE_g.js.map → CopyableId-B1mxKfVb.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-lkv_7msa.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-D20FNwS-.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-vZ2psNnd.js → CredentialsPage-DyOgfnPB.js} +2 -2
- package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
- package/dashboard/dist/assets/{CronLabel-KRkqNSYs.js → CronLabel-geum95dj.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-KRkqNSYs.js.map → CronLabel-geum95dj.js.map} +1 -1
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +2 -0
- package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +1 -0
- package/dashboard/dist/assets/DataTable-BTu2AaEl.js +2 -0
- package/dashboard/dist/assets/DataTable-BTu2AaEl.js.map +1 -0
- package/dashboard/dist/assets/{DropZone-C3NdMtwK.js → DropZone-C3hOjJtC.js} +2 -2
- package/dashboard/dist/assets/{DropZone-C3NdMtwK.js.map → DropZone-C3hOjJtC.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-DNH-XHOS.js → ElapsedCell-DFOW9T4b.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-DNH-XHOS.js.map → ElapsedCell-DFOW9T4b.js.map} +1 -1
- package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js +20 -0
- package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js.map +1 -0
- package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js +9 -0
- package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js.map +1 -0
- package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js +2 -0
- package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js.map +1 -0
- package/dashboard/dist/assets/EventTable-DJWJ7J0m.js +2 -0
- package/dashboard/dist/assets/EventTable-DJWJ7J0m.js.map +1 -0
- package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js +2 -0
- package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js.map +1 -0
- package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js +2 -0
- package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js.map +1 -0
- package/dashboard/dist/assets/HomePage-D8RVntg0.js +2 -0
- package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js +2 -0
- package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js.map +1 -0
- package/dashboard/dist/assets/McpOverview-NXKsGiWU.js +2 -0
- package/dashboard/dist/assets/McpOverview-NXKsGiWU.js.map +1 -0
- package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js +5 -0
- package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js.map +1 -0
- package/dashboard/dist/assets/{McpQueryPage-C9C4mPC0.js → McpQueryPage-BPJmFYOY.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-C9C4mPC0.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CWHKhx8n.js → McpRunDetailPage-B49nUXEl.js} +2 -2
- package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js.map +1 -0
- package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js +2 -0
- package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js.map +1 -0
- package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js +2 -0
- package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js.map +1 -0
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +2 -0
- package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-DpXjhs-3.js +2 -0
- package/dashboard/dist/assets/{OperatorDashboard-CK-4GREp.js.map → OperatorDashboard-DpXjhs-3.js.map} +1 -1
- package/dashboard/dist/assets/PageHeader-DvEmMMP6.js +2 -0
- package/dashboard/dist/assets/PageHeader-DvEmMMP6.js.map +1 -0
- package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js +2 -0
- package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js.map +1 -0
- package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js → PriorityBadge-CCERr9vQ.js} +2 -2
- package/dashboard/dist/assets/PriorityBadge-CCERr9vQ.js.map +1 -0
- package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js +2 -0
- package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js.map +1 -0
- package/dashboard/dist/assets/{ProcessesListPage-m70xmTZx.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-m70xmTZx.js.map → ProcessesListPage-CQ9tSw7U.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js.map +1 -0
- package/dashboard/dist/assets/RolePill-CWhoLwef.js +2 -0
- package/dashboard/dist/assets/RolePill-CWhoLwef.js.map +1 -0
- package/dashboard/dist/assets/RolesPage-D-6kIact.js +2 -0
- package/dashboard/dist/assets/RolesPage-D-6kIact.js.map +1 -0
- package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js +2 -0
- package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js.map +1 -0
- package/dashboard/dist/assets/StatCard-DBANWIss.js +2 -0
- package/dashboard/dist/assets/StatCard-DBANWIss.js.map +1 -0
- package/dashboard/dist/assets/StatusBadge-BbqghFMi.js +2 -0
- package/dashboard/dist/assets/StatusBadge-BbqghFMi.js.map +1 -0
- package/dashboard/dist/assets/{StickyPagination-BHF5fTt5.js → StickyPagination-BTGfmGV3.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-BHF5fTt5.js.map → StickyPagination-BTGfmGV3.js.map} +1 -1
- package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js +2 -0
- package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js.map +1 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js +2 -0
- package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js.map +1 -0
- package/dashboard/dist/assets/TagInput-CoR4MzsW.js +2 -0
- package/dashboard/dist/assets/TagInput-CoR4MzsW.js.map +1 -0
- package/dashboard/dist/assets/{TaskDetailPage-f5K9dVPG.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-f5K9dVPG.js.map → TaskDetailPage-BRg-w2Ev.js.map} +1 -1
- package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js +2 -0
- package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js.map +1 -0
- package/dashboard/dist/assets/{TasksListPage-BPyPG6UY.js → TasksListPage-kB_j9G8o.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-BPyPG6UY.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CBaGbueK.js → TimeAgo-D7dSIY7-.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CBaGbueK.js.map → TimeAgo-D7dSIY7-.js.map} +1 -1
- package/dashboard/dist/assets/TimestampCell-BZe6bx18.js +2 -0
- package/dashboard/dist/assets/TimestampCell-BZe6bx18.js.map +1 -0
- package/dashboard/dist/assets/ToolPill-xX-buQtY.js +2 -0
- package/dashboard/dist/assets/ToolPill-xX-buQtY.js.map +1 -0
- package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js +2 -0
- package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js.map +1 -0
- package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js +9 -0
- package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js.map +1 -0
- package/dashboard/dist/assets/TopicsPage-Cy3chaca.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-Dyq6niOv.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DOX2P-8M.js → UserName-VXM1oHMC.js} +2 -2
- package/dashboard/dist/assets/{UserName-DOX2P-8M.js.map → UserName-VXM1oHMC.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js +2 -0
- package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js.map +1 -0
- package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js +2 -0
- package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js.map +1 -0
- package/dashboard/dist/assets/{WorkflowsDashboard-DJpMO5IY.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-DJpMO5IY.js.map → WorkflowsDashboard-BbM69MnB.js.map} +1 -1
- package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js +2 -0
- package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js.map +1 -0
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3ntUyoZ.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-C3ntUyoZ.js.map → YamlWorkflowDetailPage-CDDVMYWi.js.map} +1 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js +2 -0
- package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js.map +1 -0
- package/dashboard/dist/assets/{agents-gs9fea8r.js → agents-BwiSNu73.js} +2 -2
- package/dashboard/dist/assets/{agents-gs9fea8r.js.map → agents-BwiSNu73.js.map} +1 -1
- package/dashboard/dist/assets/{bots-DYxAHrob.js → bots-ClgSrxel.js} +2 -2
- package/dashboard/dist/assets/{bots-DYxAHrob.js.map → bots-ClgSrxel.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-BJoxz6DJ.js → capabilities-JUaKsby4.js} +2 -2
- package/dashboard/dist/assets/{capabilities-BJoxz6DJ.js.map → capabilities-JUaKsby4.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-BeDZgDDf.js → controlplane-CuTQ7eUE.js} +2 -2
- package/dashboard/dist/assets/{controlplane-BeDZgDDf.js.map → controlplane-CuTQ7eUE.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +2 -0
- package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +1 -0
- package/dashboard/dist/assets/index-BBA4AxmL.js +2 -0
- package/dashboard/dist/assets/index-BBA4AxmL.js.map +1 -0
- package/dashboard/dist/assets/index-C-8xXyvr.js +63 -0
- package/dashboard/dist/assets/index-C-8xXyvr.js.map +1 -0
- package/dashboard/dist/assets/index-C1t0YIXC.js +5 -0
- package/dashboard/dist/assets/index-C1t0YIXC.js.map +1 -0
- package/dashboard/dist/assets/index-C9o2UNhC.js +2 -0
- package/dashboard/dist/assets/index-C9o2UNhC.js.map +1 -0
- package/dashboard/dist/assets/index-CBj-vstO.js +2 -0
- package/dashboard/dist/assets/{index-DZ7PWRg1.js.map → index-CBj-vstO.js.map} +1 -1
- package/dashboard/dist/assets/index-CUguKMXZ.js +2 -0
- package/dashboard/dist/assets/index-CUguKMXZ.js.map +1 -0
- package/dashboard/dist/assets/index-Cavwd8UU.js +6 -0
- package/dashboard/dist/assets/index-Cavwd8UU.js.map +1 -0
- package/dashboard/dist/assets/index-CnsPBTXL.js +2 -0
- package/dashboard/dist/assets/index-CnsPBTXL.js.map +1 -0
- package/dashboard/dist/assets/index-CoPWHo_H.js +2 -0
- package/dashboard/dist/assets/index-CoPWHo_H.js.map +1 -0
- package/dashboard/dist/assets/index-CwQVaa7x.js +2 -0
- package/dashboard/dist/assets/index-CwQVaa7x.js.map +1 -0
- package/dashboard/dist/assets/index-DSa-6Ux8.js +2 -0
- package/dashboard/dist/assets/index-DSa-6Ux8.js.map +1 -0
- package/dashboard/dist/assets/index-DeMs_aBT.css +1 -0
- package/dashboard/dist/assets/index-Ikj_NTuy.js +5 -0
- package/dashboard/dist/assets/index-Ikj_NTuy.js.map +1 -0
- package/dashboard/dist/assets/index-Xd1jcHe7.js +2 -0
- package/dashboard/dist/assets/index-Xd1jcHe7.js.map +1 -0
- package/dashboard/dist/assets/{knowledge-DZnI1Fdk.js → knowledge-BHBt-6kW.js} +2 -2
- package/dashboard/dist/assets/{knowledge-DZnI1Fdk.js.map → knowledge-BHBt-6kW.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-BB_m6UyI.js → mcp-CBcz4BCS.js} +2 -2
- package/dashboard/dist/assets/{mcp-BB_m6UyI.js.map → mcp-CBcz4BCS.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-BTSWn0de.js → mcp-query-C4fKTOYo.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-BTSWn0de.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-CvGQLyUz.js → pipelines-CmAAH3B6.js} +2 -2
- package/dashboard/dist/assets/{pipelines-CvGQLyUz.js.map → pipelines-CmAAH3B6.js.map} +1 -1
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js +2 -0
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +1 -0
- package/dashboard/dist/assets/{tasks-BbgOhCVm.js → tasks-BAEsqcz2.js} +2 -2
- package/dashboard/dist/assets/{tasks-BbgOhCVm.js.map → tasks-BAEsqcz2.js.map} +1 -1
- package/dashboard/dist/assets/{topics-D9usuYHv.js → topics-CY0pJ6_o.js} +2 -2
- package/dashboard/dist/assets/{topics-D9usuYHv.js.map → topics-CY0pJ6_o.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DxnqYVPg.js → useEventHooks-BlpwRvHO.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DxnqYVPg.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CBAn0o5z.js → useNamespace-CoNUlZ6Z.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CBAn0o5z.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-blOlKGDO.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-blOlKGDO.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
- package/dashboard/dist/assets/{users-CYVJHgNM.js → users-uGtDRGxR.js} +2 -2
- package/dashboard/dist/assets/{users-CYVJHgNM.js.map → users-uGtDRGxR.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-B98-XxNc.js → vendor-icons-DKCAtTJ9.js} +135 -130
- package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
- package/dashboard/dist/assets/{workflows-csQAJF0G.js → workflows-DoX-AtHN.js} +2 -2
- package/dashboard/dist/assets/{workflows-csQAJF0G.js.map → workflows-DoX-AtHN.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-CctsTDby.js → yaml-workflows-DM3jVem2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-CctsTDby.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/design-principles.md +234 -0
- package/docs/hitl/design.md +228 -0
- package/docs/hitl/form.md +21 -1
- package/docs/hitl/iframe.md +1 -1
- package/docs/hitl/x-lt-display.md +56 -0
- package/docs/hitl/x-lt-layout.md +20 -1
- package/docs/hitl/x-lt-widget.md +23 -0
- package/docs/hitl-guide.md +1 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-4JgMpuYJ.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-4JgMpuYJ.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-DCgKokgX.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-DCgKokgX.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-BK_8VKZO.js +0 -2
- package/dashboard/dist/assets/AgentsPage-BK_8VKZO.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-Dp1rsIHC.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-Dp1rsIHC.js.map +0 -1
- package/dashboard/dist/assets/BotPicker-DvUnYEJk.js +0 -2
- package/dashboard/dist/assets/BotPicker-DvUnYEJk.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-CJ5ldY8w.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-D20FNwS-.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-vZ2psNnd.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-C-vGsrFl.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-C-vGsrFl.js.map +0 -1
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js +0 -2
- package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +0 -1
- package/dashboard/dist/assets/EscalationListSchemaPage-BIW1qxjC.js +0 -20
- package/dashboard/dist/assets/EscalationListSchemaPage-BIW1qxjC.js.map +0 -1
- package/dashboard/dist/assets/EscalationSchemaPage-Fj2IwQXQ.js +0 -9
- package/dashboard/dist/assets/EscalationSchemaPage-Fj2IwQXQ.js.map +0 -1
- package/dashboard/dist/assets/EscalationsOverview-BVUx0vZH.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-BVUx0vZH.js.map +0 -1
- package/dashboard/dist/assets/EventTable-Dm4zZaRl.js +0 -2
- package/dashboard/dist/assets/EventTable-Dm4zZaRl.js.map +0 -1
- package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js +0 -2
- package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js.map +0 -1
- package/dashboard/dist/assets/GraphInvokePage-D4f074qh.js +0 -2
- package/dashboard/dist/assets/GraphInvokePage-D4f074qh.js.map +0 -1
- package/dashboard/dist/assets/HomePage-DQ0bb_M_.js +0 -2
- package/dashboard/dist/assets/HomePage-DQ0bb_M_.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-CItVkLQ-.js +0 -2
- package/dashboard/dist/assets/ListToolbar-CItVkLQ-.js.map +0 -1
- package/dashboard/dist/assets/McpOverview-ByYVDldF.js +0 -2
- package/dashboard/dist/assets/McpOverview-ByYVDldF.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-DYuIdJiH.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-DYuIdJiH.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-CWHKhx8n.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-DMamEjjr.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-DMamEjjr.js.map +0 -1
- package/dashboard/dist/assets/NamespacePill-B3YOa1xo.js +0 -2
- package/dashboard/dist/assets/NamespacePill-B3YOa1xo.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-CVPDugQz.js +0 -2
- package/dashboard/dist/assets/OperationsPage-CVPDugQz.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-CK-4GREp.js +0 -2
- package/dashboard/dist/assets/PageHeader-poyTWcUA.js +0 -2
- package/dashboard/dist/assets/PageHeader-poyTWcUA.js.map +0 -1
- package/dashboard/dist/assets/PageHeaderWithStats-CAmspbl9.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-CAmspbl9.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-BBCwv1bQ.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-BBCwv1bQ.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-l865Cx3n.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-l865Cx3n.js.map +0 -1
- package/dashboard/dist/assets/RolePill-C0SWz9X7.js +0 -2
- package/dashboard/dist/assets/RolePill-C0SWz9X7.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-Wzfjz7Wc.js +0 -2
- package/dashboard/dist/assets/RolesPage-Wzfjz7Wc.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-DlnIolTf.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-DlnIolTf.js.map +0 -1
- package/dashboard/dist/assets/SlidePanel-Bm9B6zIA.js +0 -2
- package/dashboard/dist/assets/SlidePanel-Bm9B6zIA.js.map +0 -1
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js +0 -2
- package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +0 -1
- package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js +0 -2
- package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +0 -1
- package/dashboard/dist/assets/StreamMessageDetail-Dgp1lzay.js +0 -2
- package/dashboard/dist/assets/StreamMessageDetail-Dgp1lzay.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-BlptZ8lr.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-BlptZ8lr.js.map +0 -1
- package/dashboard/dist/assets/TagInput-CM3AV5Ky.js +0 -2
- package/dashboard/dist/assets/TagInput-CM3AV5Ky.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-BZYmqdcv.js +0 -2
- package/dashboard/dist/assets/TaskQueuePill-BZYmqdcv.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-Z5kDrR9U.js +0 -2
- package/dashboard/dist/assets/TimestampCell-Z5kDrR9U.js.map +0 -1
- package/dashboard/dist/assets/ToolPill-D_-m3lUO.js +0 -2
- package/dashboard/dist/assets/ToolPill-D_-m3lUO.js.map +0 -1
- package/dashboard/dist/assets/ToolTestPanel-DFrP_aMx.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-DFrP_aMx.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-Cj9qXnTW.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-Cj9qXnTW.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-Dyq6niOv.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-Cb_dSIoq.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-Cb_dSIoq.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-CyYYPB7b.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-CyYYPB7b.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-CCC_KaXz.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-CCC_KaXz.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-ju-9JDXg.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-ju-9JDXg.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-CZ4fl0IE.js +0 -2
- package/dashboard/dist/assets/escalation-columns-CZ4fl0IE.js.map +0 -1
- package/dashboard/dist/assets/index-BMM3Xug7.js +0 -2
- package/dashboard/dist/assets/index-BMM3Xug7.js.map +0 -1
- package/dashboard/dist/assets/index-BMXkxgnK.js +0 -2
- package/dashboard/dist/assets/index-BMXkxgnK.js.map +0 -1
- package/dashboard/dist/assets/index-Bj1Mjjiv.js +0 -2
- package/dashboard/dist/assets/index-Bj1Mjjiv.js.map +0 -1
- package/dashboard/dist/assets/index-BqVb13tE.js +0 -5
- package/dashboard/dist/assets/index-BqVb13tE.js.map +0 -1
- package/dashboard/dist/assets/index-CGrtjUdj.js +0 -6
- package/dashboard/dist/assets/index-CGrtjUdj.js.map +0 -1
- package/dashboard/dist/assets/index-CQ8cd4JZ.js +0 -2
- package/dashboard/dist/assets/index-CQ8cd4JZ.js.map +0 -1
- package/dashboard/dist/assets/index-CruL35yU.js +0 -2
- package/dashboard/dist/assets/index-CruL35yU.js.map +0 -1
- package/dashboard/dist/assets/index-DAM1Dm1F.js +0 -2
- package/dashboard/dist/assets/index-DAM1Dm1F.js.map +0 -1
- package/dashboard/dist/assets/index-DZ7PWRg1.js +0 -2
- package/dashboard/dist/assets/index-DfbrPOP3.js +0 -2
- package/dashboard/dist/assets/index-DfbrPOP3.js.map +0 -1
- package/dashboard/dist/assets/index-DwuM7Fka.js +0 -5
- package/dashboard/dist/assets/index-DwuM7Fka.js.map +0 -1
- package/dashboard/dist/assets/index-DycfrrTK.js +0 -63
- package/dashboard/dist/assets/index-DycfrrTK.js.map +0 -1
- package/dashboard/dist/assets/index-tbvwCdvQ.js +0 -2
- package/dashboard/dist/assets/index-tbvwCdvQ.js.map +0 -1
- package/dashboard/dist/assets/index-zP2ncT4m.css +0 -1
- package/dashboard/dist/assets/vendor-icons-B98-XxNc.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as i,j as e}from"./vendor-query-B2UbickB.js";import{P as ye}from"./PageHeaderWithStats-CAmspbl9.js";import{F as we,b as ke}from"./FilterBar-B5Vk5tBF.js";import{u as Ne}from"./useFilterParams-x-Dg0Vgz.js";import{u as ve}from"./useNamespace-CBAn0o5z.js";import{a as ee,u as Ce,b as $e,c as Se,d as _e}from"./controlplane-BeDZgDDf.js";import{M as Te}from"./Modal-D4afnAjc.js";import{_ as K,aP as U,f as Ee,aQ as Z,aR as J,t as te,I as Re,ag as Me,aj as Pe,R as Ae,J as Le,aS as We,q as Qe,Z as Fe,aM as Oe}from"./vendor-icons-B98-XxNc.js";import{C as I}from"./CollapsibleSection-BXOpfs3z.js";import{T as Be}from"./TaskQueuePill-BZYmqdcv.js";import{D as ze}from"./DataTable-Byn3oyT9.js";import{C as W,c as Ie,J as Je}from"./index-DycfrrTK.js";import{R as De,a as Y}from"./RowActions-BA9L9djf.js";import{f as Ue}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";const Ve=[{label:"15m",value:"15m"},{label:"30m",value:"30m"},{label:"1h",value:"1h"},{label:"1d",value:"1d"},{label:"7d",value:"7d"}],se={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"},qe={pong:"roll call",ping:"ping",throttle:"throttle",job:"job",work:"work",activate:"activate",cron:"cron",user:"user"},He=250;function M(t){return!!t.worker_topic}function P(t){return typeof t.throttle=="number"&&t.throttle!==0}function V(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 Ge(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[,a,n,o,u,l,m,d]=s;return new Date(`${a}-${n}-${o}T${u}:${l}:${m}.${d}Z`)}const r=new Date(t);return isNaN(r.getTime())?null:r}function Ke(t){const s=Ge(t);if(!s)return"--";const r=Date.now()-s.getTime();if(r<0||isNaN(r))return"--";const a=Math.floor(r/1e3);if(a<60)return`${a}s`;const n=Math.floor(a/60);if(n<60)return`${n}m`;const o=Math.floor(n/60);return o<24?`${o}h ${n%60}m`:`${Math.floor(o/24)}d ${o%24}h`}function ne(t){return t.replace(/^hmsh:[^:]+:x:/,"")||"(engine)"}function F(t){const s=t.match(/^([^:]+)::(.+?)-[A-Za-z0-9_]{10,}$/);return s?s[2]:t.length>20?t.slice(0,20)+"...":t}function Ze(t){const s=t.match(/^([^:]+)::/);return(s==null?void 0:s[1])||""}const ae=[{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 B(t){return`${t.engine_id}-${t.worker_topic||"engine"}`}function Ye(t){const s=new Map;for(const r of t){if(!r.worker_topic)continue;const a=r.worker_topic;s.has(a)||s.set(a,[]),s.get(a).push(r)}return s}function T(t){let s=0,r=0,a=0;for(const n of t)if(n.counts)for(const[o,u]of Object.entries(n.counts))s+=u,o==="200"?r+=u:o==="500"&&(a+=u);return{total:s,success:r,errors:a}}function Xe(t){let s=0;for(const r of t)typeof r.stream_depth=="number"&&(s+=r.stream_depth);return s}function et(t){if(t.length===0)return"healthy";if(t.every(a=>a.throttle===-1))return"paused";const{errors:r}=T(t);return r>0||t.some(P)?"degraded":"healthy"}function tt({activeAppId:t,allProfiles:s,profiles:r}){const a=ee(),[n,o]=i.useState(new Set),[u,l]=i.useState(!1),[m,d]=i.useState([]);i.useEffect(()=>{o(new Set)},[t]);const k=i.useCallback(p=>{o(C=>{const f=new Set(C),$=B(p);return f.has($)?f.delete($):f.add($),f})},[]),b=i.useCallback(()=>{n.size===r.length?o(new Set):o(new Set(r.map(B)))},[r,n.size]),j=i.useMemo(()=>{const p=r.filter(N=>n.has(B(N)));if(p.length===0)return[];if(p.length===s.length)return[{label:"Entire Mesh"}];const C=p.filter(N=>!M(N)),f=p.filter(M),$=[];for(const N of C)$.push({label:`Engine ${N.engine_id}`,guid:N.engine_id,scope:"engines"});const A=new Map;for(const N of f){const R=N.worker_topic;A.has(R)||A.set(R,[]),A.get(R).push(N)}for(const[N,R]of A){const O=s.filter(L=>L.worker_topic===N);if(R.length===O.length)$.push({label:N,topic:N});else for(const L of R)$.push({label:`${N} ${L.engine_id}`,guid:L.engine_id})}return $},[r,s,n]);return{selectedIds:n,setSelectedIds:o,toggleCheckbox:k,toggleAll:b,throttleModalOpen:u,throttleTargets:m,selectedThrottleTargets:j,throttleMutation:a,handleBulkThrottle:p=>{const C=m.length>0?m:j;for(const f of C)a.mutate({appId:t,throttle:p,...f.topic?{topic:f.topic}:{},...f.guid?{guid:f.guid}:{},...f.scope?{scope:f.scope}:{}});l(!1),d([])},handleRowClick:(p,C)=>{const f=M(p)?`${p.worker_topic} ${p.engine_id}`:`Engine ${p.engine_id}`;d([{label:f,guid:p.engine_id,scope:C||(M(p)?"workers":"engines")}]),l(!0)},handleBulkThrottleOpen:()=>{d(j),l(!0)},handleResumeThrottle:(p,C)=>{const f=C||(M(p)?"workers":"engines");a.mutate({appId:t,throttle:0,guid:p.engine_id,scope:f})},handleResumeQueue:p=>{a.mutate({appId:t,throttle:0,topic:p})},handleQueueThrottle:p=>{d([{label:p,topic:p}]),l(!0)},closeThrottleModal:()=>{l(!1),d([])}}}const st=[{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 nt({target:t}){const s=t.label==="Entire Mesh",r=t.label==="All Engines"||t.label.startsWith("Engine "),a=s?"bg-status-error/10 text-status-error":r?"bg-status-active/10 text-status-active":"bg-accent/[0.06] text-text-secondary",n=t.scope==="engines"?"engine only":t.scope==="workers"?"worker only":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 ${a}`,children:[t.label,e.jsx("span",{className:"text-[8px] opacity-50",children:n})]})}function at({open:t,onClose:s,targets:r,onApply:a,isPending:n}){const[o,u]=i.useState("");return e.jsx(Te,{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((l,m)=>e.jsx(nt,{target:l},l.guid||l.topic||m))})]}),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:st.map(l=>e.jsx("button",{onClick:()=>a(l.ms),disabled:n,className:`px-3 py-1.5 text-xs rounded transition-colors ${l.ms===-1?"bg-status-error/10 text-status-error hover:bg-status-error/20":l.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:l.label},l.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:o,onChange:l=>u(l.target.value),placeholder:"e.g. 2.5",className:"input text-xs py-1.5 px-3 w-28"}),e.jsx("button",{onClick:()=>{const l=parseFloat(o);isNaN(l)||l<0||a(Math.round(l*1e3))},disabled:n,className:"btn-primary text-xs py-1.5 px-4 disabled:opacity-50",children:"Apply"})]})]})]})})}function rt(){const{data:t}=Ce(),s=ee(),[r,a]=i.useState(null),[n,o]=i.useState(!1),u=(t==null?void 0:t.apps)??[],l=i.useCallback(async(d,k="all")=>{if(u.length===0)return;o(!0);const b=await Promise.allSettled(u.map(v=>s.mutateAsync({appId:v.appId,throttle:d,...k!=="all"?{scope:k}:{}}))),j=b.filter(v=>v.status==="rejected").length;j>0&&console.error(`Emergency throttle: ${j}/${b.length} apps failed`),o(!1),a(null)},[u,s]),m=d=>d==="engines"?"engines":d==="workers"?"workers":"everything";return r?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-xs text-status-error",children:["Pause ",m(r.scope),"?"]}),e.jsx("button",{onClick:()=>l(r.ms,r.scope),disabled: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",children:n?e.jsx(K,{className:"w-3.5 h-3.5 animate-spin"}):"Confirm"}),e.jsx("button",{onClick:()=>a(null),disabled:n,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:()=>a({ms:-1,scope:"all"}),disabled: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",title:"Pause all engines and workers",children:[e.jsx(U,{className:"w-3.5 h-3.5"}),"Pause All"]}),e.jsxs("button",{onClick:()=>l(0),disabled: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",title:"Resume all engines and workers",children:[n?e.jsx(K,{className:"w-3.5 h-3.5 animate-spin"}):e.jsx(Ee,{className:"w-3.5 h-3.5"}),"Resume All"]})]})}function ot({byStream:t,onNodeFilter:s}){const[r,a]=i.useState(!1);if(i.useEffect(()=>{a(!1);const d=requestAnimationFrame(()=>a(!0));return()=>cancelAnimationFrame(d)},[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 n=t.filter(d=>d.stream_type==="engine"),o=t.filter(d=>d.stream_type==="worker"),u=Math.max(...t.map(d=>d.count)),l=d=>{const k=u>0?d.count/u*100:0,b=d.stream_type==="engine",j=b?"(all engines)":ne(d.stream_name),v=b?"bg-status-active/70":"bg-accent/60",y=b?"text-status-active":"text-text-tertiary";return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:`text-[9px] font-mono ${y} w-36 truncate text-right shrink-0`,title:d.stream_name,children:j}),e.jsx("div",{className:"flex-1 h-4 bg-surface-sunken rounded overflow-hidden",children:e.jsx("div",{className:`h-full ${v} rounded transition-all duration-500 ease-out`,style:{width:r?`${k}%`:"0%"}})}),e.jsx("span",{className:"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0",children:d.count.toLocaleString()})]},`${d.stream_type}-${d.stream_name}`)},m="text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline";return e.jsxs("div",{className:"space-y-1.5",children:[n.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${m} text-status-active/70 hover:text-status-active`,onClick:()=>s==null?void 0:s("engines"),children:"Engine Stream"}),n.map(l),o.length>0&&e.jsx("div",{className:"h-2"})]}),o.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:`${m} text-accent/70 hover:text-accent`,onClick:()=>s==null?void 0:s("workers"),children:"Worker Streams"}),o.map(l)]})]})}function lt({queue:t,workers:s,expanded:r,onToggle:a,onWorkerClick:n,onResumeThrottle:o,onQueueThrottle:u,onResumeQueue:l,byStream:m,activeDuration:d}){const k=i.useMemo(()=>{const c=m.find(g=>g.stream_type==="worker"&&ne(g.stream_name)===t);return(c==null?void 0:c.count)??0},[m,t]),b=i.useMemo(()=>et(s),[s]),j=i.useMemo(()=>Xe(s),[s]),{errors:v}=i.useMemo(()=>T(s),[s]),y=b==="paused"?"bg-status-error":b==="degraded"?"bg-status-warning":"bg-status-success",x=i.useMemo(()=>[...s].sort((c,g)=>T([g]).total-T([c]).total),[s]),w=i.useMemo(()=>[{key:"engine_id",label:"Router",render:c=>{var p;const g=c.engine_id.replace(/^[^:]+::/,"").replace(/-[A-Za-z0-9_]{10,}$/,"")||c.engine_id,E=((p=c.engine_id.match(/^([^:]+)::/))==null?void 0:p[1])||"";return e.jsxs("div",{className:"flex items-center gap-2",title:c.engine_id,children:[e.jsx("span",{className:"text-xs text-text-secondary truncate max-w-[180px]",children:g}),E&&e.jsx("span",{className:"text-[9px] text-text-tertiary/50",children:E})]})}},{key:"processed",label:"Processed",render:c=>{const g=T([c]);return e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-tertiary",children:g.total>0?g.total.toLocaleString():"--"})},className:"w-24"},{key:"throttle",label:"Throttle",render:c=>{const g=c.throttle;return g===-1?e.jsx("span",{className:"text-xs text-status-error font-medium",children:"Paused"}):g&&g>0?e.jsx("span",{className:"text-xs text-status-warning font-medium",children:V(g)}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"0"})},className:"w-24"},{key:"actions",label:"",render:c=>e.jsxs(De,{children:[P(c)&&e.jsx(Y,{icon:Z,title:"Resume (remove throttle)",onClick:()=>o(c),colorClass:"text-text-tertiary hover:text-status-success"}),e.jsx(Y,{icon:J,title:"Adjust throttle",onClick:()=>n(c)})]}),className:"w-16"}],[n,o]);return e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>a(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 dot-ring shrink-0 ${y}`,title:b}),e.jsx(te,{className:`w-3.5 h-3.5 text-text-tertiary/50 transition-transform duration-200 ${r?"rotate-90":""}`,strokeWidth:2}),e.jsx(Be,{queue:t,size:"sm"}),e.jsx("span",{className:"flex-1"}),v>0&&e.jsxs("span",{className:"text-[10px] text-status-error font-medium mr-2",children:[v," errors"]}),j>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:j.toLocaleString()})]}),e.jsxs("span",{className:`flex items-center gap-1 text-xs w-24 ${s.some(P)?"text-status-warning":"text-text-tertiary"}`,children:[e.jsx(Me,{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:k>0?e.jsxs(e.Fragment,{children:[e.jsx(Pe,{className:"w-3 h-3 shrink-0",strokeWidth:1.5}),k.toLocaleString()," in ",d]}):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(P)&&e.jsx(Z,{className:"w-4 h-4 text-text-tertiary hover:text-status-success",strokeWidth:1.5,onClick:c=>{c.stopPropagation(),l(t)}}),e.jsx(J,{className:"w-4 h-4 text-text-tertiary hover:text-accent",strokeWidth:1.5,onClick:c=>{c.stopPropagation(),u(t)}})]})]}),e.jsx(W,{open:r,children:e.jsx("div",{className:"ml-6",children:e.jsx(ze,{columns:w,data:x,keyFn:B,onRowClick:n,emptyMessage:"No workers",inline:!0})})})]})}let it=0;function ct(t){const s=t.data||{},r=s.topic?String(s.topic):"",a=s.guid?String(s.guid).slice(0,8):"";switch(t.type){case"pong":return r?`Worker ${a}... on "${r}" responded`:`Engine ${a}... responded`;case"ping":return"Roll call broadcast";case"throttle":{const n=s.throttle,o=r?`queue "${r}"`:a?`node ${a}...`:"all nodes";return`${V(n)} applied to ${o}`}case"job":return`Job ${a?a+"...":""} ${s.status||"updated"}`;case"work":return`Dispatched to "${r||"worker"}" ${a?"("+a+"...)":""}`;case"activate":return`Worker "${r||"unknown"}" activated`;case"cron":return`Cron triggered ${r?'"'+r+'"':""}`;default:return r||a||t.type}}function ut(t){const s=[];let r=0;for(;r<t.length;){const a=t[r];if(a.type==="pong"){let n=r+1;for(;n<t.length&&t[n].type==="pong";)n++;const o=t.slice(r,n);if(o.length>=3)s.push({kind:"group",type:"pong",count:o.length,firstTimestamp:o[o.length-1].timestamp,lastTimestamp:o[0].timestamp,events:o});else for(const u of o)s.push({kind:"single",event:u});r=n}else s.push({kind:"single",event:a}),r++}return s}function re({event:t}){const[s,r]=i.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 ${se[t.type]||"text-text-tertiary"} bg-surface-sunken whitespace-nowrap shrink-0`,children:qe[t.type]||t.type}),e.jsx("span",{className:"text-[9px] text-text-secondary flex-1 min-w-0 truncate",children:ct(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(W,{open:s,children:e.jsx("div",{className:"pb-2",children:e.jsx(Je,{data:t.data})})})]})}function dt({group:t}){const[s,r]=i.useState(!1),a=t.events.filter(o=>{var u;return!((u=o.data)!=null&&u.topic)}).length,n=t.count-a;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 ${se.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",a>0&&n>0?` (${a} engine${a!==1?"s":""}, ${n} worker${n!==1?"s":""})`:a>0?` (${a} engine${a!==1?"s":""})`:` (${n} worker${n!==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(W,{open:s,children:e.jsx("div",{className:"ml-4",children:t.events.map(o=>e.jsx(re,{event:o},o.id))})})]})}function xt({channels:t,onToggle:s,customFilter:r,onCustomFilterChange:a}){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:ae.map(n=>e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer py-0.5",children:[e.jsx("input",{type:"checkbox",checked:t.has(n.key),onChange:()=>s(n.key),className:"w-3 h-3 rounded border-border accent-accent"}),e.jsx("span",{className:"text-[10px] text-text-secondary",title:n.description,children:n.label})]},n.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:n=>a(n.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 pt({bridgeActive:t}){const[s,r]=i.useState(!1),[a,n]=i.useState(!1),[o,u]=i.useState([]),[l,m]=i.useState(()=>new Set(ae.map(x=>x.key))),[d,k]=i.useState(""),b=i.useRef(l);i.useEffect(()=>{b.current=l},[l]);const j=i.useRef(d);i.useEffect(()=>{j.current=d},[d]);const v=x=>{m(w=>{const c=new Set(w);return c.has(x)?c.delete(x):c.add(x),c})};Ie("lt.events.mesh.>",i.useCallback(x=>{var g;const w=((g=x.type)==null?void 0:g.replace("mesh.",""))||"unknown";if(!b.current.has(w))return;const c=j.current;c&&!`${w} ${JSON.stringify(x.data||x)}`.toLowerCase().includes(c.toLowerCase())||u(E=>[{id:++it,type:w,timestamp:x.timestamp||new Date().toISOString(),data:x.data||x},...E].slice(0,He))},[]));const y=()=>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(Ae,{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),n(!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(Le,{className:"w-3.5 h-3.5"})}),e.jsx("button",{onClick:()=>{n(x=>!x),r(!1)},className:`p-1 rounded transition-colors ${a?"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"})}),o.length>0&&e.jsx("button",{onClick:y,className:"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors",title:"Clear events",children:e.jsx(Qe,{className:"w-3.5 h-3.5"})})]})]}),e.jsx(W,{open:s,children:e.jsx(xt,{channels:l,onToggle:v,customFilter:d,onCustomFilterChange:k})}),e.jsx(W,{open:a,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(o.slice(0,50),null,2)})})}),o.length>0&&e.jsxs("p",{className:"text-[9px] text-text-tertiary mb-2",children:[o.length," events"]}),e.jsx("div",{className:"flex-1 overflow-y-auto",children:o.length===0?e.jsx("p",{className:"text-xs text-text-tertiary py-6 text-center",children:t?"Waiting for events...":"Subscribing..."}):ut(o).map((x,w)=>x.kind==="group"?e.jsx(dt,{group:x},`grp-${w}`):e.jsx(re,{event:x.event},x.event.id))})]})}function mt(t){const s=[],r=[],a=[];for(const n of t)P(n)?a.push(n):n.is_scout||T([n]).total>0?s.push(n):r.push(n);return s.sort((n,o)=>n.is_scout&&!o.is_scout?-1:!n.is_scout&&o.is_scout?1:T([o]).total-T([n]).total),r.sort((n,o)=>F(n.engine_id).localeCompare(F(o.engine_id))),a.sort((n,o)=>F(n.engine_id).localeCompare(F(o.engine_id))),{active:s,idle:r,paused:a}}function D({engine:t,isFirst:s,onThrottle:r}){const a=F(t.engine_id),n=Ze(t.engine_id),o=T([t]),u=t.stream_depth??0,l=P(t);return e.jsxs("div",{className:"group/row flex items-center gap-3 py-2 hover:bg-surface-hover/50 transition-colors rounded px-1",children:[l?e.jsx(U,{className:"w-3.5 h-3.5 text-status-warning shrink-0",strokeWidth:1.5}):e.jsx(Fe,{className:`w-3.5 h-3.5 shrink-0 ${o.total>0||t.is_scout?"text-status-success":"text-text-tertiary/30"}`,strokeWidth:1.5}),e.jsx("span",{className:`${s?"text-base font-medium":"text-xs"} text-text-primary truncate max-w-[180px]`,title:t.engine_id,children:a}),n&&e.jsx("span",{className:"text-[10px] text-text-tertiary/50",children:n}),t.is_scout&&e.jsx("span",{className:"text-[9px] text-status-warning uppercase tracking-widest",children:"scout"}),e.jsx("span",{className:"flex-1"}),l&&e.jsx("span",{className:"text-[10px] text-status-warning",children:t.throttle===-1?"Paused":V(t.throttle)}),o.total>0&&e.jsx("span",{className:"text-[10px] font-mono tabular-nums text-text-tertiary w-16 text-right",children:o.total.toLocaleString()}),u>0&&e.jsxs("span",{className:`text-[10px] font-mono tabular-nums w-14 text-right ${u>100?"text-status-warning":"text-text-tertiary/50"}`,children:[u.toLocaleString()," q"]}),e.jsx("span",{className:"text-[10px] font-mono text-text-tertiary/40 w-12 text-right",children:Ke(t.inited)}),e.jsx("span",{className:"opacity-0 group-hover/row:opacity-100 transition-opacity",children:e.jsx("button",{onClick:m=>{m.stopPropagation(),r(t)},className:"text-text-tertiary hover:text-accent transition-colors",title:l?"Resume / adjust throttle":"Pause / throttle",children:e.jsx(J,{className:"w-3.5 h-3.5",strokeWidth:1.5})})})]})}function X({label:t,engines:s,onThrottle:r}){const[a,n]=i.useState(!1);return s.length===0?null:e.jsxs("div",{className:"mt-1",children:[e.jsxs("button",{onClick:()=>n(!a),className:"flex items-center gap-1.5 text-[10px] text-text-tertiary hover:text-text-secondary transition-colors py-1",children:[e.jsx(te,{className:`w-3 h-3 transition-transform duration-200 ${a?"rotate-90":""}`,strokeWidth:2}),s.length," ",t]}),e.jsx(W,{open:a,children:e.jsx("div",{className:"ml-1",children:s.map(o=>e.jsx(D,{engine:o,onThrottle:r},o.engine_id))})})]})}function ht({engines:t,onThrottle:s,isLoading:r}){const{active:a,idle:n,paused:o}=i.useMemo(()=>mt(t),[t]);return r?e.jsx("p",{className:"text-xs text-text-tertiary",children:"Discovering engines..."}):t.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No engines found."}):a.length===0&&n.length===0?e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-3 py-2",children:[e.jsx(U,{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("p",{className:"text-[10px] text-text-tertiary ml-7",children:"Messages are accumulating. Resume at least one engine to restore processing."}),e.jsx("div",{className:"ml-1 mt-2",children:o.map(u=>e.jsx(D,{engine:u,onThrottle:s},u.engine_id))})]}):e.jsxs("div",{children:[a.map((u,l)=>e.jsx(D,{engine:u,isFirst:l===0,onThrottle:s},u.engine_id)),e.jsx(X,{label:"idle",engines:n,onThrottle:s}),e.jsx(X,{label:"paused",engines:o,onThrottle:s})]})}function gt({collapsed:t,toggleSection:s,activeDuration:r,streamStats:a,isLoading:n,queueMap:o,expandedQueues:u,toggleQueue:l,allQueuesExpanded:m,toggleAllQueues:d,handleRowClick:k,handleResumeThrottle:b,handleQueueThrottle:j,handleResumeQueue:v,engines:y,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:`Message Volume (${r})`,sectionKey:"volume",isCollapsed:!!t.volume,onToggle:s,contentClassName:"mt-4 ml-7",children:e.jsx(ot,{byStream:(a==null?void 0:a.byStream)??[],onNodeFilter:()=>{},onQueueFilter:()=>{}})}),e.jsx(I,{title:`Engine Routers (${y.length})`,sectionKey:"engines",isCollapsed:!!t.engines,onToggle:s,contentClassName:"mt-4 ml-7",children:e.jsx(ht,{engines:y,onThrottle:k,isLoading:n})}),e.jsx(I,{title:"Worker Routers",sectionKey:"queues",isCollapsed:!!t.queues,onToggle:s,contentClassName:"mt-4 ml-7 flex flex-col gap-0",children:n?e.jsx("p",{className:"text-xs text-text-tertiary",children:"Discovering mesh nodes..."}):o.size===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:'No worker routers 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:d,className:"text-[10px] text-accent hover:underline",children:m?"Collapse all":"Expand all"})}),[...o.entries()].sort(([w],[c])=>w.localeCompare(c)).map(([w,c])=>e.jsx(lt,{queue:w,workers:c,expanded:u.has(w),onToggle:l,onWorkerClick:k,onResumeThrottle:b,onQueueThrottle:j,onResumeQueue:v,byStream:(a==null?void 0:a.byStream)??[],activeDuration:r},w))]})})]}),e.jsx(pt,{bridgeActive:x})]})}function Mt(){const{namespace:t,available:s}=ve(),{filters:r,setFilter:a}=Ne({filters:{app_id:"",duration:"1h"}}),n=r.app_id||t,o=r.duration||"1h",u=$e(),l=6e4,{data:m,isLoading:d,error:k,refetch:b,isFetching:j}=Se(n,l),{data:v}=_e(n,o,void 0,l),y=i.useMemo(()=>[...(m==null?void 0:m.profiles)??[]].sort((S,_)=>{const z=S.worker_topic||S.stream||"",Q=_.worker_topic||_.stream||"";return!S.worker_topic&&_.worker_topic?-1:S.worker_topic&&!_.worker_topic?1:z.localeCompare(Q)}),[m==null?void 0:m.profiles]),x=i.useMemo(()=>y.filter(h=>!M(h)),[y]),w=i.useMemo(()=>y.filter(M),[y]),c=i.useMemo(()=>Ye(y),[y]),g=y.filter(P).length,E=i.useMemo(()=>{const h=new Set(s);return n&&h.add(n),[...h].sort().map(S=>({value:S,label:S}))},[s,n]),[p]=Ue(),C=p.get("queue"),[f,$]=i.useState(()=>C?new Set([C]):new Set),A=i.useCallback(h=>{$(S=>{const _=S.has(h),z=_?new Set:new Set([h]),Q=new URLSearchParams(window.location.search);_?Q.delete("queue"):Q.set("queue",h);const G=Q.toString();return window.history.pushState(null,"",`${window.location.pathname}${G?`?${G}`:""}`),z})},[]),N=c.size>0&&[...c.keys()].every(h=>f.has(h)),R=i.useCallback(()=>{$(N?new Set:new Set(c.keys()))},[N,c]),O="lt:controlplane:collapsed",[L,oe]=i.useState(()=>{try{const h=JSON.parse(localStorage.getItem(O)||"{}");return C&&(h.queues=!1),h}catch{return{}}}),le=i.useCallback(h=>{oe(S=>{const _={...S,[h]:!S[h]};return localStorage.setItem(O,JSON.stringify(_)),_})},[]),{throttleModalOpen:ie,throttleTargets:q,selectedThrottleTargets:ce,throttleMutation:ue,handleBulkThrottle:de,handleRowClick:xe,handleResumeThrottle:pe,handleResumeQueue:me,handleQueueThrottle:he,closeThrottleModal:ge}=tt({activeAppId:n,allProfiles:y,profiles:y}),fe=i.useMemo(()=>{const h=[{label:"Engines",value:x.length,dotClass:"bg-status-active"},{label:"Workers",value:w.length,dotClass:"bg-text-secondary"},{label:"Topics",value:c.size}];return g>0&&h.push({label:"Throttled",value:g,dotClass:"bg-status-warning"}),h},[x.length,w.length,c.size,g]),[H,be]=i.useState(!1),je=i.useCallback(()=>{u.mutate({appId:n},{onSuccess:()=>be(!0)})},[n,u]);return i.useEffect(()=>{!H&&n&&je()},[n]),e.jsxs("div",{children:[e.jsx(ye,{title:"Routers",docsHash:"#docs:dashboard.md:task-queues",stats:fe,actions:e.jsx(rt,{})}),e.jsxs(we,{actions:e.jsx("div",{className:"flex items-center gap-1",children:Ve.map(h=>e.jsx("button",{onClick:()=>a("duration",h.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${o===h.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:h.label},h.value))}),children:[e.jsx(ke,{label:"Application",value:r.app_id,onChange:h=>a("app_id",h),options:E}),e.jsxs("button",{onClick:()=>b(),disabled:j,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(Oe,{className:`w-3.5 h-3.5 ${j?"animate-spin":""}`}),"Roll Call"]})]}),k&&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:k.message==="Session expired"?"Session expired — please log in again.":`Failed to load mesh data: ${k.message}`})}),e.jsx(gt,{collapsed:L,toggleSection:le,activeDuration:o,streamStats:v,isLoading:d,queueMap:c,expandedQueues:f,toggleQueue:A,allQueuesExpanded:N,toggleAllQueues:R,handleRowClick:xe,handleResumeThrottle:pe,handleQueueThrottle:he,handleResumeQueue:me,engines:x,bridgeActive:H}),e.jsx(at,{open:ie,onClose:ge,targets:q.length>0?q:ce,onApply:de,isPending:ue.isPending})]})}export{Mt as ControlPlanePage};
|
|
2
|
-
//# sourceMappingURL=index-DfbrPOP3.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DfbrPOP3.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 /** API param: scope — target engines only, workers only, or both */\n scope?: 'engines' | 'workers' | 'all';\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, scoped to engines only\n for (const e of engines) {\n targets.push({ label: `Engine ${e.engine_id}`, guid: e.engine_id, scope: 'engines' });\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 ...(t.scope ? { scope: t.scope } : {}),\n });\n }\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n const handleRowClick = (profile: QuorumProfile, scope?: 'engines' | 'workers') => {\n const label = isWorker(profile)\n ? `${profile.worker_topic} ${profile.engine_id}`\n : `Engine ${profile.engine_id}`;\n setThrottleTargets([{\n label,\n guid: profile.engine_id,\n scope: scope || (isWorker(profile) ? 'workers' : 'engines'),\n }]);\n setThrottleModalOpen(true);\n };\n\n const handleBulkThrottleOpen = () => {\n setThrottleTargets(selectedThrottleTargets);\n setThrottleModalOpen(true);\n };\n\n const handleResumeThrottle = (profile: QuorumProfile, scope?: 'engines' | 'workers') => {\n const resolvedScope = scope || (isWorker(profile) ? 'workers' : 'engines');\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, guid: profile.engine_id, scope: resolvedScope });\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-status-active/10 text-status-active'\n : 'bg-accent/[0.06] text-text-secondary';\n const scopeLabel = target.scope === 'engines' ? 'engine only'\n : target.scope === 'workers' ? 'worker only'\n : 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\">{scopeLabel}</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\ntype Scope = 'engines' | 'workers' | 'all';\n\nexport function EmergencyControls() {\n const { data: appsData } = useControlPlaneApps();\n const throttle = useThrottle();\n const [confirming, setConfirming] = useState<{ ms: number; scope: Scope } | null>(null);\n const [inflight, setInflight] = useState(false);\n\n const apps = appsData?.apps ?? [];\n\n const applyAll = useCallback(async (ms: number, scope: Scope = 'all') => {\n if (apps.length === 0) return;\n setInflight(true);\n\n const results = await Promise.allSettled(\n apps.map((app) => throttle.mutateAsync({\n appId: app.appId,\n throttle: ms,\n ...(scope !== 'all' ? { scope } : {}),\n })),\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(null);\n }, [apps, throttle]);\n\n const scopeLabel = (scope: Scope) =>\n scope === 'engines' ? 'engines' : scope === 'workers' ? 'workers' : 'everything';\n\n if (confirming) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-status-error\">\n Pause {scopeLabel(confirming.scope)}?\n </span>\n <button\n onClick={() => applyAll(confirming.ms, confirming.scope)}\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(null)}\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({ ms: -1, scope: 'all' })}\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 engines and workers\"\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 engines and workers\"\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-status-active/70' : 'bg-accent/60';\n const labelColor = isEngine ? 'text-status-active' : '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-status-active/70 hover:text-status-active`}\n onClick={() => onNodeFilter?.('engines')}\n >\n Engine Stream\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 Streams\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, 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 sortedWorkers = useMemo(() =>\n [...workers].sort((a, b) => sumCounts([b]).total - sumCounts([a]).total),\n [workers],\n );\n\n const columns = useMemo((): Column<QuorumProfile>[] => [\n {\n key: 'engine_id',\n label: 'Router',\n render: (row) => {\n const label = row.engine_id.replace(/^[^:]+::/, '').replace(/-[A-Za-z0-9_]{10,}$/, '') || row.engine_id;\n const source = row.engine_id.match(/^([^:]+)::/)?.[1] || '';\n return (\n <div className=\"flex items-center gap-2\" title={row.engine_id}>\n <span className=\"text-xs text-text-secondary truncate max-w-[180px]\">{label}</span>\n {source && <span className=\"text-[9px] text-text-tertiary/50\">{source}</span>}\n </div>\n );\n },\n },\n {\n key: 'processed',\n label: 'Processed',\n render: (row) => {\n const c = sumCounts([row]);\n return <span className=\"text-xs font-mono tabular-nums text-text-tertiary\">{c.total > 0 ? c.total.toLocaleString() : '--'}</span>;\n },\n className: 'w-24',\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: '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 dot-ring 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={sortedWorkers}\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, CirclePause, ChevronRight, Gauge } from 'lucide-react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { sumCounts, formatUptime, engineLabel, engineSource, isThrottled, formatThrottleHuman } from './helpers';\n\ninterface EngineClusterProps {\n engines: QuorumProfile[];\n onThrottle: (profile: QuorumProfile) => void;\n isLoading: boolean;\n}\n\nfunction categorize(engines: QuorumProfile[]) {\n const active: QuorumProfile[] = [];\n const idle: QuorumProfile[] = [];\n const paused: QuorumProfile[] = [];\n\n for (const e of engines) {\n if (isThrottled(e)) {\n paused.push(e);\n } else if (e.is_scout || sumCounts([e]).total > 0) {\n active.push(e);\n } else {\n idle.push(e);\n }\n }\n\n // Sort active by processed descending; scout first if tied\n active.sort((a, b) => {\n if (a.is_scout && !b.is_scout) return -1;\n if (!a.is_scout && b.is_scout) return 1;\n return sumCounts([b]).total - sumCounts([a]).total;\n });\n\n idle.sort((a, b) => engineLabel(a.engine_id).localeCompare(engineLabel(b.engine_id)));\n paused.sort((a, b) => engineLabel(a.engine_id).localeCompare(engineLabel(b.engine_id)));\n\n return { active, idle, paused };\n}\n\nfunction EngineRow({ engine, isFirst, onThrottle }: {\n engine: QuorumProfile;\n isFirst?: boolean;\n onThrottle: (p: QuorumProfile) => void;\n}) {\n const label = engineLabel(engine.engine_id);\n const source = engineSource(engine.engine_id);\n const counts = sumCounts([engine]);\n const pending = engine.stream_depth ?? 0;\n const paused = isThrottled(engine);\n\n return (\n <div className=\"group/row flex items-center gap-3 py-2 hover:bg-surface-hover/50 transition-colors rounded px-1\">\n {paused ? (\n <CirclePause className=\"w-3.5 h-3.5 text-status-warning shrink-0\" strokeWidth={1.5} />\n ) : (\n <Zap className={`w-3.5 h-3.5 shrink-0 ${counts.total > 0 || engine.is_scout ? 'text-status-success' : 'text-text-tertiary/30'}`} strokeWidth={1.5} />\n )}\n\n <span className={`${isFirst ? 'text-base font-medium' : 'text-xs'} text-text-primary truncate max-w-[180px]`} title={engine.engine_id}>\n {label}\n </span>\n {source && <span className=\"text-[10px] text-text-tertiary/50\">{source}</span>}\n\n {engine.is_scout && (\n <span className=\"text-[9px] text-status-warning uppercase tracking-widest\">scout</span>\n )}\n\n <span className=\"flex-1\" />\n\n {paused && (\n <span className=\"text-[10px] text-status-warning\">{engine.throttle === -1 ? 'Paused' : formatThrottleHuman(engine.throttle)}</span>\n )}\n\n {counts.total > 0 && (\n <span className=\"text-[10px] font-mono tabular-nums text-text-tertiary w-16 text-right\">{counts.total.toLocaleString()}</span>\n )}\n\n {pending > 0 && (\n <span className={`text-[10px] font-mono tabular-nums w-14 text-right ${pending > 100 ? 'text-status-warning' : 'text-text-tertiary/50'}`}>{pending.toLocaleString()} q</span>\n )}\n\n <span className=\"text-[10px] font-mono text-text-tertiary/40 w-12 text-right\">{formatUptime(engine.inited)}</span>\n\n <span className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\">\n <button\n onClick={(e) => { e.stopPropagation(); onThrottle(engine); }}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title={paused ? 'Resume / adjust throttle' : 'Pause / throttle'}\n >\n <Gauge className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </span>\n </div>\n );\n}\n\nfunction CollapsibleGroup({ label, engines, onThrottle }: {\n label: string;\n engines: QuorumProfile[];\n onThrottle: (p: QuorumProfile) => void;\n}) {\n const [open, setOpen] = useState(false);\n if (engines.length === 0) return null;\n\n return (\n <div className=\"mt-1\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 text-[10px] text-text-tertiary hover:text-text-secondary transition-colors py-1\"\n >\n <ChevronRight className={`w-3 h-3 transition-transform duration-200 ${open ? 'rotate-90' : ''}`} strokeWidth={2} />\n {engines.length} {label}\n </button>\n <Collapsible open={open}>\n <div className=\"ml-1\">\n {engines.map((e) => (\n <EngineRow key={e.engine_id} engine={e} onThrottle={onThrottle} />\n ))}\n </div>\n </Collapsible>\n </div>\n );\n}\n\nexport function EngineCluster({ engines, onThrottle, isLoading }: EngineClusterProps) {\n const { active, idle, paused } = useMemo(() => categorize(engines), [engines]);\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 paused — no active processor\n if (active.length === 0 && idle.length === 0) {\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 </div>\n <p className=\"text-[10px] text-text-tertiary ml-7\">Messages are accumulating. Resume at least one engine to restore processing.</p>\n <div className=\"ml-1 mt-2\">\n {paused.map((e) => (\n <EngineRow key={e.engine_id} engine={e} onThrottle={onThrottle} />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n {/* Active engines — shown individually */}\n {active.map((e, i) => (\n <EngineRow key={e.engine_id} engine={e} isFirst={i === 0} onThrottle={onThrottle} />\n ))}\n\n {/* Idle — collapsed */}\n <CollapsibleGroup label=\"idle\" engines={idle} onThrottle={onThrottle} />\n\n {/* Paused — collapsed */}\n <CollapsibleGroup label=\"paused\" engines={paused} onThrottle={onThrottle} />\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 */}\n <CollapsibleSection\n title={`Message 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 {/* Engine Routers — nervous system, shown first */}\n <CollapsibleSection\n title={`Engine Routers (${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 isLoading={isLoading}\n />\n </CollapsibleSection>\n\n {/* Worker Routers */}\n <CollapsibleSection\n title=\"Worker Routers\"\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 routers 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 </div>\n\n <QuorumFeed bridgeActive={bridgeActive} />\n </div>\n );\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\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 { useNamespace } from '../../../hooks/useNamespace';\nimport {\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 { namespace, available } = useNamespace();\n\n const { filters, setFilter } = useFilterParams({\n filters: { app_id: '', duration: '1h' },\n });\n\n const activeAppId = filters.app_id || namespace;\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(available);\n if (activeAppId) ids.add(activeAppId);\n return [...ids].sort().map((id) => ({ value: id, label: id }));\n }, [available, activeAppId]);\n\n // ── Deep-link: auto-expand a queue from ?queue= param ──────────\n const [searchParams] = useSearchParams();\n const deepLinkQueue = searchParams.get('queue');\n\n // ── Queue card expand/collapse state ───────────────────────────\n const [expandedQueues, setExpandedQueues] = useState<Set<string>>(\n () => deepLinkQueue ? new Set([deepLinkQueue]) : new Set(),\n );\n const toggleQueue = useCallback((queue: string) => {\n setExpandedQueues((prev) => {\n const closing = prev.has(queue);\n const next = closing ? new Set<string>() : new Set([queue]);\n // Sync URL — add or remove ?queue= param\n const params = new URLSearchParams(window.location.search);\n if (closing) {\n params.delete('queue');\n } else {\n params.set('queue', queue);\n }\n const qs = params.toString();\n window.history.pushState(null, '', `${window.location.pathname}${qs ? `?${qs}` : ''}`);\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 const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n // When deep-linking to a queue, ensure Worker Routers section is open\n if (deepLinkQueue) saved.queues = false;\n return saved;\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-status-active' },\n { label: 'Workers', value: workers.length, dotClass: 'bg-text-secondary' },\n { label: 'Topics', 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=\"Routers\"\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","stripStreamPrefix","name","engineLabel","engineId","engineSource","QUORUM_CHANNELS","rowKey","groupByQueue","profiles","map","q","sumCounts","total","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","t","scope","label","resolvedScope","queueName","PRESETS","TargetPill","target","isMesh","isEngine","color","scopeLabel","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","sortedWorkers","a","b","columns","row","source","_a","c","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","setCustomFilter","channelsRef","useRef","customFilterRef","toggleChannel","useEventSubscription","raw","type","cf","handleClear","Radio","v","Settings","Code","Eraser","item","idx","categorize","active","idle","paused","EngineRow","engine","isFirst","onThrottle","counts","Zap","CollapsibleGroup","setOpen","EngineCluster","isLoading","ControlPlaneContent","collapsed","toggleSection","streamStats","queueMap","expandedQueues","toggleQueue","allQueuesExpanded","toggleAllQueues","handleRowClick","handleResumeThrottle","handleQueueThrottle","handleResumeQueue","CollapsibleSection","qWorkers","ControlPlanePage","namespace","available","useNamespace","filters","setFilter","useFilterParams","subscribeMesh","useSubscribeMesh","REFRESH_INTERVAL","rollCallData","rollCallError","refetch","isFetching","useRollCall","useStreamStats","ta","tb","throttledCount","appOptions","ids","id","searchParams","useSearchParams","deepLinkQueue","setExpandedQueues","closing","params","qs","STORAGE_KEY","setCollapsed","saved","handleBulkThrottle","closeThrottleModal","headerStats","stats","setBridgeActive","handleStartBridge","PageHeaderWithStats","FilterBar","FilterSelect","RefreshCw"],"mappings":"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"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{j as e,a as p,b as Rt}from"./vendor-query-B2UbickB.js";import{Q as Ce,M as Me,J as ue,b as _e,m as ze,o as Mt,U as It,g as Ot,h as Dt,V as St,W as Pt,X as Lt,u as Wt,x as Ft,n as qt,Y as Vt}from"./index-DycfrrTK.js";import{b as Jt,d as Ht,H as Ut,g as rt,u as at,C as it,m as zt,c as lt,a as Yt}from"./CustomDurationPicker-C-vGsrFl.js";import{P as Gt}from"./PageHeader-poyTWcUA.js";import{L as Bt}from"./ListToolbar-CItVkLQ-.js";import{i as ot,C as Oe}from"./CountdownTimer-D20FNwS-.js";import{u as Xt}from"./workflows-csQAJF0G.js";import{g as Qt}from"./useEventHooks-DxnqYVPg.js";import{S as Zt,a as Kt,P as X}from"./SlidePanel-Bm9B6zIA.js";import{S as es}from"./StatusBadge-CEQMRmSQ.js";import{R as ts}from"./RolePill-C0SWz9X7.js";import{C as K}from"./CopyableId-uot2mE_g.js";import{U as ct}from"./UserName-DOX2P-8M.js";import{O as ss,am as ns,S as rs,an as as,A as dt,l as is,a7 as xt,U as ls,aa as os,ab as cs,ao as ds,ap as xs,aq as us,ar as Ye,as as ms,at as Ge,au as Be,av as ps,X as fs}from"./vendor-icons-B98-XxNc.js";import{c as ut,L as je,e as hs}from"./vendor-react-CXumBFUA.js";import{M as gs}from"./Modal-D4afnAjc.js";import"./constants-BHkpVaqx.js";import"./users-CYVJHgNM.js";const js={SCHEMA_VALIDATION:"schema_validation"};function bs(t){return typeof t=="object"&&t!==null&&t.code===js.SCHEMA_VALIDATION&&Array.isArray(t.violations)}const ge={pending:"#0ea5e9",claimed:"#f97316",resolved:"#16a34a",cancelled:"#ef4444"},Ee=5;function Xe({pct:t,place:n,label:a,title:r,emphasis:s}){const i=e.jsx("span",{className:"w-px h-1.5 bg-slate-300","aria-hidden":!0}),d=e.jsx("span",{className:`whitespace-nowrap leading-none tabular-nums ${s?"text-text-secondary":"text-text-tertiary"}`,children:a});return e.jsx("div",{title:r,className:`absolute ${n==="above"?"bottom-0":"top-0"} flex flex-col items-center gap-0 -translate-x-1/2 cursor-help`,style:{left:`${t}%`},children:n==="above"?e.jsxs(e.Fragment,{children:[d,i]}):e.jsxs(e.Fragment,{children:[i,d]})})}function ys({esc:t,className:n=""}){const a=new Date(t.created_at).getTime(),r=t.claimed_at?new Date(t.claimed_at).getTime():null,s=t.status==="resolved",i=t.status==="cancelled"||t.status==="expired",d=s||i,o=ot(t),l=!!r&&(o||d),c=s&&t.resolved_at?new Date(t.resolved_at).getTime():i?new Date(t.updated_at).getTime():Date.now(),x=Math.max(c-a,1),u=l&&r?Math.max(r-a,0):x,f=l&&r?Math.max(c-r,0):0,j=Math.min(100,Math.max(0,u/x*100)),h=l?Math.max(0,100-j):0,g=s?ge.resolved:i?ge.cancelled:ge.claimed,m=s?"Resolved after":i?"Cancelled after":"In progress",$=Ce(u),k=Ce(x),I=s?`Resolved in ${k} total`:i?`Cancelled after ${k}`:`Open ${k} so far`,P=`Lifecycle bar: blue = time waiting to be claimed, ${s?"green":i?"red":"orange"} = ${m.toLowerCase()} the claim.`;return e.jsxs("div",{className:n,title:P,children:[e.jsx("div",{className:"relative h-3 text-[9px] font-mono",children:l&&e.jsx(Xe,{pct:j,place:"above",label:$,title:`Time to claim: ${$}`})}),e.jsxs("div",{className:"flex w-full rounded-full overflow-hidden",style:{height:Ee,backgroundColor:"#e2e8f0"},title:P,children:[e.jsx("div",{style:{width:`${j}%`,minWidth:Ee,backgroundColor:ge.pending,opacity:.75},title:`Waiting ${$} — created → claimed`}),l&&h>0&&e.jsx("div",{style:{width:`${h}%`,minWidth:Ee,backgroundColor:g,opacity:.75},title:`${m} ${Ce(f)}`})]}),e.jsx("div",{className:"relative h-3 text-[9px] font-mono",children:e.jsx(Xe,{pct:100,place:"below",emphasis:!0,label:k,title:I})})]})}function Ns({triage:t,payload:n}){const a=t.confidence??0,r=a>=.8?"text-status-success":a>=.5?"text-status-pending":"text-status-error",s=vs(t.originalData,n);return e.jsxs("div",{className:"space-y-5",children:[t.diagnosis&&e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:t.diagnosis}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3 text-xs text-text-tertiary",children:[t.tool_calls_made!=null&&e.jsxs("span",{children:[t.tool_calls_made," tool call",t.tool_calls_made!==1?"s":""]}),t.tool_calls_made!=null&&e.jsx("span",{className:"text-text-quaternary",children:"·"}),e.jsxs("span",{className:`font-medium ${r}`,children:[Math.round(a*100),"% confidence"]})]}),t.actions_taken&&t.actions_taken.length>0&&e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.actions_taken.map((i,d)=>e.jsxs("span",{className:`inline-flex items-center gap-1.5 px-2 py-0.5 text-[11px]
|
|
2
|
-
text-text-secondary`,children:[e.jsx("svg",{className:"w-3 h-3 text-status-success shrink-0",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"})}),i]},d))}),t.recommendation&&e.jsx("p",{className:"text-[11px] text-text-tertiary italic",children:t.recommendation}),s.length>0&&e.jsx("div",{className:"space-y-4 pt-2",children:s.map(i=>e.jsx(ws,{diff:i},i.key))})]})}function vs(t,n){if(!t)return[];const a=[];for(const r of Object.keys(t)){if(r.startsWith("_"))continue;const s=t[r],i=n[r];i!==void 0&&JSON.stringify(s)!==JSON.stringify(i)&&a.push({key:r,label:r.replace(/[_-]/g," "),original:s,corrected:i})}return a}function ws({diff:t}){const n=Qe(t.original),a=Qe(t.corrected);return n!==null&&a!==null?e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("p",{className:"text-sm text-text-tertiary leading-relaxed line-through decoration-text-tertiary/30",children:n})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("p",{className:"text-sm text-text-primary leading-relaxed",children:a})]})]}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal",children:"(original)"})]}),e.jsx("pre",{className:"text-xs text-text-tertiary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.original=="object"?JSON.stringify(t.original,null,2):String(t.original)})]}),e.jsxs("div",{children:[e.jsxs("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[t.label," ",e.jsx("span",{className:"normal-case font-normal text-status-success",children:"(corrected)"})]}),e.jsx("pre",{className:"text-xs text-text-primary font-mono whitespace-pre-wrap leading-relaxed",children:typeof t.corrected=="object"?JSON.stringify(t.corrected,null,2):String(t.corrected)})]})]})}function Qe(t){return t==null?"null":typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"?String(t):null}const H={HELP:"help",DETAILS:"details",TRIAGE:"triage",METADATA:"metadata",CONTEXT:"context",RECORD:"record",ERRORS:"errors"},mt="lt:escalation:panel:view";function ks(t){try{const n=localStorage.getItem(mt);if(n&&t.includes(n))return n}catch{}return H.HELP}const Cs=new Set(["form_schema"]);function _s({metadata:t,role:n}){const a=Object.entries(t??{}).filter(([r])=>!r.startsWith("_")&&!Cs.has(r));return a.length===0?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No metadata on this escalation."}):e.jsx("dl",{className:"space-y-3.5",children:a.map(([r,s])=>{const i=typeof s=="object"&&s!==null?JSON.stringify(s):String(s),d=ze(r,s,n),o=ze(r,s);return e.jsxs("div",{className:"group relative",children:[e.jsx("dt",{className:"text-[11px] font-medium text-text-secondary uppercase tracking-wide",children:r.replace(/[_-]/g," ")}),e.jsxs("dd",{className:"mt-0.5 flex items-center gap-1",children:[e.jsx("span",{className:"text-[12px] text-text-primary font-mono break-all flex-1",children:i}),e.jsx(je,{to:d,title:`Filter this queue: ${r} = ${i}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent",children:e.jsx(os,{className:"w-3 h-3"})}),e.jsx(je,{to:o,title:`Search all queues: ${r} = ${i}`,className:"opacity-0 group-hover:opacity-100 transition-opacity shrink-0 p-0.5 text-text-quaternary hover:text-accent",children:e.jsx(cs,{className:"w-3 h-3"})})]})]},r)})})}function Es({esc:t,claimed:n,isTerminal:a,isBuilder:r,traceUrl:s}){return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("dl",{className:"space-y-3.5",children:[e.jsx(X,{label:"Status",children:e.jsx(es,{status:t.status})}),e.jsx(X,{label:"Assigned to Role",children:e.jsx(ts,{role:t.role,size:"md"})}),e.jsxs(X,{label:"Priority",children:["P",t.priority]}),(n||a)&&t.assigned_to&&e.jsx(X,{label:"Claimed By",children:e.jsxs("span",{className:"inline-flex items-center gap-1.5 font-medium text-text-primary",children:[e.jsx(ls,{className:"w-3 h-3 shrink-0 text-accent/75"}),e.jsx(ct,{userId:t.assigned_to})]})}),e.jsx(X,{label:"Created",children:e.jsx(_e,{date:t.created_at})}),(n||a)&&t.claimed_at&&e.jsx(X,{label:"Claimed",children:e.jsx(_e,{date:t.claimed_at})}),n&&!a&&t.assigned_until&&e.jsx(X,{label:"Time Remaining",children:e.jsx(Oe,{until:t.assigned_until})}),t.resolved_at&&e.jsx(X,{label:"Completed",children:e.jsx("span",{className:"text-status-success",children:e.jsx(_e,{date:t.resolved_at})})})]}),r&&e.jsxs(e.Fragment,{children:[e.jsx("hr",{className:"border-surface-border/60"}),e.jsxs("div",{className:"space-y-3.5",children:[e.jsx(K,{label:"Escalation ID",value:t.id}),t.task_id&&e.jsx(K,{label:"Task ID",value:t.task_id,href:`/workflows/tasks/detail/${t.task_id}`}),t.workflow_type&&e.jsx(K,{label:"Workflow Name",value:t.workflow_type,href:`/workflows/executions?entity=${encodeURIComponent(t.workflow_type)}`}),t.workflow_id&&e.jsx(K,{label:"Workflow ID",value:t.workflow_id,href:`/workflows/executions/${t.workflow_id}`}),t.task_queue&&e.jsx(K,{label:"Task Queue",value:t.task_queue,href:`/admin/controlplane?queue=${encodeURIComponent(t.task_queue)}`}),t.origin_id&&t.origin_id!==t.workflow_id&&e.jsx(K,{label:"Origin",value:t.origin_id,href:`/processes/detail/${t.origin_id}`}),t.trace_id&&e.jsx(K,{label:"Trace",value:t.trace_id,href:s?s.replace("{traceId}",t.trace_id):void 0,external:!0})]})]})]})}function As({errors:t}){const n=a=>{const r=document.querySelector(`[data-field-key="${a}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.focus({preventScroll:!0}))};return t.length===0?e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No errors to display."}):e.jsxs("div",{className:"space-y-1",role:"alert","aria-live":"polite",children:[e.jsxs("p",{className:"text-[11px] font-semibold uppercase tracking-wider text-status-error mb-4",children:[t.length," ",t.length===1?"issue":"issues"," to resolve"]}),e.jsx("div",{className:"space-y-1.5",children:t.map(({field:a,message:r})=>e.jsxs("button",{onClick:()=>n(a),className:"w-full text-left flex items-start gap-3 px-3 py-2.5 rounded hover:bg-status-error/5 transition-colors group",children:[e.jsx(xt,{className:"w-3.5 h-3.5 mt-0.5 shrink-0 text-status-error/60 group-hover:text-status-error transition-colors"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-semibold text-text-primary capitalize leading-snug",children:a.replace(/[_-]/g," ")}),e.jsx("p",{className:"text-[11px] text-text-tertiary group-hover:text-text-secondary transition-colors leading-snug mt-0.5",children:r})]})]},a))}),e.jsx("p",{className:"text-[10px] text-text-quaternary mt-4 px-3",children:"Click an issue to scroll to and focus the field."})]})}function Ts({esc:t,schema:n,envelope:a,payload:r,resolver:s,triage:i,hasAI:d,claimed:o,claimedByMe:l,isTerminal:c,isBuilder:x,traceUrl:u,open:f,noGutter:j,formErrors:h,activePanel:g,onPanelChange:m}){const $=ut(),k=Object.values(H),[I,P]=p.useState(()=>ks(k)),D=g??I,C=p.useCallback(O=>{try{localStorage.setItem(mt,O)}catch{}P(O),m==null||m(O)},[m]);p.useEffect(()=>{g&&g!==I&&P(g)},[g]);const E=p.useMemo(()=>Jt(n,{escalation:t,metadata:t.metadata??null,envelope:a,payload:r,resolver:s})??Ht({isTerminal:c,status:t.status,claimed:o,claimedByMe:l}),[n,t,a,r,s,c,o,l]),w=p.useCallback(O=>{const A=O.target.closest("a"),S=A==null?void 0:A.getAttribute("href");S!=null&&S.startsWith("/")&&(O.preventDefault(),$(S))},[$]),M=[{id:H.HELP,icon:ss,label:"Instructions",content:e.jsx(Me,{content:E,onClick:w})},{id:H.DETAILS,icon:ns,label:"Details",content:e.jsx(Es,{esc:t,claimed:o,isTerminal:c,isBuilder:x,traceUrl:u})},...d&&i?[{id:H.TRIAGE,icon:rs,label:"AI Analysis",content:e.jsx(Ns,{triage:i,payload:r??{}})}]:[],{id:H.METADATA,icon:as,label:"Metadata",content:e.jsx(_s,{metadata:t.metadata,role:t.role})},{id:H.CONTEXT,icon:dt,label:"Context",content:e.jsxs("div",{className:"space-y-5",children:[a!=null&&e.jsx(ue,{data:a,label:"Input Envelope"}),r!=null&&e.jsx(ue,{data:r,label:"Escalation Context"}),s!=null&&e.jsx(ue,{data:s,label:"Resolver Payload"}),a==null&&r==null&&s==null&&e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No context on this escalation."})]})},...x?[{id:H.RECORD,icon:is,label:"Record",content:e.jsx(ue,{data:t,label:"Escalation Record"})}]:[],...h&&h.length>0?[{id:H.ERRORS,icon:(({className:O})=>e.jsx(xt,{className:`${O??""} text-status-error`})),label:"Errors",content:e.jsx(As,{errors:h})}]:[]];return e.jsx(Zt,{open:f,width:384,className:"h-full",children:e.jsx("div",{className:`h-full${j?"":" pl-6"}`,children:e.jsxs("div",{className:"h-full flex flex-col bg-surface-hover",children:[e.jsx("div",{className:"shrink-0 pt-1.5 pb-0.5 flex justify-center",children:e.jsx(ys,{esc:t,className:"w-[80%]"})}),e.jsx("div",{className:"flex-1 min-h-0",children:e.jsx(Kt,{views:M,activeId:D,onViewChange:C,stickyClassName:"h-full min-h-0"})})]})})})}function $s(t,n){if(typeof t!="string"||!n)return[];const a=t.indexOf(".");if(a===-1)return[];const r=n[t.slice(0,a)];if(!r||typeof r!="object")return[];let s=r;for(const i of t.slice(a+1).split("."))if(s=s[i],s===void 0)return[];return Array.isArray(s)?s:[]}function Rs(t,n,a){if((n==null?void 0:n["x-lt-widget"])!=="checklist"||n["x-lt-require-all"]!==!0)return;const s=$s(n["x-lt-source"],a).filter(o=>o.required!==!1);if(s.length===0)return;const i=typeof t=="object"&&t!==null&&!Array.isArray(t)?t:{},d=s.filter(o=>!i[o.id]).length;if(d!==0)return`${d} of ${s.length} checks incomplete`}function Ms(t,n){const a=n==null?void 0:n.type;if(typeof a=="string"&&!(t==null||t===""))switch(a){case"string":return typeof t=="string"?void 0:"Expected text";case"number":return typeof t=="number"&&Number.isFinite(t)?void 0:"Expected a number";case"integer":return typeof t=="number"&&Number.isInteger(t)?void 0:"Expected a whole number";case"boolean":return typeof t=="boolean"?void 0:"Expected true or false";case"array":return Array.isArray(t)?void 0:"Expected a list";case"object":return typeof t=="object"&&!Array.isArray(t)?void 0:"Expected an object";default:return}}function Is(t,n,a){if(!n)return;const r=n.enum;if(Array.isArray(r)&&r.length>0&&t!==void 0&&t!==null&&t!==""&&!r.includes(t))return`Must be one of: ${r.map(s=>String(s)).join(", ")}`;if(typeof t=="string"){const s=t.trim();if(s==="")return;const i=ie(n.minLength,n["x-lt-min-length"],a);if(i!==void 0&&s.length<i)return`Minimum ${i} character${i===1?"":"s"}`;const d=ie(n.maxLength,n["x-lt-max-length"],a);if(d!==void 0&&s.length>d)return`Maximum ${d} characters (${s.length} entered)`;const o=n.pattern;if(o)try{if(!new RegExp(o).test(s))return n["x-lt-pattern-error"]??"Invalid format"}catch{}const l=n.format;if(l==="email"&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s))return"Enter a valid email address";if(l==="uri"&&!/^https?:\/\/.+/.test(s))return"Enter a valid URL"}if(typeof t=="number"){const s=ie(n.minimum,n["x-lt-minimum"],a),i=ie(n.exclusiveMinimum,void 0,a),d=ie(n.maximum,n["x-lt-maximum"],a),o=ie(n.exclusiveMaximum,void 0,a);if(s!==void 0&&t<s)return`Minimum value is ${s}`;if(i!==void 0&&t<=i)return`Must be greater than ${i}`;if(d!==void 0&&t>d)return`Maximum value is ${d}`;if(o!==void 0&&t>=o)return`Must be less than ${o}`}}function ie(t,n,a){if(typeof t=="number")return t;if(typeof n=="string"&&a){const r=n.indexOf(".");if(r!==-1){const s=n.slice(0,r),i=n.slice(r+1),d=a[s];if(d&&typeof d=="object"){const o=i.split(".");let l=d;for(const c of o)if(l=l[c],l===void 0)break;if(typeof l=="number")return l;if(typeof l=="string"){const c=Number(l);if(!Number.isNaN(c))return c}}}}}function pt(t,n,a,r,s){if(!r)return;if(a){if(t==null||typeof t=="boolean"&&!t||typeof t=="string"&&t.trim()==="")return"Required";if(typeof t=="object"&&!Array.isArray(t)&&t!==null){const o=Object.values(t);if(o.length===0||o.every(l=>!l))return"Required"}}const i=Ms(t,n);if(i)return i;const d=Rs(t,n,s);return d||Is(t,n,s)}function Ze(t){return t!=null&&t!==""&&t!==!1&&t!==0}function Os(t){return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}function Ke(t,n){const a=t.indexOf("."),r=a===-1?t:t.slice(0,a);if(!Ut.includes(r))return{known:!1,value:void 0};const s=n[r];if(a===-1)return{known:!0,value:s};try{return{known:!0,value:rt(s,t.slice(a+1))}}catch{return{known:!0,value:void 0}}}function ft(t,n){if(typeof t!="string"||t.length===0||!n)return!0;const a=t.startsWith("!"),r=a?t.slice(1):t,s=r.indexOf("!="),i=r.indexOf("=");if(s!==-1||i!==-1&&i!==s+1){const l=s!==-1&&(i===-1||s<i),c=l?s:i,x=r.slice(0,c).trim(),u=r.slice(c+(l?2:1)).trim(),{known:f,value:j}=Ke(x,n);if(!f)return!0;const h=Os(j)===u,g=l?!h:h;return a?!g:g}const{known:d,value:o}=Ke(r,n);return d?a?!Ze(o):Ze(o):!0}function ht(t,n,a){if(!t)return[];const r=t.properties??{},s=new Set(t.required??[]),i={...a??{},resolver:n},d=[];for(const[o,l]of Object.entries(r)){if(!ft(l["x-lt-showIf"],i))continue;const c=pt(n[o],l,s.has(o),!0,i);c&&d.push({field:o,message:c})}return d}function Ds(t){const{mode:n,activeView:a,onActiveViewChange:r,onClaim:s,claimPending:i,workflowType:d,json:o,onResolve:l,resolvePending:c,resolveError:x,requestTriage:u,triageNotes:f,currentRole:j,escalationTargets:h,onEscalate:g,escalatePending:m,escalateError:$,onRelease:k,releasePending:I,onCancel:P,assignedTo:D,assignedUntil:C,onSubmitAttempt:E,onValidationErrors:w,escalationContext:M}=t,O=at(),[A,S]=p.useState("30"),[L,q]=p.useState(0),[b,y]=p.useState(""),[N,T]=p.useState(""),R=A==="custom",U=p.useCallback(_=>q(_),[]);if(n==="terminal")return null;const te=()=>{const _=R?L:parseInt(A);!_||_<=0||s(_)},le=()=>{if(y(""),u){const Y={_lt:{needsTriage:!0}};f.trim()&&(Y.notes=f.trim()),l(Y);return}let _;try{_=JSON.parse(o)}catch{y("Invalid JSON");return}const W=_._form_schema;if(W){const Y=ht(W,_,M);if(Y.length>0){E==null||E(),w==null||w(Y);const ne=Y[0],J=Y.map(G=>G.field.replace(/[_-]/g," ")),me=J.length<=2?J.join(", "):`${J.slice(0,2).join(", ")}...`;y(ne.message==="Required"?`Required: ${me}`:`${ne.message} — ${me}`);return}}const{_form_schema:oe,...se}=_;l(zt(se,W))},V=_=>`text-xs transition-colors ${_?"text-accent font-medium":"text-text-tertiary hover:text-accent"}`;return e.jsxs("div",{className:"shrink-0 h-[80px] bg-surface/95 backdrop-blur-sm border-t border-surface-border -ml-10 pl-10 pr-10 pt-3 pb-5","data-testid":"escalation-action-bar",children:[n==="available"&&e.jsxs("div",{"data-testid":"claim-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[O.map(_=>e.jsx("button",{onClick:()=>{S(_.value),q(0)},className:V(!R&&A===_.value),children:_.label},_.value)),e.jsx("button",{onClick:()=>S("custom"),className:V(R),children:"Other"})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:P,className:"text-xs text-text-tertiary hover:text-status-error transition-colors",children:"Cancel escalation"}),e.jsx("div",{className:"flex-1"}),R&&e.jsx(it,{onChange:U,compact:!0,autoFocus:!0}),e.jsx("button",{onClick:te,disabled:i||R&&L<=0,className:"btn-primary text-xs",children:i?"Claiming...":"Claim"})]})]}),n==="claimed_by_other"&&e.jsxs("div",{className:"flex items-center gap-4","data-testid":"claimed-other-bar",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Claimed by ",e.jsx("span",{className:"font-medium text-text-primary",children:D?e.jsx(ct,{userId:D}):"unknown"})]}),C&&e.jsx(Oe,{until:C})]}),n==="claimed_by_me"&&e.jsxs("div",{"data-testid":"action-bar",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-2",children:[e.jsx("button",{onClick:()=>r("resolve"),className:V(a==="resolve"),children:d?"Resolve":"Acknowledge"}),h.length>0&&e.jsx("button",{onClick:()=>r("escalate"),className:V(a==="escalate"),children:"Escalate"}),e.jsx("button",{onClick:()=>r("release"),className:`text-xs transition-colors ${a==="release"?"text-status-error font-medium":"text-text-tertiary hover:text-status-error"}`,children:"Release"}),e.jsx("button",{onClick:P,className:"text-xs transition-colors text-text-tertiary hover:text-status-error",children:"Cancel"})]}),a==="resolve"&&e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("div",{className:"flex-1"}),b&&e.jsx("span",{className:"text-xs text-status-error",children:b}),x&&e.jsx("span",{className:"text-xs text-status-error",children:x.message}),e.jsx("button",{onClick:le,disabled:c,className:"btn-primary text-xs",children:c?d?"Submitting...":"Acknowledging...":u?"Send to Triage":d?"Submit":"Acknowledge"})]}),a==="escalate"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-text-secondary",children:["From ",e.jsx("span",{className:"font-medium text-text-primary",children:j})," to"]}),e.jsxs("select",{value:N,onChange:_=>T(_.target.value),className:"select text-xs","data-testid":"escalate-select",children:[e.jsx("option",{value:"",children:"Select role..."}),h.map(_=>e.jsx("option",{value:_,children:_},_))]}),e.jsx("div",{className:"flex-1"}),$&&e.jsx("span",{className:"text-xs text-status-error",children:$.message}),e.jsx("button",{onClick:()=>g(N),disabled:!N||m,className:"btn-primary text-xs",children:m?"Escalating...":"Escalate"})]}),a==="release"&&e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-text-secondary",children:"Release back to pool?"}),e.jsx("div",{className:"flex-1"}),e.jsx("button",{onClick:()=>r("resolve"),className:"btn-secondary text-xs",children:"Back"}),e.jsx("button",{onClick:k,disabled:I,className:"btn-primary text-xs bg-status-error hover:bg-status-error/80",children:I?"Releasing...":"Yes, Release"})]})]})]})}function Q(t){return t.replace(/`([^`]+)`/g,'<code class="px-1 py-0.5 bg-surface-sunken rounded text-xs font-mono">$1</code>').replace(/\*\*\*(.+?)\*\*\*/g,"<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/\[([^\]]+)\]\(([^)]+)\)/g,'<a href="$2" class="text-accent-primary hover:underline" target="_blank" rel="noopener noreferrer">$1</a>')}function Ae({content:t,compact:n}){const a=[],r=/^```(\w*)\n([\s\S]*?)^```$/gm;let s=0,i;for(;(i=r.exec(t))!==null;)i.index>s&&a.push({type:"text",text:t.slice(s,i.index)}),a.push({type:"code",lang:i[1],code:i[2].replace(/\n$/,"")}),s=i.index+i[0].length;s<t.length&&a.push({type:"text",text:t.slice(s)});const d=n?{text:"text-xs",heading:"text-xs",list:"text-xs",code:"text-[11px]"}:{text:"text-sm",heading:"text-sm",list:"text-sm",code:"text-xs"},o=[];for(const l of a){if(l.type==="code"){const c=l.code.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");o.push(`<pre class="my-2 p-2.5 bg-surface-sunken rounded-md overflow-x-auto"><code class="${d.code} font-mono text-text-secondary leading-relaxed">${c}</code></pre>`);continue}o.push(...Ss(l.text,d))}return e.jsx("div",{className:"prose-sm",dangerouslySetInnerHTML:{__html:o.join(`
|
|
3
|
-
`)}})}function Ss(t,n){const a=t.split(`
|
|
4
|
-
`),r=[];let s=!1,i=!1,d=[];for(const o of a){const l=o.trim();if(l.startsWith("|")&&l.endsWith("|")){const c=l.slice(1,-1).split("|").map(x=>x.trim());if(c.every(x=>/^[-:]+$/.test(x)))continue;i||(i=!0,d=[]),d.push(c);continue}if(i){i=!1;const[c,...x]=d;r.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const u of c)r.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${Q(u)}</th>`);r.push("</tr></thead><tbody>");for(const u of x){r.push("<tr>");for(const f of u)r.push(`<td class="py-1 px-2 border-b border-border/50">${Q(f)}</td>`);r.push("</tr>")}r.push("</tbody></table></div>"),d=[]}if(!l){s&&(r.push("</ul>"),s=!1);continue}if(l.startsWith("### ")){s&&(r.push("</ul>"),s=!1),r.push(`<h4 class="${n.heading} font-semibold text-text-primary mt-3 mb-1">${Q(l.slice(4))}</h4>`);continue}if(l.startsWith("## ")){s&&(r.push("</ul>"),s=!1),r.push(`<h3 class="${n.heading} font-semibold text-text-primary mt-3 mb-1">${Q(l.slice(3))}</h3>`);continue}if(/^[-*_]{3,}$/.test(l)){s&&(r.push("</ul>"),s=!1),r.push('<hr class="border-border my-3" />');continue}if(/^[-*] /.test(l)){s||(r.push('<ul class="space-y-1 my-1">'),s=!0),r.push(`<li class="${n.list} text-text-secondary flex gap-2"><span class="text-text-tertiary shrink-0">-</span><span>${Q(l.slice(2))}</span></li>`);continue}s&&(r.push("</ul>"),s=!1),r.push(`<p class="${n.text} text-text-secondary my-1">${Q(l)}</p>`)}if(i&&d.length){const[o,...l]=d;r.push('<div class="overflow-x-auto my-2"><table class="text-xs w-full"><thead><tr>');for(const c of o)r.push(`<th class="text-left py-1 px-2 border-b border-border text-text-secondary font-medium">${Q(c)}</th>`);r.push("</tr></thead><tbody>");for(const c of l){r.push("<tr>");for(const x of c)r.push(`<td class="py-1 px-2 border-b border-border/50">${Q(x)}</td>`);r.push("</tr>")}r.push("</tbody></table></div>")}return s&&r.push("</ul>"),r}function Te({children:t}){return e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:t})}function Ps({payload:t,isTerminal:n,resolverPayload:a,onRetryTriage:r,isRetrying:s}){const i=t.title,d=t.summary,o=t.diagnosis,l=t.tool_calls_made,c=t.result,x=a==null?void 0:a._lt,u=(x==null?void 0:x.triaged)===!0,f=x==null?void 0:x.triageWorkflowId,j=n&&u,[h,g]=p.useState(!1);return j?e.jsxs("div",{className:"rounded-md border border-status-success/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-success shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm3.36 4.65a.5.5 0 00-.72 0L7 9.29 5.36 7.65a.5.5 0 10-.72.7l2 2a.5.5 0 00.72 0l4-4a.5.5 0 000-.7z"})}),e.jsx("span",{className:"text-xs font-medium text-status-success",children:"Resolved by AI Triage"})]}),typeof l=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-success/10 text-status-success",children:[l," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[i&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:i}),o&&e.jsxs("div",{children:[e.jsx(Te,{children:"Triage diagnosis"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(Ae,{content:o})})]}),e.jsx("div",{className:"flex items-center gap-3",children:f&&e.jsx(je,{to:`/workflows/executions/${f}`,className:"text-[10px] text-accent hover:underline",children:"View triage execution"})})]})]}):e.jsxs("div",{className:"rounded-md border border-status-warning/30 bg-surface-raised",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("svg",{className:"w-4 h-4 text-status-warning shrink-0",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 1a7 7 0 110 14A7 7 0 018 1zm0 3a.75.75 0 00-.75.75v3.5a.75.75 0 001.5 0v-3.5A.75.75 0 008 4zm0 7a.75.75 0 100-1.5.75.75 0 000 1.5z"})}),e.jsx("span",{className:"text-xs font-medium text-status-warning",children:"Tool Rounds Exhausted"})]}),typeof l=="number"&&e.jsxs("span",{className:"text-[10px] font-mono px-2 py-0.5 rounded-full bg-status-warning/10 text-status-warning",children:[l," tool calls used"]})]}),e.jsxs("div",{className:"px-4 py-4 space-y-4",children:[i&&e.jsx("p",{className:"text-sm font-medium text-text-primary",children:i}),d&&e.jsxs("div",{children:[e.jsx(Te,{children:"What happened"}),e.jsx("div",{className:"text-xs text-text-secondary leading-relaxed",children:e.jsx(Ae,{content:d})})]}),o&&e.jsxs("div",{children:[e.jsx(Te,{children:"What went wrong"}),e.jsx("div",{className:"text-xs text-text-primary leading-relaxed",children:e.jsx(Ae,{content:o})})]}),c!=null&&e.jsxs("div",{children:[e.jsxs("button",{onClick:()=>g(!h),className:"flex items-center gap-1 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary hover:text-text-secondary transition-colors",children:[e.jsx("svg",{className:`w-3 h-3 transition-transform ${h?"rotate-90":""}`,viewBox:"0 0 12 12",fill:"currentColor",children:e.jsx("path",{d:"M4.5 2l4 4-4 4"})}),"Partial results"]}),h&&e.jsx("div",{className:"mt-2",children:e.jsx(ue,{data:c,defaultMode:"tree"})})]}),r&&!n&&e.jsx("div",{className:"pt-2",children:e.jsxs("button",{onClick:r,disabled:s,className:"inline-flex items-center gap-2 px-4 py-2 text-xs font-medium bg-accent text-text-inverse rounded-md hover:bg-accent/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:[e.jsx("svg",{className:"w-3.5 h-3.5",viewBox:"0 0 14 14",fill:"currentColor",children:e.jsx("path",{d:"M7 1a6 6 0 100 12A6 6 0 007 1zm2.5 6.5l-3.5 2V5.5l3.5 2z"})}),s?"Sending to triage...":"Retry with AI Triage"]})})]})]})}function et(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function gt({src:t,escalation:n,schema:a,onResolve:r,onEscalate:s,submitAttempted:i,fill:d}){const o=p.useRef(null),l=p.useRef("");p.useEffect(()=>{try{const x=new URL(t);l.current=x.origin}catch{l.current=""}},[t]);const c=p.useCallback(()=>{const x=o.current;if(!(x!=null&&x.contentWindow)||!l.current)return;const f={type:"lt:init",escalation:{id:n.id,type:n.type,subtype:n.subtype,description:n.description,status:n.status,priority:n.priority,role:n.role,workflow_type:n.workflow_type,envelope:et(n.envelope),metadata:n.metadata??null,escalation_payload:et(n.escalation_payload)},schema:a};x.contentWindow.postMessage(f,l.current)},[n,a]);return p.useEffect(()=>{const x=u=>{if(u.origin!==l.current)return;const f=u.data;if(!(!f||typeof f!="object"||typeof f.type!="string"))switch(f.type){case"lt:ready":c();break;case"lt:submit":f.payload&&typeof f.payload=="object"&&r(f.payload);break;case"lt:escalate":typeof f.target=="string"&&f.target&&s(f.target);break;case"lt:resize":{const j=o.current;j&&typeof f.height=="number"&&f.height>0&&(j.style.height=`${Math.min(f.height,2e3)}px`);break}}};return window.addEventListener("message",x),()=>window.removeEventListener("message",x)},[c,r,s]),p.useEffect(()=>{if(!i)return;const x=o.current;x!=null&&x.contentWindow&&l.current&&x.contentWindow.postMessage({type:"lt:validate"},l.current)},[i]),d?e.jsx("div",{className:"absolute inset-0 overflow-hidden",children:e.jsx("iframe",{ref:o,src:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads",className:"w-full h-full border-0 block",title:"HITL Viewport",onLoad:c})}):e.jsx("div",{className:"rounded-md border border-surface-border overflow-hidden bg-white",children:e.jsx("iframe",{ref:o,src:t,sandbox:"allow-scripts allow-same-origin allow-forms allow-pointer-lock allow-downloads",className:"w-full border-0",style:{minHeight:"600px"},title:"HITL Viewport",onLoad:c})})}function Ls({fieldKey:t,value:n,onChange:a,schema:r}){const s=p.useRef(null),i=(r==null?void 0:r.accept)??void 0,d=t.replace(/[_-]/g," "),o=r==null?void 0:r.description,l=p.useCallback(x=>{var j;const u=(j=x.target.files)==null?void 0:j[0];if(!u)return;const f=new FileReader;f.onload=()=>{typeof f.result=="string"&&a(f.result)},f.readAsDataURL(u)},[a]),c=n.startsWith("data:");return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:d}),o&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:o}),e.jsxs("div",{className:"mt-1",children:[e.jsx("input",{ref:s,type:"file",accept:i,onChange:l,className:"hidden"}),e.jsx("button",{type:"button",onClick:()=>{var x;return(x=s.current)==null?void 0:x.click()},className:"btn-secondary text-xs px-3 py-1.5",children:c?"Replace file":"Choose file"}),c&&e.jsx("span",{className:"ml-2 text-xs text-status-success",children:"File attached"})]})]})}function Ws({fieldKey:t,value:n,onChange:a,schema:r}){const s=t.replace(/[_-]/g," "),i=r==null?void 0:r.description,d=(r==null?void 0:r["x-lt-language"])??"",o=p.useCallback(l=>{if(l.key==="Tab"){l.preventDefault();const c=l.currentTarget,x=c.selectionStart,u=c.selectionEnd,f=n.substring(0,x)+" "+n.substring(u);a(f),requestAnimationFrame(()=>{c.selectionStart=c.selectionEnd=x+2})}},[n,a]);return e.jsxs("div",{children:[e.jsxs("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:[s,d&&e.jsx("span",{className:"ml-2 text-text-tertiary/60 normal-case font-normal",children:d})]}),i&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:i}),e.jsx("textarea",{value:n,onChange:l=>a(l.target.value),onKeyDown:o,className:"input w-full mt-1 font-mono text-xs leading-relaxed",rows:10,spellCheck:!1})]})}function Fs({fieldKey:t,value:n,onChange:a,schema:r}){const s=p.useRef(null),[i,d]=p.useState(!1),o=t.replace(/[_-]/g," "),l=r==null?void 0:r.description;p.useEffect(()=>{const h=s.current;if(!h)return;const g=h.getContext("2d");if(g&&(g.lineWidth=2,g.lineCap="round",g.strokeStyle="#1E1535",n&&n.startsWith("data:"))){const m=new Image;m.onload=()=>g.drawImage(m,0,0),m.src=n}},[]);const c=p.useCallback(h=>{const m=s.current.getBoundingClientRect();return"touches"in h?{x:h.touches[0].clientX-m.left,y:h.touches[0].clientY-m.top}:{x:h.clientX-m.left,y:h.clientY-m.top}},[]),x=p.useCallback(h=>{var $;d(!0);const g=($=s.current)==null?void 0:$.getContext("2d");if(!g)return;const m=c(h);g.beginPath(),g.moveTo(m.x,m.y)},[c]),u=p.useCallback(h=>{var $;if(!i)return;const g=($=s.current)==null?void 0:$.getContext("2d");if(!g)return;const m=c(h);g.lineTo(m.x,m.y),g.stroke()},[i,c]),f=p.useCallback(()=>{d(!1);const h=s.current;h&&a(h.toDataURL("image/png"))},[a]),j=p.useCallback(()=>{const h=s.current;if(!h)return;const g=h.getContext("2d");g&&(g.clearRect(0,0,h.width,h.height),a(""))},[a]);return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:o}),l&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:l}),e.jsx("div",{className:"mt-1 border border-surface-border rounded-md overflow-hidden bg-white",children:e.jsx("canvas",{ref:s,width:400,height:150,className:"w-full cursor-crosshair touch-none",onMouseDown:x,onMouseMove:u,onMouseUp:f,onMouseLeave:f,onTouchStart:x,onTouchMove:u,onTouchEnd:f})}),e.jsx("button",{type:"button",onClick:j,className:"mt-1 text-[10px] text-text-tertiary hover:text-accent transition-colors",children:"Clear"})]})}function qs({fieldKey:t,value:n,onChange:a,schema:r}){const s=t.replace(/[_-]/g," "),i=r==null?void 0:r.description;return e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:s}),i&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:i}),e.jsx("textarea",{value:n,onChange:d=>a(d.target.value),className:"input w-full mt-1 text-sm leading-relaxed",rows:8,placeholder:"Supports plain text. Markdown formatting is preserved."})]})}function Vs({fieldKey:t,value:n,onChange:a,schema:r}){const[s,i]=p.useState("write"),d=t.replace(/[_-]/g," "),o=r==null?void 0:r.description;return(r==null?void 0:r.readOnly)===!0?e.jsx(Me,{content:n,className:"my-1"}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:d}),e.jsx("div",{className:"flex items-center gap-0.5",children:["write","preview"].map(c=>e.jsx("button",{type:"button",onClick:()=>i(c),className:`px-2 py-0.5 text-[10px] rounded transition-colors ${s===c?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:c==="write"?"Write":"Preview"},c))})]}),o&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:o}),s==="write"?e.jsx("textarea",{value:n,onChange:c=>a(c.target.value),className:"input w-full mt-1 text-sm font-mono leading-relaxed",rows:10,placeholder:"Write markdown — headings, lists, tables, code blocks, and links all render."}):e.jsx("div",{className:"mt-1 px-3 py-2 border border-surface-border rounded min-h-[120px]",children:n.trim()?e.jsx(Me,{content:n}):e.jsx("p",{className:"text-xs text-text-quaternary italic",children:"Nothing to preview."})})]})}function Js({fieldKey:t,value:n,onChange:a,schema:r,escalationContext:s,isRequired:i,submitAttempted:d,error:o}){const l=r==null?void 0:r["x-lt-source"],c=(r==null?void 0:r["x-lt-require-all"])===!0,x=[];if(l&&s){const m=l.indexOf(".");if(m!==-1){const $=l.slice(0,m),k=l.slice(m+1);try{const I=rt(s[$],k);Array.isArray(I)&&x.push(...I)}catch{}}}let u={};try{n&&(u=JSON.parse(n))}catch{}const f=m=>a(JSON.stringify({...u,[m]:!u[m]}));if(x.length===0)return e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"No checklist items. Provide checklist_items in the escalation envelope or metadata."}),o&&e.jsx("p",{className:"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:o})]});const j=x.filter(m=>u[m.id]).length,h=(r==null?void 0:r.description)||"Checklist",g=(x.find(m=>!u[m.id]&&m.required!==!1)??x[0]).id;return e.jsxs("div",{role:"group","aria-label":h,"aria-required":i||void 0,"aria-invalid":o?!0:void 0,children:[e.jsx("div",{className:"space-y-2.5 mt-1",children:x.map(m=>{const $=u[m.id]??!1,k=!$&&!!d&&(c?m.required!==!1:j===0&&(m.required||i));return e.jsxs("label",{className:`flex items-start gap-3 cursor-pointer group select-none rounded px-2 py-1 -mx-2 transition-colors ${k?"bg-status-error/5":"hover:bg-surface-hover"}`,children:[e.jsx("input",{type:"checkbox",checked:$,onChange:()=>f(m.id),className:`mt-0.5 w-3.5 h-3.5 shrink-0 rounded ${k?"accent-status-error":"accent-accent"}`,"data-testid":`checklist-item-${m.id}`,...m.id===g?{"data-field-key":t}:{}}),e.jsxs("span",{className:`text-sm leading-snug transition-colors ${k?"text-status-error":"text-text-secondary group-hover:text-text-primary"}`,children:[m.label,m.required&&e.jsx("span",{className:`ml-0.5 text-[10px] ${k?"text-status-error":"text-text-quaternary"}`,children:"*"})]})]},m.id)})}),e.jsxs("p",{className:"text-[10px] text-text-quaternary mt-3 tabular-nums",children:[j," / ",x.length," confirmed",c?e.jsxs("span",{className:"ml-1 text-text-quaternary/60",children:["(all required",x.some(m=>m.required===!1)?" except optional":"",")"]}):i&&j===0&&!!d&&e.jsx("span",{className:"ml-1 text-text-quaternary/60",children:"(at least one required)"})]}),o&&e.jsx("p",{role:"alert",className:"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:o})]})}const Hs=/\.(png|jpe?g|gif|webp|avif|bmp|svg)(\?.*)?$/i;function Us(t){var r,s,i,d;const n=t.trim();if(!n)return{kind:"none"};const a=(s=(r=/^data:([^;,]+)[;,]/.exec(n))==null?void 0:r[1])==null?void 0:s.toLowerCase();if(a)return a.startsWith("image/")?{kind:"image",src:n}:{kind:"file",href:n,label:a==="application/pdf"?"PDF":a,isData:!0};if(/^https?:\/\//i.test(n)){if(Hs.test(n))return{kind:"image",src:n};const o=(d=(i=/\.([a-z0-9]{2,5})(\?.*)?$/i.exec(n))==null?void 0:i[1])==null?void 0:d.toUpperCase();return{kind:"file",href:n,label:o??"attachment",isData:!1}}return{kind:"none"}}function tt({fieldKey:t,value:n,schema:a}){const[r,s]=p.useState(!1),i=Us(n??""),d=t.replace(/[_-]/g," "),o=a==null?void 0:a.description,l=e.jsxs(e.Fragment,{children:[e.jsx("label",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:d}),o&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:o})]});return i.kind==="none"?e.jsxs("div",{children:[l,e.jsx("p",{className:"text-xs text-text-quaternary italic mt-1",children:"No attachment"})]}):i.kind==="image"?e.jsxs("div",{children:[l,e.jsxs("div",{className:"mt-1",children:[e.jsx("button",{type:"button",onClick:()=>s(!0),className:"block rounded-[0.125em] border border-surface-border overflow-hidden hover:border-accent transition-colors",title:"View full size",children:e.jsx("img",{src:i.src,alt:t.replace(/[_-]/g," "),className:"max-h-48 max-w-full object-contain","data-testid":`attachment-image-${t}`})}),r&&e.jsx("div",{className:"fixed inset-0 z-[100] bg-text-primary/60 backdrop-blur-sm flex items-center justify-center p-8 cursor-zoom-out",onClick:()=>s(!1),role:"dialog","aria-modal":"true","aria-label":`${d} — full size`,children:e.jsx("img",{src:i.src,alt:d,className:"max-h-[90vh] max-w-[90vw] object-contain"})})]})]}):e.jsxs("div",{children:[l,e.jsx("div",{className:"mt-1",children:e.jsxs("a",{href:i.href,...i.isData?{download:`${t}.${i.label==="PDF"?"pdf":"bin"}`}:{target:"_blank",rel:"noopener noreferrer"},className:"inline-flex items-center gap-1.5 text-xs text-accent hover:text-accent-hover transition-colors","data-testid":`attachment-link-${t}`,children:[e.jsx(ds,{className:"w-3.5 h-3.5",strokeWidth:1.5}),i.isData?`Download ${i.label}`:`Open ${i.label}`,i.isData?e.jsx(xs,{className:"w-3 h-3",strokeWidth:1.5}):e.jsx(us,{className:"w-3 h-3",strokeWidth:1.5})]})})]})}const st={"file-upload":Ls,"code-editor":Ws,signature:Fs,"rich-text":qs,markdown:Vs,checklist:Js,attachment:tt,image:tt};function jt({value:t,onChange:n,disabled:a,submitAttempted:r,escalationContext:s}){var L,q;const[i,d]=p.useState({}),[o,l]=p.useState({}),[c,x]=p.useState(null),[u,f]=p.useState(!1),[j,h]=p.useState(new Set);p.useEffect(()=>{try{const b=JSON.parse(t);if(typeof b=="object"&&b!==null&&!Array.isArray(b)){const y={},N={};for(const[T,R]of Object.entries(b))T.startsWith("_")?N[T]=R:y[T]=R;d(y),l(N),x(N._form_schema&&typeof N._form_schema=="object"?N._form_schema:null),f(!1)}}catch{f(!0)}},[t]);const g=p.useCallback(b=>{d(b),n(JSON.stringify({...b,...o},null,2))},[o,n]),m=p.useCallback((b,y)=>{g({...i,[b]:y})},[i,g]),$=p.useCallback(b=>{h(y=>{if(y.has(b))return y;const N=new Set(y);return N.add(b),N})},[]);if(u)return e.jsx("p",{className:"text-xs text-status-error",children:"Unable to parse resolver data as form. Use the JSON editor below."});const k=Object.entries(i);if(k.length===0)return e.jsx("p",{className:"text-xs text-text-tertiary italic",children:"No resolver fields defined."});const I=c==null?void 0:c["x-lt-order"],P=I?[...k].sort((b,y)=>{const N=I.indexOf(b[0]),T=I.indexOf(y[0]);return(N===-1?1/0:N)-(T===-1?1/0:T)}):k,D={...s??{},resolver:i},C=P.filter(([b,y])=>{var T;const N=(T=c==null?void 0:c.properties)==null?void 0:T[b];return!(!ft(N==null?void 0:N["x-lt-showIf"],D)||(N==null?void 0:N["x-lt-hide-if-empty"])===!0&&(y==null||y===""||y===!1||y===0))}),E=new Set((c==null?void 0:c.required)??[]),w=c==null?void 0:c["x-lt-layout"],M=c==null?void 0:c.title,O=c==null?void 0:c.description,A=[];for(const b of C){const[y]=b,N=(L=c==null?void 0:c.properties)==null?void 0:L[y],T=((q=N==null?void 0:N["x-lt-section"])==null?void 0:q.trim())||null,R=A[A.length-1];!R||R.name!==T?A.push({name:T,entries:[b]}):R.entries.push(b)}const S=b=>b.map(([y,N])=>{var _;const T=(_=c==null?void 0:c.properties)==null?void 0:_[y],R=(T==null?void 0:T.readOnly)===!0,U=(T==null?void 0:T["x-lt-span"])??1,te=E.has(y),le=j.has(y)||!!r,V=pt(N,T,te,le,D);return e.jsx("div",{className:`animate-[field-enter_0.2s_ease-out] ${w==="two-column"&&U>=2?"col-span-2":""}`,children:e.jsx(bt,{fieldKey:y,value:N,onChange:W=>m(y,W),onBlur:()=>$(y),schema:c,isRequired:te,isReadOnly:R,error:V,escalationContext:D,submitAttempted:!!r})},y)});return e.jsxs("div",{className:`pb-8 ${a?"opacity-60 pointer-events-none":""}`,inert:a||void 0,"aria-disabled":a||void 0,children:[M&&e.jsx("h3",{className:"text-lg font-light text-text-primary mb-1",children:M}),O&&e.jsx("p",{className:"text-sm text-text-secondary leading-relaxed mb-6",children:O}),e.jsx("div",{className:"space-y-10",children:A.map((b,y)=>e.jsxs("div",{className:b.name?"border-l-2 border-accent/30 bg-surface-sunken/80 rounded-[0.125em] p-4 animate-[section-enter_0.25s_ease-out]":"",children:[b.name&&e.jsxs("div",{className:"mb-5 flex items-center gap-2",children:[e.jsx(dt,{className:"w-3.5 h-3.5 text-accent/50 shrink-0",strokeWidth:1.5}),e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:b.name})]}),w==="two-column"?e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-x-14 gap-y-6",children:S(b.entries)}):e.jsx("div",{className:"space-y-6",children:S(b.entries)})]},b.name??`__s${y}`))})]})}function bt({fieldKey:t,value:n,onChange:a,onBlur:r,schema:s,isRequired:i,isReadOnly:d,error:o,escalationContext:l,submitAttempted:c}){var D;const x=t.replace(/[_-]/g," "),u=(D=s==null?void 0:s.properties)==null?void 0:D[t],f=u==null?void 0:u["x-lt-widget"],j=`lt-field-${t}`,h=`${j}-error`,g=`${j}-help`,m=typeof(u==null?void 0:u.description)=="string"&&u.description.length>0,k={id:j,"aria-required":i||void 0,"aria-invalid":o?!0:void 0,"aria-describedby":o?h:m?g:void 0};if(d&&!(f==="markdown"&&typeof n=="string")&&!((f==="attachment"||f==="image")&&typeof n=="string")){const C=n===null?"null":typeof n=="object"?JSON.stringify(n,null,2):String(n);return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,children:x}),e.jsx("p",{className:"text-sm text-text-secondary mt-0.5 whitespace-pre-wrap",children:C})]})}if(f&&f in st){const C=st[f],E={fieldKey:t,schema:u,escalationContext:l,isRequired:i,submitAttempted:c,error:o};if(typeof n=="string")return e.jsx(C,{...E,value:n,onChange:w=>a(w)});if(typeof n=="object"&&n!==null&&!Array.isArray(n))return e.jsx(C,{...E,value:JSON.stringify(n),onChange:w=>{try{a(JSON.parse(w))}catch{a(w)}}})}if(typeof n=="boolean")return e.jsxs("div",{children:[e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:n,onChange:C=>{a(C.target.checked),r==null||r()},className:"w-3.5 h-3.5 rounded accent-accent","data-field-key":t,...k}),e.jsxs("span",{className:"text-[11px] font-semibold uppercase tracking-wider text-text-secondary",children:[x,i&&e.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})]}),e.jsx(ee,{error:o,id:h})]});if(typeof n=="number")return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),e.jsx("input",{type:"number",value:n,onChange:C=>a(parseFloat(C.target.value)||0),onBlur:r,step:"any","data-field-key":t,className:de(!!o),...k}),e.jsx(ee,{error:o,id:h})]});if(typeof n=="string"){const C=(u==null?void 0:u.format)==="password",E=u==null?void 0:u.enum,w=u==null?void 0:u.description;if(E!=null&&E.length)return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),w&&e.jsx("p",{id:g,className:"text-[10px] text-text-tertiary mt-0.5",children:w}),e.jsx("select",{value:n,onChange:A=>a(A.target.value),onBlur:r,"data-field-key":t,className:zs(!!o),...k,children:E.map(A=>e.jsx("option",{value:A,children:A},A))}),e.jsx(ee,{error:o,id:h})]});if(C)return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),w&&e.jsx("p",{id:g,className:"text-[10px] text-text-tertiary mt-0.5",children:w}),e.jsx("input",{type:"password",value:n,onChange:A=>a(A.target.value),onBlur:r,"data-field-key":t,className:de(!!o),autoComplete:"off",...k}),e.jsx(ee,{error:o,id:h})]});const M=u==null?void 0:u.format,O={date:"date","date-time":"datetime-local",email:"email",uri:"url"};if(M&&M in O)return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),w&&e.jsx("p",{id:g,className:"text-[10px] text-text-tertiary mt-0.5",children:w}),e.jsx("input",{type:O[M],value:n,onChange:A=>a(A.target.value),onBlur:r,"data-field-key":t,className:de(!!o),...k}),e.jsx(ee,{error:o,id:h})]});if(M==="textarea"||n.length>80){const A=u==null?void 0:u.maxLength,S=u==null?void 0:u["x-lt-max-length"];let L=A;if(L===void 0&&S&&l){const b=S.indexOf(".");if(b!==-1){const y=S.slice(0,b),N=S.slice(b+1),T=l[y];if(T&&typeof T=="object"){let R=T;for(const U of N.split("."))if(R=R[U],R===void 0)break;if(typeof R=="number")L=R;else if(typeof R=="string"){const U=Number(R);Number.isNaN(U)||(L=U)}}}}const q=L!==void 0&&n.length>L;return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),w&&e.jsx("p",{id:g,className:"text-[10px] text-text-tertiary mt-0.5",children:w}),e.jsx("textarea",{value:n,onChange:b=>{a(b.target.value),r==null||r()},onBlur:r,"data-field-key":t,className:`${de(!!o)} leading-relaxed`,rows:Math.min(6,Math.max(3,Math.ceil(n.length/60))),...k}),L!==void 0&&e.jsxs("p",{className:`text-[10px] mt-0.5 text-right tabular-nums ${q?"text-status-error font-medium":"text-text-quaternary"}`,children:[n.length," / ",L]}),e.jsx(ee,{error:o,id:h})]})}return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,htmlFor:j,children:x}),w&&e.jsx("p",{id:g,className:"text-[10px] text-text-tertiary mt-0.5",children:w}),e.jsx("input",{type:"text",value:n,onChange:A=>a(A.target.value),onBlur:r,"data-field-key":t,className:de(!!o),...k}),e.jsx(ee,{error:o,id:h})]})}if(n===null)return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,children:x}),e.jsx("p",{className:"text-xs text-text-tertiary italic mt-1",children:"null"})]});if(Array.isArray(n))return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,children:x}),e.jsx("div",{className:"flex flex-wrap gap-1.5 mt-1",children:n.map((C,E)=>e.jsx("span",{className:"px-2 py-0.5 text-[11px] font-mono bg-surface-sunken rounded text-text-secondary",children:String(C)},E))})]});if(typeof n=="object"){const C=Object.entries(n);return e.jsxs("div",{children:[e.jsx(z,{isRequired:i,children:x}),e.jsx("div",{className:"ml-4 mt-2 pl-4 border-l border-accent-faint space-y-3",children:C.map(([E,w])=>e.jsx(bt,{fieldKey:E,value:w,onChange:M=>a({...n,[E]:M})},E))})]})}return null}function z({children:t,isRequired:n,htmlFor:a}){return e.jsxs("label",{htmlFor:a,className:"text-[11px] font-semibold uppercase tracking-wider text-text-secondary",children:[t,n&&e.jsx("span",{className:"text-status-error ml-0.5",children:"*"})]})}function ee({error:t,id:n}){return t?e.jsx("p",{id:n,role:"alert",className:"text-[10px] text-status-error mt-1 animate-[field-error-in_0.3s_ease-out]",children:t}):null}function de(t){return t?"input text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"input text-sm w-full mt-1"}function zs(t){return t?"select text-sm w-full mt-1 border-status-error/50 focus:border-status-error animate-[field-shake_0.4s_ease-in-out]":"select text-sm w-full mt-1"}function Ys({json:t,onJsonChange:n,requestTriage:a,onRequestTriageChange:r,triageNotes:s,onTriageNotesChange:i,disabled:d=!1,submitAttempted:o=!1,showTriage:l=!1,escalationContext:c}){return e.jsxs(e.Fragment,{children:[l&&e.jsx("div",{className:"flex items-center justify-between mb-3",children:a?e.jsxs("button",{onClick:()=>r(!1),className:"group flex items-center gap-2 text-left","data-testid":"triage-cancel",children:[e.jsx("span",{className:"flex items-center justify-center w-5 h-5 rounded-full bg-accent/10 text-accent shrink-0",children:e.jsx("svg",{className:"w-3 h-3",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})})}),e.jsxs("span",{className:"text-xs text-text-secondary group-hover:text-text-primary transition-colors",children:["AI Triage active."," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Cancel"})]})]}):e.jsxs("button",{onClick:()=>r(!0),className:"group flex items-center gap-2.5 text-left my-4","data-testid":"triage-callout",children:[e.jsx("span",{className:"flex items-center justify-center w-6 h-6 rounded-full bg-accent/10 text-accent shrink-0 animate-[triage-glow_6s_ease-in-out_infinite]",children:e.jsx("svg",{className:"w-3.5 h-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.663 17h4.674M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"})})}),e.jsxs("span",{className:"text-[13px] text-text-secondary group-hover:text-text-primary transition-colors",children:["This form doesn't capture the issue?"," ",e.jsx("span",{className:"text-accent group-hover:underline",children:"Request AI Triage"})]})]})}),e.jsxs("div",{className:"relative min-h-[200px]",children:[e.jsx("div",{className:a?"pointer-events-none select-none":"",children:e.jsx(jt,{value:t,onChange:n,disabled:d,submitAttempted:o,escalationContext:c})}),a&&e.jsxs("div",{className:"absolute inset-0 z-10 flex flex-col bg-surface/90 backdrop-blur-[2px] rounded-md border border-accent/20 p-5","data-testid":"triage-overlay",children:[e.jsx("p",{className:"text-xs text-text-secondary mb-3 leading-relaxed",children:"The resolution form will not be submitted. Describe the issue so AI triage can diagnose and fix it using available tools. The corrected result will come back as a new escalation for your review."}),e.jsx("textarea",{value:s,onChange:x=>i(x.target.value),placeholder:"e.g. Content is in Spanish — needs translation to English before review...",className:"input text-xs w-full flex-1 min-h-[80px] resize-none",autoFocus:!0,"data-testid":"triage-notes"})]})]})]})}function yt(t,n){if(!t.includes("{"))return t;try{const a=s=>{if(!s)return{};try{return JSON.parse(s)}catch{return{}}},r={...n.metadata??{},...a(n.envelope),...a(n.escalation_payload)};return t.replace(/\{([^}]+)\}/g,(s,i)=>Object.prototype.hasOwnProperty.call(r,i)?String(r[i]):`{${i}}`)}catch{return t}}function nt(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function Ie(t){return{escalation:t,metadata:t.metadata??null,envelope:nt(t.envelope),payload:nt(t.escalation_payload),resolver:null}}function Gs({isRoundsExhausted:t,payloadObj:n,isTerminal:a,resolverPayload:r,onRetryTriage:s,isRetrying:i}){return e.jsxs(e.Fragment,{children:[t&&n&&e.jsx("div",{className:"mt-8",children:e.jsx(Ps,{payload:n,isTerminal:a,resolverPayload:r,onRetryTriage:s,isRetrying:i})}),(n==null?void 0:n.category)==="missing_credential"&&e.jsxs("div",{className:"mt-8 bg-status-warning/10 border border-status-warning/30 rounded-md px-5 py-4 flex items-start gap-3",children:[e.jsx(Ye,{size:20,className:"text-status-warning mt-0.5 shrink-0"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-text-primary mb-1",children:"Missing Credential"}),e.jsxs("p",{className:"text-xs text-text-secondary mb-3",children:["This workflow requires a ",e.jsx("span",{className:"font-medium capitalize",children:String(n.provider)})," credential to continue. Register one and then resolve this escalation to retry."]}),e.jsxs(je,{to:"/credentials",className:"btn-primary text-xs inline-flex items-center gap-1.5",children:[e.jsx(Ye,{size:12}),"Go to Credentials"]})]})]})]})}function Bs({esc:t,resolverPayload:n,isTerminal:a,claimedByMe:r,activeView:s,metadataFormSchema:i,effectiveSchema:d,json:o,onJsonChange:l,requestTriage:c,onRequestTriageChange:x,triageNotes:u,onTriageNotesChange:f,onResolve:j,onEscalate:h,onClaim:g,submitAttempted:m,isCertified:$,hasAI:k}){const I=d,P=Ie(t);if(a){if(n==null)return null;const w=typeof n=="object"&&n!==null?n:{},M=d??i,O=M!=null&&M.properties?{...lt(w,M),_form_schema:M}:w;return e.jsx("div",{className:"mt-8 pt-6",children:e.jsx(jt,{value:JSON.stringify(O,null,2),onChange:()=>{},disabled:!0,escalationContext:P})})}if(s!=="resolve"||!(t.workflow_type||d))return null;const D=I==null?void 0:I["x-lt-viewport"],C=(D==null?void 0:D.type)==="iframe"&&!!D.src&&j&&h;if(C&&!r)return e.jsxs("button",{onClick:()=>g==null?void 0:g(),disabled:!g,className:"flex flex-col items-center justify-center min-h-[55vh] w-full gap-3 text-center group disabled:opacity-50 disabled:cursor-default",children:[e.jsx(ms,{className:"w-10 h-10 text-text-tertiary group-hover:text-accent transition-colors",strokeWidth:1}),e.jsx("p",{className:"text-base font-medium text-text-primary group-hover:text-accent transition-colors",children:"Claim to launch the editor"})]});const E=C?yt(D.src,t):"";return e.jsx("div",{className:"mt-8 pt-6",children:C?e.jsx(gt,{src:E,escalation:t,schema:I,onResolve:j,onEscalate:h,submitAttempted:m}):e.jsx(Ys,{json:o,onJsonChange:l,requestTriage:c,onRequestTriageChange:x,triageNotes:u,onTriageNotesChange:f,disabled:!r,submitAttempted:m,showTriage:!!$&&!!k,escalationContext:P})})}function Xs({open:t,assignedUntil:n,onClose:a,onExtend:r,isPending:s}){const i=at(),[d,o]=p.useState("30"),[l,c]=p.useState(0),x=d==="custom",u=x?l:parseInt(d),f=p.useCallback(j=>c(j),[]);return e.jsx(gs,{open:t,onClose:a,title:"Claim Expiring",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-sm text-text-secondary",children:["Your claim on this escalation expires in"," ",e.jsx(Oe,{until:n}),". When it lapses, the form locks and the item returns to the queue — your edits are kept as a draft. Extend to keep working."]}),e.jsxs("select",{value:d,onChange:j=>{o(j.target.value),c(0)},className:"select w-full text-sm","aria-label":"Extension duration",children:[i.map(j=>e.jsx("option",{value:j.value,children:j.label},j.value)),e.jsx("option",{value:"custom",children:"Other..."})]}),x&&e.jsx(it,{onChange:f,autoFocus:!0}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:a,className:"btn-secondary text-xs",children:"Dismiss"}),e.jsx("button",{onClick:()=>r(u),className:"btn-primary text-xs",disabled:s||!u||u<=0,children:s?"Extending...":"Extend Claim"})]})]})})}const Qs=9e4;function Zs(t,n=Qs){const[,a]=p.useState(0);if(p.useEffect(()=>{if(!t)return;const s=new Date(t).getTime()-Date.now();if(s<=0)return;const i=()=>a(l=>l+1),d=[],o=s-n;return o>0&&d.push(window.setTimeout(i,o)),d.push(window.setTimeout(i,s)),()=>d.forEach(l=>window.clearTimeout(l))},[t,n]),!t)return{expired:!1,expiringSoon:!1,msRemaining:0};const r=Math.max(0,new Date(t).getTime()-Date.now());return{expired:r<=0,expiringSoon:r>0&&r<=n,msRemaining:r}}const Ks="lt:escalation:draft:";function De(t){return`${Ks}${t}`}function en(t){try{return localStorage.getItem(De(t))}catch{return null}}function tn(t,n){try{localStorage.setItem(De(t),n)}catch{}}function $e(t){try{localStorage.removeItem(De(t))}catch{}}const Nt="lt:escalation:panel:open";function sn(){try{const t=localStorage.getItem(Nt);return t===null?!0:t==="true"}catch{return!0}}function Re(t){try{localStorage.setItem(Nt,String(t))}catch{}}function xe(t){if(!t)return null;try{return JSON.parse(t)}catch{return t}}function wn(){var We,Fe,qe,Ve;const{id:t}=hs(),{user:n}=Mt(),a=ut(),r=Rt(),{data:s,isLoading:i,refetch:d,isFetching:o}=It(t);Qt(t);const l=Ot(),c=Dt(),x=St(),u=Pt(),[f,j]=p.useState(!1),{data:h}=Lt((s==null?void 0:s.role)??""),{data:g}=Xt(),{data:m}=Wt(),{isBuilder:$}=Ft(),k=g==null?void 0:g.find(v=>v.workflow_type===(s==null?void 0:s.workflow_type)),I=((We=m==null?void 0:m.telemetry)==null?void 0:We.traceUrl)??null,[P,D]=p.useState("resolve"),[C,E]=p.useState("{}"),[w,M]=p.useState(sn),[O,A]=p.useState(!1),[S,L]=p.useState(""),[q,b]=p.useState(!1),[y,N]=p.useState([]),[T,R]=p.useState(void 0),U=Zs(s==null?void 0:s.assigned_until),[te,le]=p.useState(null);p.useEffect(()=>{if(!(!q||!s))try{const v=JSON.parse(C),F=v._form_schema;if(!F){N([]);return}N(ht(F,v,Ie(s)))}catch{}},[C,q,s]);const V=((Fe=s==null?void 0:s.metadata)==null?void 0:Fe.form_schema)??null,_=(s==null?void 0:s.form_schema)??(k==null?void 0:k.resolver_schema)??null,W=V??_,oe=p.useRef(!1),se=p.useRef(null);p.useEffect(()=>{if(oe.current)return;const v=V??(_!=null&&_.properties?_:null);if(v!=null&&v.properties){oe.current=!0;const F=xe(s==null?void 0:s.envelope),ae=F==null?void 0:F.formDefaults,we={...(s==null?void 0:s.metadata)??{},...typeof ae=="object"&&ae!==null?ae:{}},ke=lt(we,v),Je={_form_schema:v};for(const[Ue,Tt]of Object.entries(v.properties)){const $t=Tt;Je[Ue]=ke[Ue]??$t.default??""}se.current=JSON.stringify(Je,null,2);const He=!((s==null?void 0:s.status)==="resolved"||(s==null?void 0:s.status)==="cancelled")&&(s!=null&&s.id)?en(s.id):null,he=He?xe(He):null;he&&typeof he=="object"&&!Array.isArray(he)?E(JSON.stringify({...he,_form_schema:v},null,2)):E(se.current)}else W&&(oe.current=!0,E(JSON.stringify(W,null,2)))},[W,V,_,s==null?void 0:s.envelope,s==null?void 0:s.metadata,s==null?void 0:s.id,s==null?void 0:s.status]),p.useEffect(()=>{if(!oe.current||se.current===null||!(s!=null&&s.id)||s.status!=="pending")return;const v=s.id,F=window.setTimeout(()=>{C===se.current?$e(v):tn(v,C)},400);return()=>window.clearTimeout(F)},[C,s==null?void 0:s.id,s==null?void 0:s.status]);const Y=(s==null?void 0:s.subtype)==="rounds_exhausted";if(i)return e.jsxs("div",{className:"animate-pulse space-y-8",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-32 bg-surface-sunken rounded w-full"})]});if(!s)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Escalation not found."});const ne=ot(s),J=ne&&s.assigned_to===(n==null?void 0:n.userId),me=ne&&!J,G=s.status==="resolved"||s.status==="cancelled",Z=W==null?void 0:W["x-lt-viewport"],be=(Z==null?void 0:Z.type)==="iframe"&&!!(Z!=null&&Z.src)&&J&&!G,pe=xe(s.escalation_payload),re=xe(s.resolver_payload),fe=xe(s.envelope),vt=!!((qe=fe==null?void 0:fe.metadata)!=null&&qe.certified),Se=qt(),Pe=Se!==null?Se:!!((Ve=m==null?void 0:m.ai)!=null&&Ve.enabled),B=typeof pe=="object"&&pe!==null&&!Array.isArray(pe)?pe:null,wt=B==null?void 0:B._triage,kt=typeof re=="object"&&re!==null&&!Array.isArray(re)?re:null,Ct=G?"terminal":J?"claimed_by_me":me?"claimed_by_other":"available",ye=v=>{l.mutate({id:s.id,durationMinutes:v})},ce=()=>{r.resetQueries({queryKey:["escalations"]}),r.resetQueries({queryKey:["escalationStats"]}),a(-1)},Ne=async v=>{try{await c.mutateAsync({id:s.id,resolverPayload:v})}catch(F){if(F instanceof Vt&&bs(F.body)){b(!0),N(F.body.violations),R(H.ERRORS);return}throw F}$e(s.id),ce()},ve=async v=>{v&&(await x.mutateAsync({id:s.id,targetRole:v}),ce())},_t=async()=>{J||await l.mutateAsync({id:s.id,durationMinutes:30});const v=(B==null?void 0:B.diagnosis)||s.description||"";await c.mutateAsync({id:s.id,resolverPayload:{_lt:{needsTriage:!0},notes:v}}),ce()},Le=async()=>{await l.mutateAsync({id:s.id,durationMinutes:0}),ce()},Et=async()=>{await u.mutateAsync(s.id),$e(s.id),j(!1),ce()},At=e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Bt,{onRefresh:()=>d(),isFetching:o,apiPath:`/escalations/${s.id}`}),e.jsx("button",{onClick:()=>M(v=>(Re(!v),!v)),className:"ml-2 text-text-tertiary hover:text-accent transition-colors",title:w?"Hide side panel":"Show side panel",children:w?e.jsx(Ge,{className:"w-5 h-5",strokeWidth:1.5}):e.jsx(Be,{className:"w-5 h-5",strokeWidth:1.5})})]});return e.jsxs("div",{className:"flex-1 min-h-0 min-w-0 flex items-stretch -mt-10 -mr-10 -mb-16",children:[e.jsxs("div",{className:"flex-1 min-w-0 flex flex-col min-h-0",children:[be?e.jsxs("div",{className:"relative flex-1 min-h-0 -ml-10",children:[e.jsx("div",{className:"absolute top-3 right-3 z-50 flex items-center gap-0.5 bg-surface/90 backdrop-blur-sm rounded-lg px-1.5 py-1 shadow-sm border border-surface-border/40",children:[{onClick:Le,disabled:l.isPending,label:"Release",hoverClass:"hover:text-accent",icon:e.jsx(ps,{className:"w-4 h-4",strokeWidth:1.5})},{onClick:()=>j(!0),disabled:!1,label:"Cancel",hoverClass:"hover:text-status-error",icon:e.jsx(fs,{className:"w-4 h-4",strokeWidth:1.5})},{onClick:()=>M(v=>(Re(!v),!v)),disabled:!1,label:w?"Hide panel":"Show panel",hoverClass:"hover:text-accent",icon:w?e.jsx(Ge,{className:"w-4 h-4",strokeWidth:1.5}):e.jsx(Be,{className:"w-4 h-4",strokeWidth:1.5})}].map(({onClick:v,disabled:F,label:ae,hoverClass:we,icon:ke})=>e.jsxs("div",{className:"relative group/tip",children:[e.jsx("button",{onClick:v,disabled:F,className:`text-text-tertiary ${we} transition-colors disabled:opacity-40 disabled:cursor-default p-1.5 rounded-md`,children:ke}),e.jsx("span",{className:"pointer-events-none absolute top-full left-1/2 -translate-x-1/2 mt-1.5 px-2 py-0.5 rounded text-[11px] bg-surface-sunken text-text-primary whitespace-nowrap opacity-0 group-hover/tip:opacity-100 transition-opacity",children:ae})]},ae))}),e.jsx(gt,{src:yt(Z.src,s),escalation:s,schema:W,onResolve:Ne,onEscalate:ve,submitAttempted:q,fill:!0})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"shrink-0 pt-10 pr-10",children:e.jsx(Gt,{title:s.description||"Escalation",actions:At})}),e.jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto pr-10",children:[e.jsx(Gs,{isRoundsExhausted:Y,payloadObj:B,isTerminal:G,resolverPayload:re,onRetryTriage:_t,isRetrying:l.isPending||c.isPending}),e.jsx(Bs,{esc:s,resolverPayload:re,isTerminal:G,claimedByMe:J,activeView:P,metadataFormSchema:V,effectiveSchema:W,json:C,onJsonChange:E,requestTriage:O,onRequestTriageChange:A,triageNotes:S,onTriageNotesChange:L,onResolve:Ne,onEscalate:ve,onClaim:()=>ye(30),submitAttempted:q,isCertified:vt,hasAI:Pe}),e.jsx("div",{className:"h-10"})]})]}),!be&&e.jsx(Ds,{escalationContext:Ie(s),mode:Ct,activeView:P,onActiveViewChange:D,onClaim:ye,claimPending:l.isPending,workflowType:s.workflow_type,json:C,onResolve:Ne,resolvePending:c.isPending,resolveError:c.error,requestTriage:O,triageNotes:S,currentRole:s.role,escalationTargets:((h==null?void 0:h.targets)??[]).filter(v=>v!==s.role),onEscalate:ve,escalatePending:x.isPending,escalateError:x.error,onRelease:Le,releasePending:l.isPending,onCancel:()=>j(!0),assignedTo:s.assigned_to,assignedUntil:s.assigned_until,onSubmitAttempt:()=>b(!0),onValidationErrors:v=>{N(v),M(!0),Re(!0),R(H.ERRORS)}})]}),e.jsx(Ts,{esc:s,schema:W,envelope:fe,payload:B,resolver:kt,triage:wt??null,hasAI:Pe,claimed:ne,claimedByMe:J,isTerminal:G,isBuilder:$,traceUrl:I,open:w,noGutter:be,formErrors:y,activePanel:T,onPanelChange:R}),e.jsx(Yt,{open:f,onClose:()=>j(!1),onConfirm:Et,isPending:u.isPending,error:u.error}),J&&!G&&s.assigned_until&&e.jsx(Xs,{open:U.expiringSoon&&s.assigned_until!==te,assignedUntil:s.assigned_until,onClose:()=>le(s.assigned_until??null),onExtend:ye,isPending:l.isPending})]})}export{wn as EscalationDetailPage};
|
|
5
|
-
//# sourceMappingURL=index-DwuM7Fka.js.map
|