@hotmeshio/long-tail 0.10.2 → 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/README.md +1 -0
- package/build/api/bot-accounts.d.ts +4 -0
- package/build/api/bot-accounts.js +3 -1
- package/build/api/escalations/metadata.js +21 -1
- package/build/api/escalations/resolve.d.ts +8 -0
- package/build/api/escalations/resolve.js +82 -3
- package/build/api/roles.d.ts +2 -0
- package/build/api/roles.js +4 -0
- package/build/bin/ltc.js +10 -1
- package/build/index.js +7 -1
- package/build/lib/cli/client.d.ts +4 -1
- package/build/lib/cli/client.js +4 -2
- package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
- package/build/lib/typed-resolution.d.ts +35 -0
- package/build/lib/typed-resolution.js +37 -0
- package/build/modules/branding.d.ts +21 -2
- package/build/modules/branding.js +22 -1
- package/build/modules/config.d.ts +1 -0
- package/build/modules/config.js +5 -0
- package/build/routes/bot-accounts.js +3 -1
- package/build/routes/settings.js +21 -0
- package/build/sdk/index.d.ts +4 -0
- package/build/sdk/index.js +14 -0
- package/build/services/escalation/crud.d.ts +18 -6
- package/build/services/escalation/crud.js +18 -2
- package/build/services/escalation/index.d.ts +1 -0
- package/build/services/escalation/index.js +1 -0
- package/build/services/escalation/resolver-validation.d.ts +28 -0
- package/build/services/escalation/resolver-validation.js +95 -0
- package/build/services/escalation/sql.d.ts +12 -2
- package/build/services/escalation/sql.js +22 -2
- package/build/services/iam/bots.d.ts +4 -1
- package/build/services/iam/bots.js +5 -3
- package/build/services/iam/sql.d.ts +2 -2
- package/build/services/iam/sql.js +15 -1
- package/build/services/role/enforcement-cache.d.ts +21 -0
- package/build/services/role/enforcement-cache.js +0 -0
- package/build/services/role/index.js +5 -0
- package/build/services/role/sql.d.ts +12 -2
- package/build/services/role/sql.js +15 -2
- package/build/services/role/types.d.ts +9 -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/field-validator.d.ts +45 -0
- package/build/shared/form-validation/field-validator.js +214 -0
- package/build/shared/form-validation/index.d.ts +12 -0
- package/build/shared/form-validation/index.js +28 -0
- package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
- package/build/shared/form-validation/validate-resolver-payload.js +62 -0
- package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
- package/build/shared/form-validation/x-lt-bind.js +110 -0
- package/build/shared/form-validation/x-lt-help.d.ts +21 -0
- package/build/shared/form-validation/x-lt-help.js +91 -0
- package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
- package/build/shared/form-validation/x-lt-show-if.js +84 -0
- package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
- package/build/system/mcp-servers/admin/schemas.js +1 -0
- package/build/system/mcp-servers/admin/users.js +3 -1
- package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
- package/build/system/mcp-servers/human-queue-schemas.js +4 -1
- package/build/system/mcp-servers/human-queue.js +41 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/types/sdk.d.ts +6 -1
- package/build/types/startup.d.ts +26 -0
- package/build/types/validation.d.ts +43 -0
- package/build/types/validation.js +28 -0
- package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-Cma2NGsF.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.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-2QEIpc-K.js → BotPicker-CidlGr6f.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js.map → BotPicker-CidlGr6f.js.map} +1 -1
- package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
- package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-W9F9lziT.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.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-TXsRlTU4.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-DyOgfnPB.js} +2 -2
- package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
- package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-geum95dj.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.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-DNDEgMpJ.js → DropZone-C3hOjJtC.js} +2 -2
- package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3hOjJtC.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DFOW9T4b.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.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-CsKNXUhb.js → McpQueryPage-BPJmFYOY.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
- package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js +2 -0
- 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-_axS17fp.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-CoQEi_Su.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.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-Cd83AHd_.js → StickyPagination-BTGfmGV3.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.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-DnjhW7qv.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.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-DySfZFgs.js → TasksListPage-kB_j9G8o.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-D7dSIY7-.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.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-5yW63ELl.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-VXM1oHMC.js} +2 -2
- package/dashboard/dist/assets/{UserName-DcXhOSVm.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-C0Bbrd5M.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.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-BcbrYhDI.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.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-CopQ3t5o.js → agents-BwiSNu73.js} +2 -2
- package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-BwiSNu73.js.map} +1 -1
- package/dashboard/dist/assets/bots-ClgSrxel.js +2 -0
- package/dashboard/dist/assets/bots-ClgSrxel.js.map +1 -0
- package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-JUaKsby4.js} +2 -2
- package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-JUaKsby4.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-CuTQ7eUE.js} +2 -2
- package/dashboard/dist/assets/{controlplane-B4rT6tIw.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-Dd1RxGNw.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-B9bmoXOe.js → knowledge-BHBt-6kW.js} +2 -2
- package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-BHBt-6kW.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-CBcz4BCS.js} +2 -2
- package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-CBcz4BCS.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-C4fKTOYo.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CmAAH3B6.js} +2 -2
- package/dashboard/dist/assets/{pipelines-DBXX6TEi.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/task-queues-7-sHKPsN.js +2 -0
- package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
- package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BAEsqcz2.js} +2 -2
- package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BAEsqcz2.js.map} +1 -1
- package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-CY0pJ6_o.js} +2 -2
- package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-CY0pJ6_o.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-BlpwRvHO.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CoNUlZ6Z.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
- package/dashboard/dist/assets/{users-mI9goDjj.js → users-uGtDRGxR.js} +2 -2
- package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-uGtDRGxR.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-DKCAtTJ9.js} +135 -130
- package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
- package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-DoX-AtHN.js} +2 -2
- package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-DoX-AtHN.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-DM3jVem2.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
- package/dashboard/dist/index.html +3 -3
- package/docs/api/http/escalations.md +15 -1
- package/docs/api/http/roles.md +2 -0
- 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-list-schema.md +8 -1
- package/docs/hitl/x-lt-widget.md +23 -0
- package/docs/hitl-guide.md +4 -2
- package/docs/schema-enforcement.md +149 -0
- package/package.json +1 -1
- package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js +0 -16
- package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
- package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js +0 -4
- package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js.map +0 -1
- package/dashboard/dist/assets/AgentsPage-CHczRx5N.js +0 -2
- package/dashboard/dist/assets/AgentsPage-CHczRx5N.js.map +0 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
- package/dashboard/dist/assets/CapabilitiesPage-lQJGZ_-t.js +0 -2
- package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
- package/dashboard/dist/assets/CountdownTimer-TXsRlTU4.js +0 -2
- package/dashboard/dist/assets/CredentialsPage-BKxS-1sA.js.map +0 -1
- package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js +0 -2
- package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.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-CIJ-OgVC.js +0 -20
- package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js.map +0 -1
- package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js +0 -9
- package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js.map +0 -1
- package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js +0 -2
- package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js.map +0 -1
- package/dashboard/dist/assets/EventTable-DBV1P2ME.js +0 -2
- package/dashboard/dist/assets/EventTable-DBV1P2ME.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-DbHvggQ_.js +0 -2
- package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
- package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
- package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js +0 -2
- package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js.map +0 -1
- package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js +0 -2
- package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js.map +0 -1
- package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js +0 -5
- package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js.map +0 -1
- package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
- package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
- package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js +0 -2
- package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js.map +0 -1
- package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js +0 -2
- package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js +0 -2
- package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js +0 -2
- package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js.map +0 -1
- package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js +0 -2
- package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js.map +0 -1
- package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
- package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js +0 -2
- package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
- package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
- package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
- package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
- package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js +0 -2
- package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js.map +0 -1
- package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js +0 -2
- package/dashboard/dist/assets/SlidePanel-BDVDuwIf.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-BIXbrZM0.js +0 -2
- package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js.map +0 -1
- package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js +0 -2
- package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js.map +0 -1
- package/dashboard/dist/assets/TagInput-C2gi47M8.js +0 -2
- package/dashboard/dist/assets/TagInput-C2gi47M8.js.map +0 -1
- package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js +0 -2
- package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js.map +0 -1
- package/dashboard/dist/assets/TimestampCell-DGOsba-A.js +0 -2
- package/dashboard/dist/assets/TimestampCell-DGOsba-A.js.map +0 -1
- package/dashboard/dist/assets/ToolPill-D74TkYB-.js +0 -2
- package/dashboard/dist/assets/ToolPill-D74TkYB-.js.map +0 -1
- package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js +0 -2
- package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js.map +0 -1
- package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js +0 -9
- package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
- package/dashboard/dist/assets/TopicsPage-5yW63ELl.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
- package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
- package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js +0 -2
- package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js.map +0 -1
- package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js +0 -2
- package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js.map +0 -1
- package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js +0 -2
- package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js.map +0 -1
- package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
- package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
- package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
- package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
- package/dashboard/dist/assets/index-B68A3v-S.js +0 -2
- package/dashboard/dist/assets/index-B68A3v-S.js.map +0 -1
- package/dashboard/dist/assets/index-BAi89Xpm.js +0 -2
- package/dashboard/dist/assets/index-BAi89Xpm.js.map +0 -1
- package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
- package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
- package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
- package/dashboard/dist/assets/index-BOJMUk4F.js.map +0 -1
- package/dashboard/dist/assets/index-BrgYykPV.js +0 -2
- package/dashboard/dist/assets/index-BrgYykPV.js.map +0 -1
- package/dashboard/dist/assets/index-BxgtIqvl.js +0 -2
- package/dashboard/dist/assets/index-BxgtIqvl.js.map +0 -1
- package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
- package/dashboard/dist/assets/index-CDHDoHYz.js +0 -6
- package/dashboard/dist/assets/index-CDHDoHYz.js.map +0 -1
- package/dashboard/dist/assets/index-CUZJHXew.js +0 -2
- package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
- package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
- package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
- package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
- package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
- package/dashboard/dist/assets/index-Dd1RxGNw.js +0 -2
- package/dashboard/dist/assets/index-iOb3sGsC.js +0 -5
- package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
- package/dashboard/dist/assets/index-mcAkQblr.js +0 -2
- package/dashboard/dist/assets/index-mcAkQblr.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-ihWGa7_d.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as R,a as m,j as e}from"./vendor-query-B2UbickB.js";import{b as D,c as L}from"./pipelines-DBXX6TEi.js";import{u as J,c as K,D as M,b as S,J as _,N as U}from"./index-DIgiIoou.js";import{S as $}from"./StatusBadge-CEQMRmSQ.js";import{P as E}from"./PageHeader-Bxa1XFz0.js";import{C as A}from"./CopyableId-uot2mE_g.js";import{C as b}from"./CollapsibleSection-CHWP0WI6.js";import{u as V,E as q}from"./EventTable-DBV1P2ME.js";import{L as B}from"./ListToolbar-KC6LGtKP.js";import{S as F}from"./SwimlaneTimeline-CC5qZjYo.js";import{e as H,f as Q}from"./vendor-react-CXumBFUA.js";import"./vendor-icons-ihWGa7_d.js";import"./FilterBar-B5Vk5tBF.js";import"./StreamMessageDetail-BIXbrZM0.js";const z={running:"in_progress",completed:"completed",failed:"failed"};function O({isRunning:a,onTerminate:l}){const[s,n]=m.useState(!1),t=m.useRef(null);return m.useEffect(()=>{if(!s)return;const o=i=>{t.current&&!t.current.contains(i.target)&&n(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[s]),a?e.jsxs("div",{className:"relative",ref:t,children:[e.jsx("button",{onClick:()=>n(!s),className:"btn-primary text-xs",children:"Actions"}),s&&e.jsx("div",{className:"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-10",children:e.jsx("button",{onClick:()=>{l(),n(!1)},className:"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover",children:"Terminate"})})]}):null}function oe(){var N,w;const{jobId:a}=H(),[l]=Q(),s=l.get("namespace")||"",n=R(),{data:t,isLoading:o,error:i,refetch:v,isFetching:T}=D(a,s),C=L(),{data:u}=J(),{isCollapsed:p,toggle:f}=V("mcp-run-detail"),g=((N=u==null?void 0:u.telemetry)==null?void 0:N.traceUrl)??null,I=m.useCallback(x=>{!a||x.workflowId!==a||n.invalidateQueries({queryKey:["mcpRunExecution",a]})},[a,n]);if(K(`${U}.system.>`,I),o)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(i||!t)return e.jsxs("div",{children:[e.jsx(E,{title:"Pipeline Execution"}),e.jsxs("div",{className:"mt-4 text-center py-8",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:(w=i==null?void 0:i.message)!=null&&w.includes("expired")?"Execution data is no longer available":"Unable to load execution"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:(i==null?void 0:i.message)??"The run could not be resolved."})]})]});const{events:j,summary:r}=t,h=j.find(x=>{var k;return x.category==="activity"&&((k=x.attributes.kind)==null?void 0:k.includes("completed"))}),P=(h==null?void 0:h.attributes.result)??null,d=t.result,y=(d==null?void 0:d.data)??d??null;return e.jsxs("div",{children:[e.jsx(E,{title:"Pipeline Execution",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(B,{onRefresh:()=>v(),isFetching:T,apiPath:`/pipelines/${a}/execution?app_id=${s}`}),e.jsx(O,{isRunning:t.status==="running",onTerminate:()=>{confirm("Interrupt this pipeline execution? This cannot be undone.")&&C.mutate({jobId:t.workflow_id,topic:t.workflow_type,appId:s},{onSuccess:()=>v()})}})]})}),e.jsxs("div",{className:"bg-surface-sunken/50 rounded-md p-5 mb-8",children:[e.jsxs("div",{className:"flex items-center gap-4 mb-4",children:[e.jsx("h2",{className:"text-sm font-mono text-text-primary truncate flex-1",children:t.workflow_id}),e.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[e.jsx(c,{label:"Tools",value:r.activities.user}),e.jsx(c,{label:"System",value:r.activities.system,muted:!0}),r.child_workflows.total>0&&e.jsx(c,{label:"Children",value:r.child_workflows.total}),r.timers>0&&e.jsx(c,{label:"Timers",value:r.timers}),r.signals>0&&e.jsx(c,{label:"Signals",value:r.signals}),e.jsx($,{status:z[t.status]??t.status})]})]}),e.jsxs("div",{className:"grid grid-cols-6 gap-x-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Server"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:s})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Tool"}),e.jsx("p",{className:"text-xs font-mono text-text-primary truncate",children:t.workflow_type||"—"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Duration"}),e.jsx(M,{ms:t.duration_ms,className:"font-mono text-text-primary"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Started"}),t.start_time?e.jsx(S,{date:t.start_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Completed"}),t.close_time?e.jsx(S,{date:t.close_time,format:"datetime",className:"font-mono text-text-primary"}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"--"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:"Trace"}),t.trace_id?e.jsx(A,{label:"",value:t.trace_id,href:g?g.replace("{traceId}",t.trace_id):void 0,external:!0}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"})]})]})]}),e.jsxs("div",{className:"space-y-6",children:[e.jsx(b,{title:"Details",sectionKey:"details",isCollapsed:p("details"),onToggle:f,children:e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[e.jsx("div",{children:e.jsx(_,{data:P??{},label:"Input"})}),y!==null&&e.jsx("div",{children:e.jsx(_,{data:y,label:"Result"})})]})}),e.jsx(b,{title:"Execution Timeline",sectionKey:"timeline",isCollapsed:p("timeline"),onToggle:f,children:e.jsx(F,{events:j,outline:!0,jid:a,appId:s||"durable"})}),e.jsx(b,{title:"Events",sectionKey:"events",isCollapsed:p("events"),onToggle:f,children:e.jsx(q,{events:j,jid:a,appId:s||"durable"})})]})]})}function c({label:a,value:l,muted:s}){return e.jsxs("div",{className:"flex items-center gap-1.5 text-xs",children:[e.jsx("span",{className:"text-text-tertiary",children:a}),e.jsx("span",{className:`font-medium tabular-nums ${s?"text-text-tertiary":"text-text-primary"}`,children:l})]})}export{oe as McpRunDetailPage};
|
|
2
|
-
//# sourceMappingURL=McpRunDetailPage-BM3mUSlH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunDetailPage-BM3mUSlH.js","sources":["../../src/pages/mcp/McpRunDetailPage.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useCallback } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useMcpRunExecution, useInterruptJob } from '../../api/pipelines';\nimport { useSettings } from '../../api/settings';\nimport { StatusBadge } from '../../components/common/display/StatusBadge';\nimport { JsonViewer } from '../../components/common/data/JsonViewer';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { CopyableId } from '../../components/common/display/CopyableId';\nimport { CollapsibleSection } from '../../components/common/layout/CollapsibleSection';\nimport { useCollapsedSections } from '../../hooks/useCollapsedSections';\nimport { useEventSubscription } from '../../hooks/useEventContext';\nimport { NATS_SUBJECT_PREFIX } from '../../lib/nats/config';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { DurationValue } from '../../components/common/display/DurationValue';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\n\nimport { SwimlaneTimeline } from '../workflows/workflow-execution/SwimlaneTimeline';\nimport { EventTable } from '../workflows/workflow-execution/EventTable';\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\n// ── Actions dropdown ────────────────────────────────────────────────────────\n\nfunction ActionsDropdown({ isRunning, onTerminate }: {\n isRunning: boolean;\n onTerminate: () => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open]);\n\n if (!isRunning) return null;\n\n return (\n <div className=\"relative\" ref={ref}>\n <button onClick={() => setOpen(!open)} className=\"btn-primary text-xs\">\n Actions\n </button>\n {open && (\n <div className=\"absolute right-0 mt-1 w-44 bg-surface-raised border border-surface-border rounded-md shadow-lg z-10\">\n <button\n onClick={() => { onTerminate(); setOpen(false); }}\n className=\"block w-full text-left px-4 py-2 text-xs text-status-error hover:bg-surface-hover\"\n >\n Terminate\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Main page ────────────────────────────────────────────────────────────────\n\nexport function McpRunDetailPage() {\n const { jobId } = useParams<{ jobId: string }>();\n const [searchParams] = useSearchParams();\n const namespace = searchParams.get('namespace') || '';\n const queryClient = useQueryClient();\n const { data: execution, isLoading, error, refetch, isFetching } = useMcpRunExecution(jobId!, namespace);\n const interruptMutation = useInterruptJob();\n const { data: settings } = useSettings();\n const { isCollapsed, toggle } = useCollapsedSections('mcp-run-detail');\n\n\n const traceUrl = settings?.telemetry?.traceUrl ?? null;\n\n // Subscribe to activity events for this job — refetch execution on each step\n const activityHandler = useCallback((event: any) => {\n if (!jobId || event.workflowId !== jobId) return;\n queryClient.invalidateQueries({ queryKey: ['mcpRunExecution', jobId] });\n }, [jobId, queryClient]);\n useEventSubscription(`${NATS_SUBJECT_PREFIX}.system.>`, activityHandler);\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (error || !execution) {\n return (\n <div>\n <PageHeader title=\"Pipeline Execution\" />\n <div className=\"mt-4 text-center py-8\">\n <p className=\"text-sm text-text-primary mb-1\">\n {(error as Error)?.message?.includes('expired')\n ? 'Execution data is no longer available'\n : 'Unable to load execution'}\n </p>\n <p className=\"text-xs text-text-tertiary\">\n {(error as Error)?.message ?? 'The run could not be resolved.'}\n </p>\n </div>\n </div>\n );\n }\n\n const { events, summary } = execution;\n\n // The trigger activity's result is the effective input to the flow —\n // it accepts outside job input and provides it to descendant activities.\n const triggerCompleted = events.find(\n (e) => e.category === 'activity' && e.attributes.kind?.includes('completed'),\n );\n const triggerInput = triggerCompleted?.attributes.result ?? null;\n\n // Unwrap result — the `data` field is what users care about\n const rawResult = execution.result as Record<string, unknown> | null | undefined;\n const result = rawResult?.data ?? rawResult ?? null;\n\n return (\n <div>\n <PageHeader\n title=\"Pipeline Execution\"\n actions={\n <div className=\"flex items-center gap-2\">\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/pipelines/${jobId}/execution?app_id=${namespace}`}\n />\n <ActionsDropdown\n isRunning={execution.status === 'running'}\n onTerminate={() => {\n if (confirm('Interrupt this pipeline execution? This cannot be undone.')) {\n interruptMutation.mutate(\n { jobId: execution.workflow_id, topic: execution.workflow_type, appId: namespace },\n { onSuccess: () => refetch() },\n );\n }\n }}\n />\n </div>\n }\n />\n\n {/* ── Header card ─────────────────────────────────── */}\n <div className=\"bg-surface-sunken/50 rounded-md p-5 mb-8\">\n {/* Row 1: Job ID + stats + status */}\n <div className=\"flex items-center gap-4 mb-4\">\n <h2 className=\"text-sm font-mono text-text-primary truncate flex-1\">{execution.workflow_id}</h2>\n <div className=\"flex items-center gap-4 shrink-0\">\n <Stat label=\"Tools\" value={summary.activities.user} />\n <Stat label=\"System\" value={summary.activities.system} muted />\n {summary.child_workflows.total > 0 && (\n <Stat label=\"Children\" value={summary.child_workflows.total} />\n )}\n {summary.timers > 0 && <Stat label=\"Timers\" value={summary.timers} />}\n {summary.signals > 0 && <Stat label=\"Signals\" value={summary.signals} />}\n <StatusBadge status={statusMap[execution.status] ?? execution.status} />\n </div>\n </div>\n\n {/* Row 2: Namespace, Topic, Duration, Started, Trace */}\n <div className=\"grid grid-cols-6 gap-x-6\">\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Server</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{namespace}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Tool</p>\n <p className=\"text-xs font-mono text-text-primary truncate\">{execution.workflow_type || '—'}</p>\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Duration</p>\n <DurationValue ms={execution.duration_ms} className=\"font-mono text-text-primary\" />\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Started</p>\n {execution.start_time\n ? <DateValue date={execution.start_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Completed</p>\n {execution.close_time\n ? <DateValue date={execution.close_time} format=\"datetime\" className=\"font-mono text-text-primary\" />\n : <span className=\"text-xs text-text-tertiary\">--</span>}\n </div>\n <div>\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5\">Trace</p>\n {execution.trace_id ? (\n <CopyableId\n label=\"\"\n value={execution.trace_id}\n href={traceUrl ? traceUrl.replace('{traceId}', execution.trace_id) : undefined}\n external\n />\n ) : (\n <span className=\"text-xs text-text-tertiary\">—</span>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Sections ────────────────────────────────────── */}\n <div className=\"space-y-6\">\n {/* Details: Input + Result */}\n <CollapsibleSection title=\"Details\" sectionKey=\"details\" isCollapsed={isCollapsed('details')} onToggle={toggle}>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6\">\n <div>\n <JsonViewer data={triggerInput ?? {}} label=\"Input\" />\n </div>\n {result !== null && (\n <div>\n <JsonViewer data={result} label=\"Result\" />\n </div>\n )}\n </div>\n </CollapsibleSection>\n\n {/* Execution Timeline (swimlane) */}\n <CollapsibleSection title=\"Execution Timeline\" sectionKey=\"timeline\" isCollapsed={isCollapsed('timeline')} onToggle={toggle}>\n <SwimlaneTimeline events={events} outline jid={jobId} appId={namespace || 'durable'} />\n </CollapsibleSection>\n\n {/* Events (table) */}\n <CollapsibleSection title=\"Events\" sectionKey=\"events\" isCollapsed={isCollapsed('events')} onToggle={toggle}>\n <EventTable events={events} jid={jobId} appId={namespace || 'durable'} />\n </CollapsibleSection>\n </div>\n </div>\n );\n}\n\n// ── Stat pill ────────────────────────────────────────────────────────────────\n\nfunction Stat({ label, value, muted }: { label: string; value: number; muted?: boolean }) {\n return (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-tertiary\">{label}</span>\n <span className={`font-medium tabular-nums ${muted ? 'text-text-tertiary' : 'text-text-primary'}`}>{value}</span>\n </div>\n );\n}\n"],"names":["statusMap","ActionsDropdown","isRunning","onTerminate","open","setOpen","useState","ref","useRef","useEffect","handler","e","jsxs","jsx","McpRunDetailPage","jobId","useParams","searchParams","useSearchParams","namespace","queryClient","useQueryClient","execution","isLoading","error","refetch","isFetching","useMcpRunExecution","interruptMutation","useInterruptJob","settings","useSettings","isCollapsed","toggle","useCollapsedSections","traceUrl","_a","activityHandler","useCallback","event","useEventSubscription","NATS_SUBJECT_PREFIX","PageHeader","_b","events","summary","triggerCompleted","triggerInput","rawResult","result","ListToolbar","Stat","StatusBadge","DurationValue","DateValue","CopyableId","CollapsibleSection","JsonViewer","SwimlaneTimeline","EventTable","label","value","muted"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as d,j as s}from"./vendor-query-B2UbickB.js";import{a as R,u as T}from"./pipelines-DBXX6TEi.js";import{a as z}from"./yaml-workflows-DWNMP1PT.js";import{u as M}from"./useFilterParams-x-Dg0Vgz.js";import{u as E}from"./useNamespace-DykYhZY9.js";import{b as $}from"./api-path-u2Jf9QXS.js";import{D as A}from"./DataTable-Byn3oyT9.js";import{W as L}from"./WorkflowPill-Fjc2q9U9.js";import{E as U}from"./ElapsedCell-g7GO7f8L.js";import{b}from"./index-DIgiIoou.js";import{P as W}from"./PageHeader-Bxa1XFz0.js";import{F as I,b as g}from"./FilterBar-B5Vk5tBF.js";import{S as O}from"./StickyPagination-Cd83AHd_.js";import{L as B}from"./ListToolbar-KC6LGtKP.js";import{R as H,a as q}from"./RowActions-BA9L9djf.js";import{z as G}from"./vendor-icons-ihWGa7_d.js";import{c as V}from"./vendor-react-CXumBFUA.js";import"./controlplane-B4rT6tIw.js";import"./EmptyState-BcsfPq9T.js";const Y={running:"in_progress",completed:"completed",failed:"failed"},D={in_progress:"bg-status-active",completed:"bg-status-success",failed:"bg-status-error"},J={running:"text-status-active",completed:"text-status-success",failed:"text-status-error"};function K(x,f){return[{key:"workflow_id",label:"Run ID",render:t=>{const a=D[Y[t.status]??t.status]??"bg-status-pending",n=t.status==="running"?" animate-pulse":"";return s.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[s.jsx("span",{className:`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${a}${n}`,title:t.status}),s.jsx("span",{className:"font-mono text-xs text-text-primary truncate",children:t.workflow_id})]})}},{key:"entity",label:"Tool",render:t=>t.entity?s.jsx(L,{type:t.entity,variant:"pipeline",size:"xs"}):s.jsx("span",{className:"text-[10px] text-text-tertiary",children:"—"}),className:"w-44 shrink-0"},{key:"created_at",label:"Created",sortable:!0,render:t=>s.jsx(b,{date:t.created_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"updated_at",label:"Updated",sortable:!0,render:t=>s.jsx(b,{date:t.updated_at,format:"relative",className:"text-xs text-text-secondary whitespace-nowrap"}),className:"w-32"},{key:"duration",label:"Duration",render:t=>s.jsx(U,{startDate:t.created_at,endDate:t.status==="running"?null:t.updated_at,isLive:t.status==="running"}),className:"w-28"},{key:"actions",label:"",render:t=>s.jsxs(H,{children:[s.jsx(q,{icon:G,title:`Filter by ${t.entity}`,onClick:()=>x(t.entity)}),s.jsx("button",{onClick:a=>{a.stopPropagation(),f(t.status)},className:"opacity-0 group-hover/row:opacity-100 transition-opacity",title:`Filter by ${t.status}`,children:s.jsx("svg",{className:`w-[18px] h-[18px] ${J[t.status]??"text-text-tertiary"} hover:opacity-70`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,children:s.jsx("circle",{cx:"12",cy:"12",r:"6"})})})]}),className:"w-24 text-right"}]}function ge(){const x=V(),{namespace:f,available:t}=E("namespace"),{filters:a,setFilter:n,setFilters:v,pagination:o,sort:u,setSort:j}=M({filters:{search:"",entity:"",status:"",namespace:""}}),[m,_]=d.useState(a.search);d.useEffect(()=>{if(m===a.search)return;const e=setTimeout(()=>n("search",m),300);return()=>clearTimeout(e)},[m,n,a.search]);const{data:l}=z(),h=d.useMemo(()=>{const e=new Set(t);for(const r of(l==null?void 0:l.app_ids)??[])e.add(r);return[...e].sort()},[t,l==null?void 0:l.app_ids]),i=a.namespace||f,{data:c}=R(i),{data:p,isLoading:k,refetch:S,isFetching:N}=T({app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,search:a.search||void 0,status:a.status||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"}),y=(p==null?void 0:p.total)??0,w=(p==null?void 0:p.jobs)??[],C=K(e=>n("entity",e),e=>n("status",e)),P=d.useMemo(()=>{const e=new Set(h);return i&&e.add(i),[...e].sort().map(r=>({value:r,label:r}))},[h,i]),F=d.useMemo(()=>{const e=new Set((c==null?void 0:c.entities)??[]);return a.entity&&!e.has(a.entity)&&e.add(a.entity),[...e].sort().map(r=>({value:r,label:r}))},[c==null?void 0:c.entities,a.entity]);return s.jsxs("div",{children:[s.jsx(W,{title:"Pipeline Executions",docsHash:"#docs:dashboard.md:graph-executions"}),s.jsxs(I,{actions:s.jsx(B,{onRefresh:()=>S(),isFetching:N,apiPath:$("/pipelines",{app_id:i,limit:o.pageSize,offset:o.offset,entity:a.entity||void 0,status:a.status||void 0,search:a.search||void 0,sort_by:u.sort_by||"created_at",order:u.order||"desc"})}),children:[s.jsx(g,{label:"Namespace",value:i,onChange:e=>{v({namespace:e,entity:""})},options:P,required:!0}),s.jsx("input",{type:"text",placeholder:"Search run ID...",value:m,onChange:e=>_(e.target.value),className:"input text-[11px] py-1 px-2 w-56"}),s.jsx(g,{label:"Tool",value:a.entity,onChange:e=>n("entity",e),options:F}),s.jsx(g,{label:"Status",value:a.status,onChange:e=>n("status",e),options:[{value:"running",label:"Running"},{value:"completed",label:"Completed"},{value:"failed",label:"Failed"}]})]}),s.jsx(A,{columns:C,data:w,keyFn:e=>e.workflow_id,onRowClick:e=>x(`/mcp/executions/${encodeURIComponent(e.workflow_id)}?namespace=${i}`),isLoading:k,emptyMessage:"No pipeline executions found",sort:u,onSort:j}),s.jsx(O,{page:o.page,totalPages:o.totalPages(y),onPageChange:o.setPage,total:y,pageSize:o.pageSize,onPageSizeChange:o.setPageSize})]})}export{ge as McpRunsPage};
|
|
2
|
-
//# sourceMappingURL=McpRunsPage-f5hDbpLo.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"McpRunsPage-f5hDbpLo.js","sources":["../../src/pages/mcp/McpRunsPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Filter } from 'lucide-react';\nimport { useMcpRuns, useMcpEntities } from '../../api/pipelines';\nimport { useYamlWorkflowAppIds } from '../../api/yaml-workflows';\nimport { useFilterParams } from '../../hooks/useFilterParams';\nimport { useNamespace } from '../../hooks/useNamespace';\nimport { buildApiPath } from '../../lib/api-path';\nimport { DataTable, type Column } from '../../components/common/data/DataTable';\nimport { WorkflowPill } from '../../components/common/display/WorkflowPill';\nimport { ElapsedCell } from '../../components/common/display/ElapsedCell';\nimport { DateValue } from '../../components/common/display/DateValue';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { FilterBar, FilterSelect } from '../../components/common/data/FilterBar';\nimport { StickyPagination } from '../../components/common/data/StickyPagination';\nimport { ListToolbar } from '../../components/common/data/ListToolbar';\nimport { RowAction, RowActionGroup } from '../../components/common/layout/RowActions';\nimport type { LTJob } from '../../api/types';\n\nconst statusMap: Record<string, string> = {\n running: 'in_progress',\n completed: 'completed',\n failed: 'failed',\n};\n\nconst STATUS_DOT: Record<string, string> = {\n in_progress: 'bg-status-active',\n completed: 'bg-status-success',\n failed: 'bg-status-error',\n};\n\nconst STATUS_COLORS: Record<string, string> = {\n running: 'text-status-active',\n completed: 'text-status-success',\n failed: 'text-status-error',\n};\n\nfunction buildColumns(\n onFilterEntity: (entity: string) => void,\n onFilterStatus: (status: string) => void,\n): Column<LTJob>[] {\n return [\n {\n key: 'workflow_id',\n label: 'Run ID',\n render: (row) => {\n const dotClass = STATUS_DOT[statusMap[row.status] ?? row.status] ?? 'bg-status-pending';\n const pulseClass = row.status === 'running' ? ' animate-pulse' : '';\n return (\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className={`w-1.5 h-1.5 shrink-0 rounded-full dot-ring ${dotClass}${pulseClass}`} title={row.status} />\n <span className=\"font-mono text-xs text-text-primary truncate\">{row.workflow_id}</span>\n </div>\n );\n },\n },\n {\n key: 'entity',\n label: 'Tool',\n render: (row) => row.entity\n ? <WorkflowPill type={row.entity} variant=\"pipeline\" size=\"xs\" />\n : <span className=\"text-[10px] text-text-tertiary\">—</span>,\n className: 'w-44 shrink-0',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <DateValue date={row.created_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'updated_at',\n label: 'Updated',\n sortable: true,\n render: (row) => <DateValue date={row.updated_at} format=\"relative\" className=\"text-xs text-text-secondary whitespace-nowrap\" />,\n className: 'w-32',\n },\n {\n key: 'duration',\n label: 'Duration',\n render: (row) => (\n <ElapsedCell\n startDate={row.created_at}\n endDate={row.status === 'running' ? null : row.updated_at}\n isLive={row.status === 'running'}\n />\n ),\n className: 'w-28',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n <RowAction\n icon={Filter}\n title={`Filter by ${row.entity}`}\n onClick={() => onFilterEntity(row.entity)}\n />\n <button\n onClick={(e) => { e.stopPropagation(); onFilterStatus(row.status); }}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\"\n title={`Filter by ${row.status}`}\n >\n <svg className={`w-[18px] h-[18px] ${STATUS_COLORS[row.status] ?? 'text-text-tertiary'} hover:opacity-70`} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n </button>\n </RowActionGroup>\n ),\n className: 'w-24 text-right',\n },\n ];\n}\n\nexport function McpRunsPage() {\n const navigate = useNavigate();\n const { namespace: hookNamespace, available } = useNamespace('namespace');\n const { filters, setFilter, setFilters, pagination, sort, setSort } = useFilterParams({\n filters: { search: '', entity: '', status: '', namespace: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const { data: appIdData } = useYamlWorkflowAppIds();\n\n // Merge real HotMesh namespaces (from controlplane/apps) with YAML workflow app_ids\n const allNamespaceNames = useMemo(() => {\n const set = new Set(available);\n for (const id of appIdData?.app_ids ?? []) {\n set.add(id);\n }\n return [...set].sort();\n }, [available, appIdData?.app_ids]);\n\n const activeNamespace = filters.namespace || hookNamespace;\n const { data: entitiesData } = useMcpEntities(activeNamespace);\n\n const { data: runsData, isLoading, refetch, isFetching } = useMcpRuns({\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n search: filters.search || undefined,\n status: filters.status || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n });\n\n const total = runsData?.total ?? 0;\n const jobs = runsData?.jobs ?? [];\n\n const columns = buildColumns(\n (entity) => setFilter('entity', entity),\n (status) => setFilter('status', status),\n );\n\n const namespaces = useMemo(() => {\n const set = new Set(allNamespaceNames);\n if (activeNamespace) set.add(activeNamespace);\n return [...set].sort().map((id) => ({ value: id, label: id }));\n }, [allNamespaceNames, activeNamespace]);\n\n const entities = useMemo(() => {\n const known = new Set(entitiesData?.entities ?? []);\n if (filters.entity && !known.has(filters.entity)) known.add(filters.entity);\n return [...known].sort().map((e) => ({ value: e, label: e }));\n }, [entitiesData?.entities, filters.entity]);\n\n return (\n <div>\n <PageHeader title=\"Pipeline Executions\" docsHash=\"#docs:dashboard.md:graph-executions\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={buildApiPath('/pipelines', {\n app_id: activeNamespace,\n limit: pagination.pageSize,\n offset: pagination.offset,\n entity: filters.entity || undefined,\n status: filters.status || undefined,\n search: filters.search || undefined,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n })}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={activeNamespace}\n onChange={(v) => {\n setFilters({ namespace: v, entity: '' });\n }}\n options={namespaces}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Search run ID...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Tool\"\n value={filters.entity}\n onChange={(v) => setFilter('entity', v)}\n options={entities}\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={[\n { value: 'running', label: 'Running' },\n { value: 'completed', label: 'Completed' },\n { value: 'failed', label: 'Failed' },\n ]}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={jobs}\n keyFn={(row) => row.workflow_id}\n onRowClick={(row) => navigate(`/mcp/executions/${encodeURIComponent(row.workflow_id)}?namespace=${activeNamespace}`)}\n isLoading={isLoading}\n emptyMessage=\"No pipeline executions found\"\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n </div>\n );\n}\n"],"names":["statusMap","STATUS_DOT","STATUS_COLORS","buildColumns","onFilterEntity","onFilterStatus","row","dotClass","pulseClass","jsxs","jsx","WorkflowPill","DateValue","ElapsedCell","RowActionGroup","RowAction","Filter","e","McpRunsPage","navigate","useNavigate","hookNamespace","available","useNamespace","filters","setFilter","setFilters","pagination","sort","setSort","useFilterParams","searchInput","setSearchInput","useState","useEffect","timer","appIdData","useYamlWorkflowAppIds","allNamespaceNames","useMemo","set","id","activeNamespace","entitiesData","useMcpEntities","runsData","isLoading","refetch","isFetching","useMcpRuns","total","jobs","columns","entity","status","namespaces","entities","known","PageHeader","FilterBar","ListToolbar","buildApiPath","FilterSelect","v","DataTable","StickyPagination"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{H as r}from"./vendor-icons-ihWGa7_d.js";function p({namespace:e,size:t="sm"}){const a=t==="md"?"px-2 py-0.5 text-[12px] gap-1.5":"px-1.5 py-px text-[11px] gap-1",n=t==="md"?"w-2.5 h-2.5":"w-2 h-2";return s.jsxs("span",{className:`inline-flex items-center ${a} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`,children:[s.jsx(r,{className:`${n} shrink-0 text-text-quaternary`,strokeWidth:1.5}),e]})}export{p as N};
|
|
2
|
-
//# sourceMappingURL=NamespacePill-C4u6Go1W.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NamespacePill-C4u6Go1W.js","sources":["../../src/components/common/display/NamespacePill.tsx"],"sourcesContent":["import { Layers } from 'lucide-react';\n\ninterface NamespacePillProps {\n namespace: string;\n size?: 'sm' | 'md';\n}\n\n/**\n * The namespace a workflow belongs to — `graph` for graph flows in the graph\n * app, `durable` for procedural workflows. A subtle attribute pill, never a card.\n */\nexport function NamespacePill({ namespace, size = 'sm' }: NamespacePillProps) {\n const sizeClass = size === 'md'\n ? 'px-2 py-0.5 text-[12px] gap-1.5'\n : 'px-1.5 py-px text-[11px] gap-1';\n const iconClass = size === 'md' ? 'w-2.5 h-2.5' : 'w-2 h-2';\n\n return (\n <span className={`inline-flex items-center ${sizeClass} font-mono text-text-tertiary bg-surface-sunken/50 rounded-md`}>\n <Layers className={`${iconClass} shrink-0 text-text-quaternary`} strokeWidth={1.5} />\n {namespace}\n </span>\n );\n}\n"],"names":["NamespacePill","namespace","size","sizeClass","iconClass","jsxs","jsx","Layers"],"mappings":"8FAWO,SAASA,EAAc,CAAE,UAAAC,EAAW,KAAAC,EAAO,MAA4B,CAC5E,MAAMC,EAAYD,IAAS,KACvB,kCACA,iCACEE,EAAYF,IAAS,KAAO,cAAgB,UAElD,OACEG,EAAAA,KAAC,OAAA,CAAK,UAAW,4BAA4BF,CAAS,gEACpD,SAAA,CAAAG,MAACC,GAAO,UAAW,GAAGH,CAAS,iCAAkC,YAAa,IAAK,EAClFH,CAAA,EACH,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,a as m}from"./vendor-query-B2UbickB.js";import{ac as F,O as P,ad as C,I as de,ae as ue,af as E,ag as G,ah as I,ai as T,a2 as pe}from"./index-DIgiIoou.js";import{i as me}from"./useEventHooks-DV9pLDOW.js";import{P as he}from"./PageHeader-Bxa1XFz0.js";import{X as fe,K as je,aN as ge,ar as ye,aM as be,n as Ne,aO as ve,ai as H,E as we}from"./vendor-icons-ihWGa7_d.js";import{L as b,f as ke,c as Re}from"./vendor-react-CXumBFUA.js";function K(t){const n=t.priority_facet?`metadata.${t.priority_facet}`:"created_at",c=JSON.stringify([{field:n,direction:"asc"}]);return`/escalations/available?role=${encodeURIComponent(t.role)}&jeopardy=1&view=table&orderBy=${encodeURIComponent(c)}`}const Q=["15m","1h","24h","7d","30d"],Ce=t=>Q.includes(t);function $(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function q({label:t,value:n}){return e.jsxs("div",{className:"flex items-center justify-between py-1.5",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider",children:t}),e.jsx("span",{className:"text-xs font-mono font-medium text-text-primary tabular-nums",children:n})]})}function _e({period:t,onChange:n}){return e.jsx("div",{className:"flex items-center gap-1 mb-4",children:Q.map(c=>e.jsx("button",{onClick:()=>n(c),className:`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${t===c?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:c},c))})}function Se({role:t,globalPeriod:n,onClose:c}){const[x,d]=m.useState(Ce(n)?n:"24h"),{data:u}=F(x),s=u==null?void 0:u.stations.find(r=>r.role===t.role),l=t.sla_minutes??void 0,i=t.target_per_hour??void 0,a=t.worker_count??void 0;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex items-start justify-between mb-4",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex items-baseline gap-1.5 flex-wrap",children:[e.jsx("span",{className:"text-sm font-bold text-text-primary",children:P(t)}),e.jsx("span",{className:"text-[10px] font-mono text-text-secondary",children:t.role})]}),t.description&&e.jsx("p",{className:"text-[10px] text-text-tertiary mt-1 line-clamp-2 leading-relaxed",children:t.description})]}),e.jsx("button",{onClick:c,className:"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2",children:e.jsx(fe,{className:"w-4 h-4"})})]}),e.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[e.jsxs(b,{to:`/admin/roles/${encodeURIComponent(t.role)}`,className:"flex items-center gap-1 text-[10px] text-accent hover:underline",children:[e.jsx(je,{className:"w-2.5 h-2.5"}),"Edit in Roles"]}),e.jsxs(b,{to:`/escalations/available?role=${encodeURIComponent(t.role)}`,className:"flex items-center gap-1 text-[10px] text-accent hover:underline",children:[e.jsx(ge,{className:"w-2.5 h-2.5"}),"View full queue"]})]}),e.jsx(_e,{period:x,onChange:d}),(i||l||a)&&e.jsxs("div",{className:"flex items-center gap-6 mb-6 text-[10px] border-b border-surface-border/30 pb-5",children:[i&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[i,"/h"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"target"})]}),l&&e.jsxs("div",{children:[e.jsxs("div",{className:"font-mono font-semibold text-text-primary text-sm",children:[l,"m"]}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"SLA"})]}),a&&e.jsxs("div",{children:[e.jsx("div",{className:"font-mono font-semibold text-text-primary text-sm",children:a}),e.jsx("div",{className:"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5",children:"workers"})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-x-4 mb-2",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-wider mb-2",children:"Wait (queue)"}),e.jsx(q,{label:"P99",value:$((s==null?void 0:s.wait.p99)??null)}),e.jsx(q,{label:"avg",value:$((s==null?void 0:s.wait.avg)??null)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] text-text-quaternary uppercase tracking-wider mb-2",children:"Work (proc.)"}),e.jsx(q,{label:"P99",value:$((s==null?void 0:s.work.p99)??null)}),e.jsx(q,{label:"avg",value:$((s==null?void 0:s.work.avg)??null)})]})]}),e.jsxs("div",{className:"border-t border-surface-border/40 pt-4 mt-5 space-y-2.5",children:[l&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"SLA target"}),e.jsxs("span",{className:"text-xs font-mono text-text-secondary",children:[l,"m"]})]}),s&&s.priority_count>0&&e.jsxs(b,{to:K(t),className:"flex items-center justify-between group",children:[e.jsxs("span",{className:"text-[10px]",style:{color:C},children:[s.priority_count," in jeopardy — pull oldest first"]}),e.jsx(ye,{className:"w-3 h-3 transition-colors",style:{color:C}})]})]})]})}function $e({allMetrics:t,orderedRoles:n,period:c}){const x=t.reduce((a,r)=>a+r.pending,0),d=t.reduce((a,r)=>a+r.resolved,0),u=t.reduce((a,r)=>a+r.priority_count,0),s=new Map(t.map(a=>[a.role,a])),l=t.filter(a=>a.priority_count>0).length,i=t.filter(a=>a.pending>0).length;return e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"text-[9px] text-text-quaternary uppercase tracking-wider mb-3",children:["Pipeline · ",c]}),e.jsx("div",{className:"mb-4",children:l>0?e.jsxs("p",{className:"text-[11px]",style:{color:C},children:[l," station",l>1?"s":""," with items in jeopardy"]}):i>0?e.jsxs("p",{className:"text-[11px] text-status-warning",children:[i," station",i>1?"s":""," with backlog"]}):d>0?e.jsx("p",{className:"text-[11px] text-status-success",children:"Flowing — queue clear"}):e.jsx("p",{className:"text-[11px] text-text-quaternary",children:"Quiet — awaiting work"})}),e.jsxs("div",{className:"space-y-1.5 mb-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[9px] text-text-quaternary uppercase tracking-wider",children:"Pending"}),e.jsx("span",{className:`text-xs font-mono tabular-nums ${x>0?"text-text-primary font-semibold":"text-text-quaternary"}`,children:x})]}),e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("span",{className:"text-[9px] text-text-quaternary uppercase tracking-wider",children:["Resolved · ",c]}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-text-secondary",children:d})]}),u>0&&e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-[9px] text-text-quaternary uppercase tracking-wider",children:"Priority"}),e.jsx("span",{className:"text-xs font-mono tabular-nums font-semibold",style:{color:C},children:u})]})]}),e.jsx("div",{className:"border-t border-surface-border/40 pt-2 mb-1",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-[8px] text-text-quaternary uppercase tracking-wider flex-1",children:"Station"}),e.jsx("span",{className:"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"pend"}),e.jsx("span",{className:"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"clmd"}),e.jsx("span",{className:"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0",children:"res"})]})}),e.jsx("div",{className:"space-y-0.5",children:n.map(a=>{const r=s.get(a.role),h=(r==null?void 0:r.pending)??0,N=(r==null?void 0:r.claimed)??0,f=(r==null?void 0:r.resolved)??0,w=(r==null?void 0:r.priority_count)??0,g=a.title||a.role,p=w>0,_=h>0;return e.jsxs("div",{className:"flex items-center gap-2 py-0.5",children:[e.jsxs("span",{className:`text-[10px] font-mono flex-1 truncate ${_?"text-text-primary":"text-text-quaternary"}`,children:[g,p&&e.jsxs("span",{className:"ml-1 text-[8px] font-semibold",style:{color:C},children:[w," PRIORITY"]})]}),e.jsx("span",{className:`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${_?"text-text-primary font-semibold":"text-text-quaternary"}`,children:h>0?h:"—"}),e.jsx("span",{className:`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${N>0?"text-accent font-semibold":"text-text-quaternary"}`,children:N>0?N:"—"}),e.jsx("span",{className:`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${f>0?"text-text-secondary":"text-text-quaternary"}`,children:f>0?f:"—"})]},a.role)})}),e.jsx("p",{className:"text-[9px] text-text-quaternary mt-5",children:"Select a station for queue detail."})]})}function qe({role:t,allMetrics:n,orderedRoles:c,globalPeriod:x,onClose:d}){return e.jsx("div",{className:"w-[280px] shrink-0 px-7 py-10 flex flex-col overflow-y-auto min-h-0",children:t?e.jsx(Se,{role:t,globalPeriod:x,onClose:d}):e.jsx($e,{allMetrics:n,orderedRoles:c,period:x})})}const Pe=E,z=`${E}18`,J=`${E}18`,X=`${G}14`,Y=`${I}14`,Z=`${T}14`,ee="minmax(120px, 1.1fr) minmax(100px, 0.9fr) auto 72px 72px 104px 36px",Ee=["15m","1h","24h","7d","30d"],Oe={"15m":.25,"1h":1,"24h":24,"7d":168,"30d":720};function L(t){const n=t.filter(s=>s.ops_visible),c=new Map(n.map(s=>[s.role,s])),x=new Set,u=n.filter(s=>!s.parent_role||!c.has(s.parent_role)).map(s=>{const l=[],i=[{role:s,depth:0}];for(;i.length>0;){const a=i.shift();x.has(a.role.role)||(x.add(a.role.role),l.push(a),n.filter(r=>r.parent_role===a.role.role&&!x.has(r.role)).forEach(r=>i.push({role:r,depth:a.depth+1})))}return{origin:s,stations:l}});return n.filter(s=>!x.has(s.role)).forEach(s=>u.push({origin:s,stations:[{role:s,depth:0}]})),u.sort((s,l)=>l.stations.length-s.stations.length||s.origin.role.localeCompare(l.origin.role))}function B(t){if(t==null)return"—";if(t<1){const n=Math.round(t*60);return n<=0?"< 1s":`${n}s`}return t<60?`${t.toFixed(0)}m`:`${(t/60).toFixed(1)}h`}function Le(t,n){if(!n||t===0)return{pct:null,color:"bg-surface-border"};const c=t/n,x=Math.round(c*100),d=c>1?"bg-status-warning":c<.2?"bg-status-draft":"bg-status-success";return{pct:x,color:d}}function V({value:t,onSave:n}){const[c,x]=m.useState(t!=null?String(t):""),d=m.useRef(void 0),u=s=>{const l=parseInt(s,10);n(!s.trim()||isNaN(l)||l<0?null:l)};return e.jsx("input",{type:"number",min:0,step:1,value:c,onChange:s=>{const l=s.target.value;x(l),clearTimeout(d.current),d.current=setTimeout(()=>u(l),400)},onBlur:s=>{clearTimeout(d.current),u(s.target.value)},onClick:s=>s.stopPropagation(),onKeyDown:s=>s.stopPropagation(),className:"w-full bg-transparent text-xs font-mono tabular-nums text-right focus:outline-none"})}function Ie({role:t,metric:n,selected:c,onClick:x}){var g;const d=pe(),u=(n==null?void 0:n.pending)??0,s=(n==null?void 0:n.claimed)??0,l=(n==null?void 0:n.resolved)??0,i=(n==null?void 0:n.priority_count)??0,a=t.target_per_hour??null,{pct:r,color:h}=Le(u,a),N=r!=null?Math.min(100,r):0,f=p=>d.mutate({role:t.role,target_per_hour:p}),w=p=>d.mutate({role:t.role,sla_minutes:p});return e.jsx(e.Fragment,{children:e.jsxs("div",{role:"button",tabIndex:0,onClick:x,onKeyDown:p=>{p.key==="Enter"&&x()},className:`grid items-center gap-4 pr-3 cursor-pointer transition-colors ${c?"border-l-2 !border-l-accent pl-2.5":"pl-3"}`,style:{gridTemplateColumns:ee},children:[e.jsxs("div",{className:"flex items-center gap-1.5 min-w-0 py-1.5",children:[e.jsx("span",{className:"font-bold text-text-primary truncate text-xs",children:P(t)}),(((g=t.upstream_roles)==null?void 0:g.length)??0)>0&&e.jsx("span",{title:`Fed by ${t.upstream_roles.join(", ")}`,className:"shrink-0 leading-none",children:e.jsx(ve,{className:"w-3 h-3 text-text-quaternary"})})]}),e.jsx("span",{className:"font-mono text-[11px] text-text-tertiary truncate py-1.5",children:t.role}),e.jsxs("div",{className:"self-stretch flex items-stretch",children:[e.jsx("div",{className:"w-16 shrink-0 flex items-center justify-end px-1.5",style:{backgroundColor:z},children:e.jsx(V,{value:t.target_per_hour??null,onSave:f})}),e.jsx("div",{className:"w-16 shrink-0 flex items-center justify-end px-1.5",style:{backgroundColor:J},children:e.jsx(V,{value:t.sla_minutes??null,onSave:w})}),e.jsx("div",{className:"w-16 shrink-0 flex items-center justify-end px-3",style:{backgroundColor:X},children:e.jsx(b,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=available`,className:`text-xs font-mono tabular-nums hover:underline ${u>0?"text-text-primary font-semibold":"text-text-quaternary"}`,onClick:p=>p.stopPropagation(),children:u})}),e.jsx("div",{className:"w-16 shrink-0 flex items-center justify-end px-3",style:{backgroundColor:Y},children:e.jsx(b,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=claimed`,className:`text-xs font-mono tabular-nums hover:underline ${s>0?"font-semibold":"text-text-quaternary"}`,style:s>0?{color:I}:void 0,onClick:p=>p.stopPropagation(),children:s})}),e.jsx("div",{className:"w-16 shrink-0 flex items-center justify-end px-3",style:{backgroundColor:Z},children:e.jsx(b,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=resolved`,className:`text-xs font-mono tabular-nums hover:underline ${l>0?"text-text-secondary":"text-text-quaternary"}`,style:l>0?{color:T}:void 0,onClick:p=>p.stopPropagation(),children:l})})]}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary",children:B((n==null?void 0:n.wait.p99)??null)}),e.jsx("span",{className:"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary",children:B((n==null?void 0:n.work.p99)??null)}),e.jsxs("div",{className:"flex items-center gap-2 py-1.5",children:[e.jsx("div",{className:"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0",children:e.jsx("div",{className:`h-full rounded-full ${h}`,style:{width:`${N}%`}})}),e.jsx("span",{className:`text-[10px] font-mono tabular-nums ${r!=null&&r>100?"text-status-warning font-semibold":"text-text-quaternary"}`,children:r!=null?`${r}%`:"—"})]}),e.jsxs("div",{className:"flex items-center justify-center gap-2 py-1.5",children:[i>0&&e.jsx(b,{to:K(t),className:"text-status-error hover:opacity-70 transition-opacity",title:`${i} item${i===1?"":"s"} in jeopardy — pull oldest first`,onClick:p=>p.stopPropagation(),children:e.jsx(H,{className:"w-3.5 h-3.5",strokeWidth:2})}),e.jsx(b,{to:`/escalations/available?role=${encodeURIComponent(t.role)}&status=all`,className:"text-text-quaternary hover:text-accent transition-colors",title:"View all items in queue",onClick:p=>p.stopPropagation(),children:e.jsx(we,{className:"w-3.5 h-3.5"})})]})]})})}function W({n:t}){return t<=0?null:e.jsxs("span",{className:"inline-flex items-center gap-0.5 font-semibold tabular-nums",style:{color:C},title:`${t} in jeopardy`,children:[e.jsx(H,{className:"w-3 h-3",strokeWidth:2.25}),t>9?"9+":t]})}function Te({fragments:t,aggregates:n,activeOrigin:c,onSelect:x}){const[d,u]=m.useState(!1),s=m.useRef(null);m.useEffect(()=>{if(!d)return;const a=h=>{s.current&&!s.current.contains(h.target)&&u(!1)},r=h=>{h.key==="Escape"&&u(!1)};return document.addEventListener("mousedown",a),document.addEventListener("keydown",r),()=>{document.removeEventListener("mousedown",a),document.removeEventListener("keydown",r)}},[d]);const l=t.find(a=>a.origin.role===c)??t[0];if(!l)return null;const i=n.get(l.origin.role);return e.jsxs("div",{ref:s,className:"relative px-4 pt-2",children:[e.jsxs("button",{type:"button",onClick:()=>u(a=>!a),className:"group flex items-baseline gap-2.5","aria-expanded":d,"aria-haspopup":"listbox",children:[e.jsx("span",{className:"text-sm font-medium text-text-primary group-hover:text-accent transition-colors",children:P(l.origin)}),e.jsxs("span",{className:"text-[10px] font-mono text-text-quaternary tabular-nums",children:[(i==null?void 0:i.stations)??l.stations.length," station",((i==null?void 0:i.stations)??l.stations.length)===1?"":"s"," · ",(i==null?void 0:i.pending)??0," pending"]}),e.jsx(W,{n:(i==null?void 0:i.jeopardy)??0}),e.jsx(Ne,{className:`w-3.5 h-3.5 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${d?"rotate-180":""}`,strokeWidth:1.5})]}),d&&e.jsx("div",{role:"listbox",className:"absolute z-40 top-full left-4 mt-1.5 min-w-[20rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1",children:t.map(a=>{const r=n.get(a.origin.role),h=a.origin.role===l.origin.role;return e.jsxs("button",{type:"button",role:"option","aria-selected":h,onClick:()=>{x(a.origin.role),u(!1)},className:`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${h?"text-accent bg-accent/5":"text-text-primary hover:bg-surface-hover"}`,children:[e.jsx("span",{className:"text-xs font-medium truncate",children:P(a.origin)}),e.jsxs("span",{className:"ml-auto text-[10px] font-mono text-text-quaternary tabular-nums shrink-0",children:[(r==null?void 0:r.stations)??a.stations.length," st · ",(r==null?void 0:r.pending)??0," pending"]}),e.jsx("span",{className:"w-12 shrink-0 text-left text-[10px]",children:e.jsx(W,{n:(r==null?void 0:r.jeopardy)??0})})]},a.origin.role)})})]})}function Ae(){const t=[{label:"TARGET/H",band:z,hue:E,w:"w-16"},{label:"SLA/M",band:J,hue:Pe,w:"w-16"},{label:"PENDING",band:X,hue:G,w:"w-16",px:"px-3"},{label:"CLAIMED",band:Y,hue:I,w:"w-16",px:"px-3"},{label:"RESOLVED",band:Z,hue:T,w:"w-16",px:"px-3"}];return e.jsxs("div",{className:"grid items-center gap-4 px-3 border-b border-surface-border mb-0.5",style:{gridTemplateColumns:ee},children:[e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5",children:"NAME"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5",children:"ROLE"}),e.jsx("div",{className:"self-stretch flex items-stretch",children:t.map(n=>e.jsx("div",{className:`${n.w} shrink-0 flex items-center justify-end ${"px"in n?n.px:"px-1.5"}`,style:{backgroundColor:n.band},children:e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider",style:{color:n.hue},children:n.label})},n.label))}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-right",children:"P99 WAIT"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-right",children:"P99 WORK"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5",children:"TREND"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-center",children:"ACTIONS"})]})}function Me(){var D;const[t,n]=m.useState("1h"),[c,x]=m.useState(null),[d,u]=m.useState(!1);me();const{data:s,isLoading:l,refetch:i}=de(),{data:a,isLoading:r,refetch:h}=F(t),N=(s==null?void 0:s.roles)??[],f=(a==null?void 0:a.stations)??[],w=m.useMemo(()=>{const o=new Map(f.map(y=>[y.role,y])),j=new Map;for(const y of L((s==null?void 0:s.roles)??[])){let S=0,U=0;for(const xe of y.stations){const R=o.get(xe.role.role);S+=(R==null?void 0:R.pending)??0,U+=(R==null?void 0:R.priority_count)??0}j.set(y.origin.role,{stations:y.stations.length,pending:S,jeopardy:U})}return j},[f,s]),g=m.useMemo(()=>L(N),[N]),[p,_]=ke(),te=p.get("fragment"),k=g.find(o=>o.origin.role===te)??g[0]??null,O=m.useCallback(o=>{x(null),_(j=>{const y=new URLSearchParams(j);return y.set("fragment",o),y})},[_]),v=(k==null?void 0:k.stations)??[],A=m.useMemo(()=>new Set(v.map(({role:o})=>o.role)),[v]),se=m.useMemo(()=>f.filter(o=>A.has(o.role)),[f,A]),ne=m.useMemo(()=>v.map(({role:o})=>({role:o.role,title:o.title,parent_role:o.parent_role,target_per_hour:o.target_per_hour??null,upstream_roles:o.upstream_roles??[],metric:f.find(j=>j.role===o.role)})),[v,f]),ae=m.useCallback(o=>{const j=g.find(y=>y.stations.some(({role:S})=>S.role===o));j&&O(j.origin.role)},[g,O]),re=Re(),oe=((D=v.find(({role:o})=>o.role===c))==null?void 0:D.role)??null,le=l||r,ie=async()=>{u(!0),await Promise.all([i(),h()]),u(!1)},M=o=>x(j=>j===o?null:o),ce=e.jsx("div",{className:"flex items-center gap-0.5",children:Ee.map(o=>e.jsx("button",{onClick:()=>n(o),className:`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${t===o?"bg-accent/10 text-accent font-semibold":"text-text-quaternary hover:text-text-secondary"}`,children:o},o))});return e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[e.jsx(he,{title:"Pace Board",docsHash:"#docs:dashboard.md:pace-board",center:ce,actions:e.jsx("button",{onClick:ie,disabled:d,className:"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40",children:e.jsx(be,{className:`w-3.5 h-3.5 ${d?"animate-spin":""}`})})}),le?e.jsxs("div",{className:"animate-pulse space-y-6 mt-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded w-full"}),e.jsx("div",{className:"space-y-3",children:[1,2,3].map(o=>e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-full"},o))})]}):g.length===0?e.jsxs("div",{className:"mt-8",children:[e.jsx("p",{className:"text-sm text-text-secondary mb-2",children:"Stations appear here once roles are marked visible in Operations."}),e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Go to"," ",e.jsx(b,{to:"/admin/roles",className:"text-accent hover:underline",children:"Roles"})," ","and enable ",e.jsx("strong",{children:"Visible in Operations"})," on roles that represent pipeline stations."]})]}):e.jsxs("div",{className:"flex flex-col flex-1 min-h-0",children:[g.length>1&&e.jsx(Te,{fragments:g,aggregates:w,activeOrigin:(k==null?void 0:k.origin.role)??null,onSelect:O}),e.jsxs("div",{className:"flex-1 min-h-[40vh] flex items-stretch overflow-hidden",children:[e.jsx("div",{className:"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4",children:e.jsx(ue,{stations:ne,selectedRole:c,onSelect:M,onUpstreamSelect:ae,onCmdClick:o=>re(`/escalations/available?role=${encodeURIComponent(o)}`),periodHours:Oe[t]})}),e.jsx("div",{className:"w-px bg-surface-border shrink-0 self-stretch"}),e.jsx(qe,{role:oe,allMetrics:se,orderedRoles:v.map(o=>o.role),globalPeriod:t,onClose:()=>x(null)})]}),e.jsxs("div",{className:"max-h-[30vh] flex-none flex flex-col border-t border-surface-border overflow-hidden",children:[e.jsx(Ae,{}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30",children:v.map(({role:o})=>e.jsx(Ie,{role:o,metric:f.find(j=>j.role===o.role),selected:c===o.role,onClick:()=>M(o.role)},o.role))})]})]})]})}const Ge=Object.freeze(Object.defineProperty({__proto__:null,OperationsPage:Me,buildFragments:L},Symbol.toStringTag,{value:"Module"}));export{Ge as O,L as b,K as j};
|
|
2
|
-
//# sourceMappingURL=OperationsPage-D37cZ8Qh.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperationsPage-D37cZ8Qh.js","sources":["../../src/pages/operations/priority-link.ts","../../src/pages/operations/StationDetailPanel.tsx","../../src/pages/operations/OperationsPage.tsx"],"sourcesContent":["import type { RoleDetail } from '../../api/roles';\n\n/**\n * The jeopardy deep link — the plant manager's \"focus on exactly these n items\".\n * One builder for every jeopardy pill (Pace Board chart, Home mini board, the\n * operator's Task Queue cards), producing a URL that reproduces the pill's set\n * precisely:\n *\n * - `jeopardy=1` — the server-side threshold predicate (the SAME expression\n * that produced the pill's count), so the list total equals the pill.\n * - `orderBy` on the role's age origin, ascending — oldest first. The metadata\n * facet when configured, else created_at; the sort control labels the field.\n * - `view=table` — a discrete, countable list, never the timeline.\n */\nexport function jeopardyQueueLink(role: Pick<RoleDetail, 'role' | 'priority_facet'>): string {\n const field = role.priority_facet ? `metadata.${role.priority_facet}` : 'created_at';\n const orderBy = JSON.stringify([{ field, direction: 'asc' }]);\n return `/escalations/available?role=${encodeURIComponent(role.role)}&jeopardy=1&view=table&orderBy=${encodeURIComponent(orderBy)}`;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, ExternalLink, Settings, List } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport type { RoleDetail } from '../../api/roles';\nimport { PRIORITY_TEXT_COLOR } from './PaceChart';\nimport { jeopardyQueueLink } from './priority-link';\nimport { displayRoleTitle } from '../../lib/role-display';\n\ninterface StationDetailPanelProps {\n role: RoleDetail | null;\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n globalPeriod: string;\n onClose: () => void;\n}\n\n// Mirrors OperationsPage's selector — the panel reports the same windows the\n// chart can show, and opens on whichever one the chart has selected.\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\nconst isPeriod = (p: string): p is Period => (PERIODS as readonly string[]).includes(p);\n\nfunction fmt(min: number | null): string {\n if (min == null) return '—';\n if (min < 1) {\n const s = Math.round(min * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (min < 60) return `${min.toFixed(0)}m`;\n return `${(min / 60).toFixed(1)}h`;\n}\n\nfunction MetricRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider\">{label}</span>\n <span className=\"text-xs font-mono font-medium text-text-primary tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction PeriodSelector({ period, onChange }: { period: Period; onChange: (p: Period) => void }) {\n return (\n <div className=\"flex items-center gap-1 mb-4\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => onChange(p)}\n className={`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RoleView({ role, globalPeriod, onClose }: { role: RoleDetail; globalPeriod: string; onClose: () => void }) {\n // Open on the chart's selected window so the panel's numbers agree with the\n // chart beside it; the local selector still lets the viewer drill around.\n const [period, setPeriod] = useState<Period>(isPeriod(globalPeriod) ? globalPeriod : '24h');\n const { data } = useStationMetrics(period);\n const metric = data?.stations.find((s) => s.role === role.role);\n const slaMinutes = role.sla_minutes ?? undefined;\n const targetPerHour = role.target_per_hour ?? undefined;\n const workerCount = role.worker_count ?? undefined;\n\n return (\n <>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-1.5 flex-wrap\">\n <span className=\"text-sm font-bold text-text-primary\">{displayRoleTitle(role)}</span>\n <span className=\"text-[10px] font-mono text-text-secondary\">{role.role}</span>\n </div>\n {role.description && (\n <p className=\"text-[10px] text-text-tertiary mt-1 line-clamp-2 leading-relaxed\">\n {role.description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"flex items-center gap-3 mb-6\">\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline\"\n >\n <Settings className=\"w-2.5 h-2.5\" />\n Edit in Roles\n </Link>\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline\"\n >\n <List className=\"w-2.5 h-2.5\" />\n View full queue\n </Link>\n </div>\n\n <PeriodSelector period={period} onChange={setPeriod} />\n\n {/* Capacity settings */}\n {(targetPerHour || slaMinutes || workerCount) && (\n <div className=\"flex items-center gap-6 mb-6 text-[10px] border-b border-surface-border/30 pb-5\">\n {targetPerHour && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary text-sm\">{targetPerHour}/h</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5\">target</div>\n </div>\n )}\n {slaMinutes && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary text-sm\">{slaMinutes}m</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5\">SLA</div>\n </div>\n )}\n {workerCount && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary text-sm\">{workerCount}</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px] mt-0.5\">workers</div>\n </div>\n )}\n </div>\n )}\n\n {/* Two-column wait / work grid */}\n <div className=\"grid grid-cols-2 gap-x-4 mb-2\">\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-2\">Wait (queue)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.wait.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.wait.avg ?? null)} />\n </div>\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-2\">Work (proc.)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.work.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.work.avg ?? null)} />\n </div>\n </div>\n\n {/* SLA + priority */}\n <div className=\"border-t border-surface-border/40 pt-4 mt-5 space-y-2.5\">\n {slaMinutes && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary\">SLA target</span>\n <span className=\"text-xs font-mono text-text-secondary\">{slaMinutes}m</span>\n </div>\n )}\n {metric && metric.priority_count > 0 && (\n <Link\n to={jeopardyQueueLink(role)}\n className=\"flex items-center justify-between group\"\n >\n <span className=\"text-[10px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {metric.priority_count} in jeopardy — pull oldest first\n </span>\n <ExternalLink className=\"w-3 h-3 transition-colors\" style={{ color: PRIORITY_TEXT_COLOR }} />\n </Link>\n )}\n </div>\n\n </>\n );\n}\n\nfunction OverviewPanel({\n allMetrics,\n orderedRoles,\n period,\n}: {\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n period: string;\n}) {\n const totalPending = allMetrics.reduce((s, m) => s + m.pending, 0);\n const totalResolved = allMetrics.reduce((s, m) => s + m.resolved, 0);\n const totalPriority = allMetrics.reduce((s, m) => s + m.priority_count, 0);\n\n const metricByRole = new Map(allMetrics.map((m) => [m.role, m]));\n const stationsAtRisk = allMetrics.filter((m) => m.priority_count > 0).length;\n const stationsWithLoad = allMetrics.filter((m) => m.pending > 0).length;\n\n return (\n <>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-3\">\n Pipeline · {period}\n </p>\n\n {/* Health headline */}\n <div className=\"mb-4\">\n {stationsAtRisk > 0 ? (\n <p className=\"text-[11px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {stationsAtRisk} station{stationsAtRisk > 1 ? 's' : ''} with items in jeopardy\n </p>\n ) : stationsWithLoad > 0 ? (\n <p className=\"text-[11px] text-status-warning\">\n {stationsWithLoad} station{stationsWithLoad > 1 ? 's' : ''} with backlog\n </p>\n ) : totalResolved > 0 ? (\n <p className=\"text-[11px] text-status-success\">Flowing — queue clear</p>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">Quiet — awaiting work</p>\n )}\n </div>\n\n {/* Key counters */}\n <div className=\"space-y-1.5 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Pending</span>\n <span className={`text-xs font-mono tabular-nums ${totalPending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'}`}>\n {totalPending}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Resolved · {period}</span>\n <span className=\"text-xs font-mono tabular-nums text-text-secondary\">{totalResolved}</span>\n </div>\n {totalPriority > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Priority</span>\n <span className=\"text-xs font-mono tabular-nums font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {totalPriority}\n </span>\n </div>\n )}\n </div>\n\n {/* Divider + column headers */}\n <div className=\"border-t border-surface-border/40 pt-2 mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider flex-1\">Station</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">pend</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">clmd</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">res</span>\n </div>\n </div>\n\n {/* Station list in pipeline order */}\n <div className=\"space-y-0.5\">\n {orderedRoles.map((r) => {\n const m = metricByRole.get(r.role);\n const pending = m?.pending ?? 0;\n const claimed = m?.claimed ?? 0;\n const resolved = m?.resolved ?? 0;\n const priorityCount = m?.priority_count ?? 0;\n const label = r.title || r.role;\n const hasAlert = priorityCount > 0;\n const hasLoad = pending > 0;\n\n return (\n <div key={r.role} className=\"flex items-center gap-2 py-0.5\">\n <span\n className={`text-[10px] font-mono flex-1 truncate ${\n hasLoad ? 'text-text-primary' : 'text-text-quaternary'\n }`}\n >\n {label}\n {hasAlert && (\n <span className=\"ml-1 text-[8px] font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {priorityCount} PRIORITY\n </span>\n )}\n </span>\n <span\n className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${\n hasLoad ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending > 0 ? pending : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${claimed > 0 ? 'text-accent font-semibold' : 'text-text-quaternary'}`}>\n {claimed > 0 ? claimed : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'}`}>\n {resolved > 0 ? resolved : '—'}\n </span>\n </div>\n );\n })}\n </div>\n\n <p className=\"text-[9px] text-text-quaternary mt-5\">\n Select a station for queue detail.\n </p>\n </>\n );\n}\n\nexport function StationDetailPanel({\n role,\n allMetrics,\n orderedRoles,\n globalPeriod,\n onClose,\n}: StationDetailPanelProps) {\n return (\n <div className=\"w-[280px] shrink-0 px-7 py-10 flex flex-col overflow-y-auto min-h-0\">\n {role ? (\n <RoleView role={role} globalPeriod={globalPeriod} onClose={onClose} />\n ) : (\n <OverviewPanel allMetrics={allMetrics} orderedRoles={orderedRoles} period={globalPeriod} />\n )}\n </div>\n );\n}\n","import { useState, useEffect, useMemo, useCallback, useRef } from 'react';\nimport { Link, useNavigate, useSearchParams } from 'react-router-dom';\nimport { GitMerge, RefreshCw, Eye, TriangleAlert, ChevronDown } from 'lucide-react';\nimport { useRoleDetails, useUpdateRole, type RoleDetail } from '../../api/roles';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport { useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport {\n PaceChart,\n ACTIVE_COLOR,\n QUEUED_COLOR,\n RESOLVED_COLOR,\n TARGET_COLOR,\n PRIORITY_TEXT_COLOR,\n type ChartStation,\n} from './PaceChart';\nimport { StationDetailPanel } from './StationDetailPanel';\nimport { jeopardyQueueLink } from './priority-link';\nimport { displayRoleTitle } from '../../lib/role-display';\n\n// Column band tints — same hues as the chart bands (~8% alpha).\n// Semantic palette: pending=sky, claimed=orange, resolved=green, target=slate, sla=amber.\nconst SLA_COLOR = TARGET_COLOR;\nconst TARGET_BAND = `${TARGET_COLOR}18`;\nconst SLA_BAND = `${TARGET_COLOR}18`;\nconst PENDING_BAND = `${QUEUED_COLOR}14`;\nconst ACTIVE_BAND = `${ACTIVE_COLOR}14`;\nconst RESOLVED_BAND = `${RESOLVED_COLOR}14`;\n\n// Station table grid. The 5 colored columns are grouped into a single auto\n// cell rendered as a flex row with no internal gap so they touch each other.\nconst STATION_GRID_COLS = 'minmax(120px, 1.1fr) minmax(100px, 0.9fr) auto 72px 72px 104px 36px';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n// Window length in hours — used to express the target as a count for the\n// selected window (target_per_hour × hours), e.g. 22/h over 15m ≈ 5 expected.\nconst PERIOD_HOURS: Record<Period, number> = {\n '15m': 0.25,\n '1h': 1,\n '24h': 24,\n '7d': 168,\n '30d': 720,\n};\n\ninterface OrderedStation {\n role: RoleDetail;\n depth: number;\n}\n\n/**\n * One sequence of stations, named by its origin role. Execution is a graph;\n * each fragment is the human-readable line the user composed via parent_role.\n * Cross-fragment edges live in upstream_roles and render as a merge affordance\n * on the chart, never as a bend in the line.\n */\ninterface SequenceFragment {\n origin: RoleDetail;\n stations: OrderedStation[];\n}\n\n// ── Fragment builder — BFS per parent_role root, tracking actual depth ────────\n\nexport function buildFragments(roles: RoleDetail[]): SequenceFragment[] {\n const opsRoles = roles.filter((r) => r.ops_visible);\n const roleMap = new Map(opsRoles.map((r) => [r.role, r]));\n const visited = new Set<string>();\n\n // Roots: no parent, or parent not in ops set — each roots its own fragment.\n const roots = opsRoles.filter((r) => !r.parent_role || !roleMap.has(r.parent_role));\n\n const fragments: SequenceFragment[] = roots.map((root) => {\n const stations: OrderedStation[] = [];\n const queue: OrderedStation[] = [{ role: root, depth: 0 }];\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.role.role)) continue;\n visited.add(item.role.role);\n stations.push(item);\n opsRoles\n .filter((c) => c.parent_role === item.role.role && !visited.has(c.role))\n .forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));\n }\n return { origin: root, stations };\n });\n\n // Unreachable (cycles / dangling) — each stands alone rather than vanishing.\n opsRoles\n .filter((r) => !visited.has(r.role))\n .forEach((r) => fragments.push({ origin: r, stations: [{ role: r, depth: 0 }] }));\n\n // Longest line first — the primary sequence leads; side-quests follow.\n return fragments.sort(\n (a, b) => b.stations.length - a.stations.length || a.origin.role.localeCompare(b.origin.role),\n );\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction fmtMin(v: number | null): string {\n if (v == null) return '—';\n if (v < 1) {\n const s = Math.round(v * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (v < 60) return `${v.toFixed(0)}m`;\n return `${(v / 60).toFixed(1)}h`;\n}\n\nfunction loadBar(pending: number, target: number | null) {\n // No target, or nothing pending — there is no live load to trend. Show the\n // empty state rather than inventing a rate from historical throughput.\n if (!target || pending === 0) return { pct: null, color: 'bg-surface-border' };\n\n const ratio = pending / target;\n const pct = Math.round(ratio * 100);\n // Amber: backlog. Orange: some work but well under pace. Green: healthy.\n const color = ratio > 1.0 ? 'bg-status-warning' : ratio < 0.2 ? 'bg-status-draft' : 'bg-status-success';\n return { pct, color };\n}\n\n// ── Editable numeric cell ─────────────────────────────────────────────────────\n\nfunction EditableNumber({ value, onSave }: { value: number | null; onSave: (n: number | null) => void }) {\n const [local, setLocal] = useState(value != null ? String(value) : '');\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const commit = (val: string) => {\n const n = parseInt(val, 10);\n onSave(!val.trim() || isNaN(n) || n < 0 ? null : n);\n };\n\n return (\n <input\n type=\"number\"\n min={0}\n step={1}\n value={local}\n onChange={(e) => {\n const val = e.target.value;\n setLocal(val);\n clearTimeout(timer.current);\n timer.current = setTimeout(() => commit(val), 400);\n }}\n onBlur={(e) => { clearTimeout(timer.current); commit(e.target.value); }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"w-full bg-transparent text-xs font-mono tabular-nums text-right focus:outline-none\"\n />\n );\n}\n\n// ── Station table row ─────────────────────────────────────────────────────────\n\nfunction StationRow({\n role,\n metric,\n selected,\n onClick,\n}: {\n role: RoleDetail;\n metric: StationMetric | undefined;\n selected: boolean;\n onClick: () => void;\n}) {\n const updateRole = useUpdateRole();\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const priorityCount = metric?.priority_count ?? 0;\n const target = role.target_per_hour ?? null;\n const { pct, color } = loadBar(pending, target);\n const barWidth = pct != null ? Math.min(100, pct) : 0;\n\n const saveTarget = (n: number | null) => updateRole.mutate({ role: role.role, target_per_hour: n });\n const saveSla = (n: number | null) => updateRole.mutate({ role: role.role, sla_minutes: n });\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter') onClick(); }}\n className={`grid items-center gap-4 pr-3 cursor-pointer transition-colors ${\n selected ? 'border-l-2 !border-l-accent pl-2.5' : 'pl-3'\n }`}\n style={{ gridTemplateColumns: STATION_GRID_COLS }}\n >\n {/* Name — user-set title, or derived from the role id */}\n <div className=\"flex items-center gap-1.5 min-w-0 py-1.5\">\n <span className=\"font-bold text-text-primary truncate text-xs\">\n {displayRoleTitle(role)}\n </span>\n {(role.upstream_roles?.length ?? 0) > 0 && (\n <span title={`Fed by ${role.upstream_roles.join(', ')}`} className=\"shrink-0 leading-none\">\n <GitMerge className=\"w-3 h-3 text-text-quaternary\" />\n </span>\n )}\n </div>\n\n {/* Role id */}\n <span className=\"font-mono text-[11px] text-text-tertiary truncate py-1.5\">\n {role.role}\n </span>\n\n {/* ── 5 colored columns in one touching flex group ── */}\n <div className=\"self-stretch flex items-stretch\">\n {/* Target/h — editable, slate band */}\n <div className=\"w-16 shrink-0 flex items-center justify-end px-1.5\" style={{ backgroundColor: TARGET_BAND }}>\n <EditableNumber value={role.target_per_hour ?? null} onSave={saveTarget} />\n </div>\n {/* SLA/m — editable, amber band */}\n <div className=\"w-16 shrink-0 flex items-center justify-end px-1.5\" style={{ backgroundColor: SLA_BAND }}>\n <EditableNumber value={role.sla_minutes ?? null} onSave={saveSla} />\n </div>\n {/* Pending — sky band */}\n <div className=\"w-16 shrink-0 flex items-center justify-end px-3\" style={{ backgroundColor: PENDING_BAND }}>\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=available`}\n className={`text-xs font-mono tabular-nums hover:underline ${\n pending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n onClick={(e) => e.stopPropagation()}\n >\n {pending}\n </Link>\n </div>\n {/* Claimed — orange band */}\n <div className=\"w-16 shrink-0 flex items-center justify-end px-3\" style={{ backgroundColor: ACTIVE_BAND }}>\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=claimed`}\n className={`text-xs font-mono tabular-nums hover:underline ${\n claimed > 0 ? 'font-semibold' : 'text-text-quaternary'\n }`}\n style={claimed > 0 ? { color: ACTIVE_COLOR } : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n {claimed}\n </Link>\n </div>\n {/* Resolved — green band */}\n <div className=\"w-16 shrink-0 flex items-center justify-end px-3\" style={{ backgroundColor: RESOLVED_BAND }}>\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=resolved`}\n className={`text-xs font-mono tabular-nums hover:underline ${\n resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'\n }`}\n style={resolved > 0 ? { color: RESOLVED_COLOR } : undefined}\n onClick={(e) => e.stopPropagation()}\n >\n {resolved}\n </Link>\n </div>\n </div>\n\n {/* P99 wait */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.wait.p99 ?? null)}\n </span>\n\n {/* P99 work */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.work.p99 ?? null)}\n </span>\n\n {/* Load mini-bar */}\n <div className=\"flex items-center gap-2 py-1.5\">\n <div className=\"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0\">\n <div className={`h-full rounded-full ${color}`} style={{ width: `${barWidth}%` }} />\n </div>\n <span\n className={`text-[10px] font-mono tabular-nums ${\n pct != null && pct > 100\n ? 'text-status-warning font-semibold'\n : 'text-text-quaternary'\n }`}\n >\n {pct != null ? `${pct}%` : '—'}\n </span>\n </div>\n\n {/* Actions — jeopardy first (the hard-limit alarm, hover names the\n count, click opens the exact counted set oldest-first), then the\n full-queue view. */}\n <div className=\"flex items-center justify-center gap-2 py-1.5\">\n {priorityCount > 0 && (\n <Link\n to={jeopardyQueueLink(role)}\n className=\"text-status-error hover:opacity-70 transition-opacity\"\n title={`${priorityCount} item${priorityCount === 1 ? '' : 's'} in jeopardy — pull oldest first`}\n onClick={(e) => e.stopPropagation()}\n >\n <TriangleAlert className=\"w-3.5 h-3.5\" strokeWidth={2} />\n </Link>\n )}\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}&status=all`}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"View all items in queue\"\n onClick={(e) => e.stopPropagation()}\n >\n <Eye className=\"w-3.5 h-3.5\" />\n </Link>\n </div>\n </div>\n </>\n );\n}\n\n// ── Sequence menu ─────────────────────────────────────────────────────────────\n\ninterface SequenceAggregate {\n stations: number;\n pending: number;\n jeopardy: number;\n}\n\n/** Red jeopardy count, capped at 9+ — the same shorthand as the queue pills. */\nfunction JeopardyCount({ n }: { n: number }) {\n if (n <= 0) return null;\n return (\n <span\n className=\"inline-flex items-center gap-0.5 font-semibold tabular-nums\"\n style={{ color: PRIORITY_TEXT_COLOR }}\n title={`${n} in jeopardy`}\n >\n <TriangleAlert className=\"w-3 h-3\" strokeWidth={2.25} />\n {n > 9 ? '9+' : n}\n </span>\n );\n}\n\n/**\n * The segment selector for the 30k-foot view — compact at any segment count.\n * Collapsed, it names the ACTIVE sequence large with its aggregate story\n * (stations · pending · jeopardy) and a caret; expanded, it lists every\n * sequence with the same breakdown so trouble in an unselected segment is\n * visible from here and one click away. Metrics span every visible role, so\n * the numbers are live for all segments, not just the chosen one.\n */\nfunction SequenceMenu({ fragments, aggregates, activeOrigin, onSelect }: {\n fragments: SequenceFragment[];\n aggregates: Map<string, SequenceAggregate>;\n activeOrigin: string | null;\n onSelect: (origin: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const active = fragments.find((f) => f.origin.role === activeOrigin) ?? fragments[0];\n if (!active) return null;\n const agg = aggregates.get(active.origin.role);\n\n return (\n <div ref={ref} className=\"relative px-4 pt-2\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"group flex items-baseline gap-2.5\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n >\n <span className=\"text-sm font-medium text-text-primary group-hover:text-accent transition-colors\">\n {displayRoleTitle(active.origin)}\n </span>\n <span className=\"text-[10px] font-mono text-text-quaternary tabular-nums\">\n {agg?.stations ?? active.stations.length} station{(agg?.stations ?? active.stations.length) === 1 ? '' : 's'} · {agg?.pending ?? 0} pending\n </span>\n <JeopardyCount n={agg?.jeopardy ?? 0} />\n <ChevronDown\n className={`w-3.5 h-3.5 self-center shrink-0 text-text-tertiary group-hover:text-accent transition-transform ${open ? 'rotate-180' : ''}`}\n strokeWidth={1.5}\n />\n </button>\n\n {open && (\n <div\n role=\"listbox\"\n className=\"absolute z-40 top-full left-4 mt-1.5 min-w-[20rem] max-h-80 overflow-y-auto bg-surface-raised border border-surface-border rounded-md shadow-lg py-1\"\n >\n {fragments.map((f) => {\n const a = aggregates.get(f.origin.role);\n const isActive = f.origin.role === active.origin.role;\n return (\n <button\n key={f.origin.role}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => { onSelect(f.origin.role); setOpen(false); }}\n className={`w-full text-left px-3 py-1.5 flex items-baseline gap-2.5 transition-colors ${\n isActive ? 'text-accent bg-accent/5' : 'text-text-primary hover:bg-surface-hover'\n }`}\n >\n <span className=\"text-xs font-medium truncate\">{displayRoleTitle(f.origin)}</span>\n <span className=\"ml-auto text-[10px] font-mono text-text-quaternary tabular-nums shrink-0\">\n {a?.stations ?? f.stations.length} st · {a?.pending ?? 0} pending\n </span>\n {/* Fixed-width, left-aligned jeopardy column: every ⚠ starts at\n the same x, so the icons stack vertically whether the count\n is 1 or 9+. */}\n <span className=\"w-12 shrink-0 text-left text-[10px]\">\n <JeopardyCount n={a?.jeopardy ?? 0} />\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nfunction TableHead() {\n const coloredCols = [\n { label: 'TARGET/H', band: TARGET_BAND, hue: TARGET_COLOR, w: 'w-16' },\n { label: 'SLA/M', band: SLA_BAND, hue: SLA_COLOR, w: 'w-16' },\n { label: 'PENDING', band: PENDING_BAND, hue: QUEUED_COLOR, w: 'w-16', px: 'px-3' },\n { label: 'CLAIMED', band: ACTIVE_BAND, hue: ACTIVE_COLOR, w: 'w-16', px: 'px-3' },\n { label: 'RESOLVED', band: RESOLVED_BAND, hue: RESOLVED_COLOR, w: 'w-16', px: 'px-3' },\n ];\n return (\n <div\n className=\"grid items-center gap-4 px-3 border-b border-surface-border mb-0.5\"\n style={{ gridTemplateColumns: STATION_GRID_COLS }}\n >\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5\">NAME</span>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5\">ROLE</span>\n\n {/* Touching colored column group */}\n <div className=\"self-stretch flex items-stretch\">\n {coloredCols.map((col) => (\n <div\n key={col.label}\n className={`${col.w} shrink-0 flex items-center justify-end ${'px' in col ? col.px : 'px-1.5'}`}\n style={{ backgroundColor: col.band }}\n >\n <span className=\"text-[9px] font-semibold uppercase tracking-wider\" style={{ color: col.hue }}>\n {col.label}\n </span>\n </div>\n ))}\n </div>\n\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-right\">P99 WAIT</span>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-right\">P99 WORK</span>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5\">TREND</span>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 text-center\">ACTIONS</span>\n </div>\n );\n}\n\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function OperationsPage() {\n // 1h default: long enough to show a whole simulation shift's shape,\n // short enough that stale history doesn't drown the current run.\n const [period, setPeriod] = useState<Period>('1h');\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n // Push-driven refresh: every escalation event invalidates ['stationMetrics']\n // through the central event system (debounced, transport-agnostic). The\n // header's refresh button covers user-initiated reloads.\n useStationMetricsEvents();\n\n const { data: roleData, isLoading: rolesLoading, refetch: refetchRoles } = useRoleDetails();\n const {\n data: metricsData,\n isLoading: metricsLoading,\n refetch: refetchMetrics,\n } = useStationMetrics(period);\n\n const roles = roleData?.roles ?? [];\n const metrics = metricsData?.stations ?? [];\n\n // Per-sequence aggregates for the segment menu — computed over ALL visible\n // roles, so unselected segments report their live pending/jeopardy too.\n const fragmentAggregates = useMemo(() => {\n const metricByRole = new Map(metrics.map((m) => [m.role, m]));\n const out = new Map<string, SequenceAggregate>();\n for (const f of buildFragments(roleData?.roles ?? [])) {\n let pending = 0, jeopardy = 0;\n for (const s of f.stations) {\n const m = metricByRole.get(s.role.role);\n pending += m?.pending ?? 0;\n jeopardy += m?.priority_count ?? 0;\n }\n out.set(f.origin.role, { stations: f.stations.length, pending, jeopardy });\n }\n return out;\n }, [metrics, roleData]);\n\n // Sequence fragments, one per parent_role root. The active one is\n // DEEP-LINKED (?fragment=<origin role>) and each switch is a history entry,\n // so a shared link opens the same sequence and back/forward walks them.\n const fragments = useMemo((): SequenceFragment[] => buildFragments(roles), [roles]);\n const [searchParams, setSearchParams] = useSearchParams();\n const fragmentParam = searchParams.get('fragment');\n const activeFragment =\n fragments.find((f) => f.origin.role === fragmentParam) ?? fragments[0] ?? null;\n const selectFragment = useCallback(\n (origin: string) => {\n setSelectedRole(null);\n setSearchParams((prev) => {\n const p = new URLSearchParams(prev);\n p.set('fragment', origin);\n return p;\n });\n },\n [setSearchParams],\n );\n\n const ordered = activeFragment?.stations ?? [];\n const fragmentRoleSet = useMemo(\n () => new Set(ordered.map(({ role }) => role.role)),\n [ordered],\n );\n const fragmentMetrics = useMemo(\n () => metrics.filter((m) => fragmentRoleSet.has(m.role)),\n [metrics, fragmentRoleSet],\n );\n\n const chartStations = useMemo(\n (): ChartStation[] =>\n ordered.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n upstream_roles: r.upstream_roles ?? [],\n metric: metrics.find((m) => m.role === r.role),\n })),\n [ordered, metrics],\n );\n\n // Jump to the sequence that feeds this station — the merge glyph's click.\n const handleUpstreamSelect = useCallback(\n (upstreamRole: string) => {\n const target = fragments.find((f) =>\n f.stations.some(({ role }) => role.role === upstreamRole),\n );\n if (target) selectFragment(target.origin.role);\n },\n [fragments, selectFragment],\n );\n\n const navigate = useNavigate();\n\n const selectedRoleDetail =\n ordered.find(({ role }) => role.role === selectedRole)?.role ?? null;\n\n const isLoading = rolesLoading || metricsLoading;\n\n const handleRefresh = async () => {\n setRefreshing(true);\n await Promise.all([refetchRoles(), refetchMetrics()]);\n setRefreshing(false);\n };\n\n const handleSelect = (role: string) =>\n setSelectedRole((prev) => (prev === role ? null : role));\n\n const periodSelector = (\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <PageHeader\n title=\"Pace Board\"\n docsHash=\"#docs:dashboard.md:pace-board\"\n center={periodSelector}\n actions={\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n }\n />\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-6 mt-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded w-full\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-8 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n </div>\n ) : fragments.length === 0 ? (\n <div className=\"mt-8\">\n <p className=\"text-sm text-text-secondary mb-2\">Stations appear here once roles are marked visible in Operations.</p>\n <p className=\"text-xs text-text-tertiary\">\n Go to{' '}\n <Link to=\"/admin/roles\" className=\"text-accent hover:underline\">\n Roles\n </Link>{' '}\n and enable <strong>Visible in Operations</strong> on roles that represent pipeline\n stations.\n </p>\n </div>\n ) : (\n /* Console layout: fixed header (above) → chart row (min 40vh) → table row (max 30vh) */\n <div className=\"flex flex-col flex-1 min-h-0\">\n\n {/* Sequence menu — the active segment named large with its aggregate\n story; the caret opens the full segment list. Compact at any\n segment count. Only rendered when there is more than one story\n to tell. */}\n {fragments.length > 1 && (\n <SequenceMenu\n fragments={fragments}\n aggregates={fragmentAggregates}\n activeOrigin={activeFragment?.origin.role ?? null}\n onSelect={selectFragment}\n />\n )}\n\n {/* Middle row: flexible, never below 40vh — SVG fills left, sidebar fixed-width right */}\n <div className=\"flex-1 min-h-[40vh] flex items-stretch overflow-hidden\">\n {/* SVG chart — scales to fill available space */}\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4\">\n <PaceChart\n stations={chartStations}\n selectedRole={selectedRole}\n onSelect={handleSelect}\n onUpstreamSelect={handleUpstreamSelect}\n onCmdClick={(role) => navigate(`/escalations/available?role=${encodeURIComponent(role)}`)}\n periodHours={PERIOD_HOURS[period]}\n />\n </div>\n {/* Vertical divider */}\n <div className=\"w-px bg-surface-border shrink-0 self-stretch\" />\n {/* Right sidebar — fixed width, scrolls its own content */}\n <StationDetailPanel\n role={selectedRoleDetail}\n allMetrics={fragmentMetrics}\n orderedRoles={ordered.map((o) => o.role)}\n globalPeriod={period}\n onClose={() => setSelectedRole(null)}\n />\n </div>\n\n {/* Bottom row: sized to its rows up to 30vh — header sticky, rows scroll */}\n <div className=\"max-h-[30vh] flex-none flex flex-col border-t border-surface-border overflow-hidden\">\n <TableHead />\n <div className=\"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30\">\n {ordered.map(({ role }) => (\n <StationRow\n key={role.role}\n role={role}\n metric={metrics.find((m) => m.role === role.role)}\n selected={selectedRole === role.role}\n onClick={() => handleSelect(role.role)}\n />\n ))}\n </div>\n </div>\n\n </div>\n )}\n </div>\n );\n}\n"],"names":["jeopardyQueueLink","role","field","orderBy","PERIODS","isPeriod","p","fmt","min","s","MetricRow","label","value","jsxs","jsx","PeriodSelector","period","onChange","RoleView","globalPeriod","onClose","setPeriod","useState","data","useStationMetrics","metric","slaMinutes","targetPerHour","workerCount","Fragment","displayRoleTitle","X","Link","Settings","List","PRIORITY_TEXT_COLOR","ExternalLink","OverviewPanel","allMetrics","orderedRoles","totalPending","m","totalResolved","totalPriority","metricByRole","stationsAtRisk","stationsWithLoad","r","pending","claimed","resolved","priorityCount","hasAlert","hasLoad","StationDetailPanel","SLA_COLOR","TARGET_COLOR","TARGET_BAND","SLA_BAND","PENDING_BAND","QUEUED_COLOR","ACTIVE_BAND","ACTIVE_COLOR","RESOLVED_BAND","RESOLVED_COLOR","STATION_GRID_COLS","PERIOD_HOURS","buildFragments","roles","opsRoles","roleMap","visited","fragments","root","stations","queue","item","c","a","b","fmtMin","v","loadBar","target","ratio","pct","color","EditableNumber","onSave","local","setLocal","timer","useRef","commit","val","n","e","StationRow","selected","onClick","updateRole","useUpdateRole","barWidth","saveTarget","saveSla","_a","GitMerge","TriangleAlert","Eye","JeopardyCount","SequenceMenu","aggregates","activeOrigin","onSelect","open","setOpen","ref","useEffect","onKey","active","f","agg","ChevronDown","isActive","TableHead","coloredCols","col","OperationsPage","selectedRole","setSelectedRole","refreshing","setRefreshing","useStationMetricsEvents","roleData","rolesLoading","refetchRoles","useRoleDetails","metricsData","metricsLoading","refetchMetrics","metrics","fragmentAggregates","useMemo","out","jeopardy","searchParams","setSearchParams","useSearchParams","fragmentParam","activeFragment","selectFragment","useCallback","origin","prev","ordered","fragmentRoleSet","fragmentMetrics","chartStations","handleUpstreamSelect","upstreamRole","navigate","useNavigate","selectedRoleDetail","isLoading","handleRefresh","handleSelect","periodSelector","PageHeader","RefreshCw","i","PaceChart"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as s}from"./vendor-query-B2UbickB.js";import{o as v,T as C,H as L,K as R,k as T}from"./index-DIgiIoou.js";import{f as k}from"./useEventHooks-DV9pLDOW.js";import{u as F}from"./useFilterParams-x-Dg0Vgz.js";import{u as N}from"./useDebouncedValue-BA5S7V54.js";import{b as _}from"./api-path-u2Jf9QXS.js";import{D as z}from"./DataTable-Byn3oyT9.js";import{P as A}from"./PageHeader-Bxa1XFz0.js";import{S as w}from"./StickyPagination-Cd83AHd_.js";import{R as M,a as O}from"./RowActions-BA9L9djf.js";import{E as I,T as U,a as q}from"./escalation-columns-BbS5X61l.js";import{L as D}from"./ListToolbar-KC6LGtKP.js";import{aj as H}from"./vendor-icons-ihWGa7_d.js";import{c as $}from"./vendor-react-CXumBFUA.js";import"./EmptyState-BcsfPq9T.js";import"./FilterBar-B5Vk5tBF.js";import"./PriorityBadge-B4ykBH7f.js";import"./RolePill-DLwmVMam.js";import"./WorkflowPill-Fjc2q9U9.js";import"./CountdownTimer-TXsRlTU4.js";function me(){k();const d=$(),{user:i}=v(),{filters:t,setFilter:u,pagination:e,sort:n,setSort:g}=F({filters:{role:"",type:"",priority:"",search:""}}),f=N(t.search,300),x=C(),{data:l}=L(),{data:c}=R(),m={assigned_to:i==null?void 0:i.userId,status:"pending",role:t.role||void 0,type:t.type||void 0,priority:t.priority?parseInt(t.priority):void 0,search:f||void 0,sort_by:n.sort_by||"created_at",order:n.order||"desc"},{data:o,isLoading:y,error:r,refetch:h,isFetching:b}=T({...m,limit:e.pageSize,offset:e.offset}),S=(o==null?void 0:o.escalations)??[],p=(o==null?void 0:o.total)??0,E=_("/escalations",{...m,limit:e.pageSize,offset:e.offset}),P={key:"actions",label:"",render:a=>s.jsx(M,{children:s.jsx(O,{icon:H,title:"Release escalation",onClick:()=>x.mutate(a.id),colorClass:"text-text-tertiary hover:text-status-warning"})}),className:"w-16 text-right"},j=[U,...q,P];return s.jsxs("div",{children:[s.jsx(A,{title:"My Escalations"}),s.jsx(I,{filters:t,setFilter:u,roles:(l==null?void 0:l.roles)??[],types:(c==null?void 0:c.types)??[],actions:s.jsx(D,{onRefresh:()=>h(),isFetching:b,apiPath:E})}),r&&s.jsx("div",{className:"mb-4 px-4 py-3 rounded-md bg-status-error/10 border border-status-error/20 text-xs text-status-error",children:r.message==="Session expired"?"Your session has expired. Please log in again.":`Failed to load escalations: ${r.message}`}),s.jsx(z,{columns:j,data:S,keyFn:a=>a.id,onRowClick:a=>d(`/escalations/detail/${a.id}`,{state:{from:"/escalations/queue"}}),isLoading:y,emptyMessage:r?"Unable to load data":"No assigned escalations",sort:n,onSort:g}),s.jsx(w,{page:e.page,totalPages:e.totalPages(p),onPageChange:e.setPage,total:p,pageSize:e.pageSize,onPageSizeChange:e.setPageSize})]})}export{me as OperatorDashboard};
|
|
2
|
-
//# sourceMappingURL=OperatorDashboard-_axS17fp.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-ihWGa7_d.js";function l({title:t,actions:s,center:i,docsHash:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-10",children:[e.jsxs("div",{className:"flex items-center gap-2 flex-1 min-w-0",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary min-w-0 truncate",title:typeof t=="string"?t:void 0,children:t}),a&&e.jsx("button",{onClick:()=>{window.location.hash=a},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),i,s&&e.jsx("div",{className:`flex items-center gap-3 ${i?"flex-1 justify-end":""}`,children:s})]})}export{l as P};
|
|
2
|
-
//# sourceMappingURL=PageHeader-Bxa1XFz0.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader-Bxa1XFz0.js","sources":["../../src/components/common/layout/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\ninterface PageHeaderProps {\n title: string | ReactNode;\n actions?: ReactNode;\n /** Optional element centered between the title and the actions (e.g. a sparkline). */\n center?: ReactNode;\n /** Hash link to open the docs drawer to a specific section, e.g. \"#docs=dashboard.md#workflow-registry\" */\n docsHash?: string;\n}\n\nexport function PageHeader({ title, actions, center, docsHash }: PageHeaderProps) {\n return (\n <div className=\"flex items-center gap-4 mb-10\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <h1\n className=\"text-3xl font-light text-text-primary min-w-0 truncate\"\n title={typeof title === 'string' ? title : undefined}\n >\n {title}\n </h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {center}\n {actions && (\n <div className={`flex items-center gap-3 ${center ? 'flex-1 justify-end' : ''}`}>{actions}</div>\n )}\n </div>\n );\n}\n"],"names":["PageHeader","title","actions","center","docsHash","jsxs","jsx","BookOpen"],"mappings":"8FAYO,SAASA,EAAW,CAAE,MAAAC,EAAO,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,GAA6B,CAChF,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,gCACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,yCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CACC,UAAU,yDACV,MAAO,OAAOL,GAAU,SAAWA,EAAQ,OAE1C,SAAAA,CAAA,CAAA,EAEFG,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCJ,EACAD,SACE,MAAA,CAAI,UAAW,2BAA2BC,EAAS,qBAAuB,EAAE,GAAK,SAAAD,CAAA,CAAQ,CAAA,EAE9F,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e}from"./vendor-query-B2UbickB.js";import{B as r}from"./vendor-icons-ihWGa7_d.js";function m({title:n,subtitle:a,stats:s,actions:l,docsHash:i}){return e.jsxs("div",{className:"flex items-baseline justify-between mb-10",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h1",{className:"text-3xl font-light text-text-primary",children:n}),i&&e.jsx("button",{onClick:()=>{window.location.hash=i},className:"text-text-quaternary hover:text-accent transition-colors mt-1",title:"Open docs for this page",children:e.jsx(r,{className:"w-4 h-4",strokeWidth:1.5})})]}),a&&e.jsx("span",{className:"text-sm text-text-tertiary font-light",children:a})]}),e.jsxs("div",{className:"flex items-center gap-5",children:[s==null?void 0:s.map(t=>e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-text-tertiary",children:[t.dotClass&&e.jsx("span",{className:`w-1.5 h-1.5 rounded-full dot-ring ${t.dotClass}`}),e.jsx("span",{children:t.label}),e.jsx("span",{className:"font-medium text-text-secondary",children:t.value})]},t.label)),l&&e.jsx("div",{className:"flex items-center gap-3",children:l})]})]})}export{m as P};
|
|
2
|
-
//# sourceMappingURL=PageHeaderWithStats-D_sO0MqJ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeaderWithStats-D_sO0MqJ.js","sources":["../../src/components/common/layout/PageHeaderWithStats.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { BookOpen } from 'lucide-react';\n\nexport interface InlineStat {\n label: string;\n value: string | number;\n dotClass?: string;\n}\n\ninterface PageHeaderWithStatsProps {\n title: string;\n subtitle?: string;\n stats?: InlineStat[];\n actions?: ReactNode;\n docsHash?: string;\n}\n\nexport function PageHeaderWithStats({\n title,\n subtitle,\n stats,\n actions,\n docsHash,\n}: PageHeaderWithStatsProps) {\n return (\n <div className=\"flex items-baseline justify-between mb-10\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-3xl font-light text-text-primary\">{title}</h1>\n {docsHash && (\n <button\n onClick={() => { window.location.hash = docsHash; }}\n className=\"text-text-quaternary hover:text-accent transition-colors mt-1\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n )}\n </div>\n {subtitle && (\n <span className=\"text-sm text-text-tertiary font-light\">{subtitle}</span>\n )}\n </div>\n <div className=\"flex items-center gap-5\">\n {stats?.map((s) => (\n <div key={s.label} className=\"flex items-center gap-1.5 text-xs text-text-tertiary\">\n {s.dotClass && <span className={`w-1.5 h-1.5 rounded-full dot-ring ${s.dotClass}`} />}\n <span>{s.label}</span>\n <span className=\"font-medium text-text-secondary\">{s.value}</span>\n </div>\n ))}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n </div>\n );\n}\n"],"names":["PageHeaderWithStats","title","subtitle","stats","actions","docsHash","jsxs","jsx","BookOpen","s"],"mappings":"8FAiBO,SAASA,EAAoB,CAClC,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAA6B,CAC3B,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,4CACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,wCAAyC,SAAAN,EAAM,EAC5DI,GACCE,EAAAA,IAAC,SAAA,CACC,QAAS,IAAM,CAAE,OAAO,SAAS,KAAOF,CAAU,EAClD,UAAU,gEACV,MAAM,0BAEN,SAAAE,EAAAA,IAACC,EAAA,CAAS,UAAU,UAAU,YAAa,GAAA,CAAK,CAAA,CAAA,CAClD,EAEJ,EACCN,GACCK,EAAAA,IAAC,OAAA,CAAK,UAAU,wCAAyC,SAAAL,CAAA,CAAS,CAAA,EAEtE,EACAI,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAH,GAAA,YAAAA,EAAO,IAAKM,GACXH,EAAAA,KAAC,MAAA,CAAkB,UAAU,uDAC1B,SAAA,CAAAG,EAAE,UAAYF,MAAC,OAAA,CAAK,UAAW,qCAAqCE,EAAE,QAAQ,GAAI,EACnFF,EAAAA,IAAC,OAAA,CAAM,SAAAE,EAAE,KAAA,CAAM,EACfF,EAAAA,IAAC,OAAA,CAAK,UAAU,kCAAmC,WAAE,KAAA,CAAM,CAAA,GAHnDE,EAAE,KAIZ,GAEDL,GAAWG,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,SAAAH,CAAA,CAAQ,CAAA,CAAA,CAChE,CAAA,EACF,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PriorityBadge-B4ykBH7f.js","sources":["../../src/components/common/display/PriorityBadge.tsx"],"sourcesContent":["const priorityLabels: Record<number, string> = {\n 1: 'P1',\n 2: 'P2',\n 3: 'P3',\n 4: 'P4',\n};\n\nconst priorityStyles: Record<number, string> = {\n 1: 'text-text-primary font-semibold',\n 2: 'text-text-primary font-medium',\n 3: 'text-text-secondary',\n 4: 'text-text-tertiary',\n};\n\n// Severity weight without colour, for the `inherit` tone (colour comes from the row).\nconst priorityWeight: Record<number, string> = {\n 1: 'font-semibold',\n 2: 'font-medium',\n};\n\nexport function PriorityBadge({\n priority,\n size = 'md',\n tone = 'severity',\n}: {\n priority: number;\n size?: 'sm' | 'md';\n /** `severity` colours by priority; `inherit` takes the surrounding text colour. */\n tone?: 'severity' | 'inherit';\n}) {\n const sizeClass = size === 'sm' ? 'text-[11px]' : 'text-xs';\n const toneClass =\n tone === 'inherit'\n ? `text-inherit ${priorityWeight[priority] ?? ''}`\n : priorityStyles[priority] ?? 'text-text-secondary';\n return (\n <span className={`${sizeClass} ${toneClass}`}>\n {priorityLabels[priority] ?? `P${priority}`}\n </span>\n );\n}\n"],"names":["priorityLabels","priorityStyles","priorityWeight","PriorityBadge","priority","size","tone","sizeClass","toneClass","jsx"],"mappings":"+CAAA,MAAMA,EAAyC,CAC7C,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,IACL,EAEMC,EAAyC,CAC7C,EAAG,kCACH,EAAG,gCACH,EAAG,sBACH,EAAG,oBACL,EAGMC,EAAyC,CAC7C,EAAG,gBACH,EAAG,aACL,EAEO,SAASC,EAAc,CAC5B,SAAAC,EACA,KAAAC,EAAO,KACP,KAAAC,EAAO,UACT,EAKG,CACD,MAAMC,EAAYF,IAAS,KAAO,cAAgB,UAC5CG,EACJF,IAAS,UACL,gBAAgBJ,EAAeE,CAAQ,GAAK,EAAE,GAC9CH,EAAeG,CAAQ,GAAK,sBAClC,OACEK,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGF,CAAS,IAAIC,CAAS,GACvC,SAAAR,EAAeI,CAAQ,GAAK,IAAIA,CAAQ,GAC3C,CAEJ"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as b,j as e}from"./vendor-query-B2UbickB.js";import{a as z}from"./tasks-CD3-C7tP.js";import{a as V}from"./useEventHooks-DV9pLDOW.js";import{D as S,f as L,C as J,u as q,a as G,J as P,S as T}from"./index-DIgiIoou.js";import{P as K}from"./PageHeaderWithStats-D_sO0MqJ.js";import{S as W}from"./StatusBadge-CEQMRmSQ.js";import{W as Q}from"./WorkflowPill-Fjc2q9U9.js";import{T as y}from"./TimestampCell-DGOsba-A.js";import{L as D,e as X}from"./vendor-react-CXumBFUA.js";import{R as Y}from"./RolePill-DLwmVMam.js";import{U as Z}from"./UserName-DcXhOSVm.js";import"./vendor-icons-ihWGa7_d.js";import"./users-mI9goDjj.js";const ee="bg-stripes animate-pulse opacity-70";function $(t){switch(t){case"completed":return"text-status-success";case"in_progress":case"pending":return"text-status-warning";case"needs_intervention":return"text-status-error";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function I(t){switch(t){case"resolved":return"text-status-success";case"pending":return"text-status-warning";case"cancelled":return"text-text-tertiary";default:return"text-text-tertiary"}}function te(t,a,l){return`${t==="task"?"Task":l?"Notification":"Escalation"} is ${a.replace(/_/g," ")}`}function se(t,a){if(a)return ee;switch(t){case"completed":case"resolved":return"bg-status-success";case"pending":case"in_progress":case"needs_intervention":return"bg-status-warning";case"cancelled":return"bg-status-error";default:return"bg-text-tertiary"}}function ae(t){return t.startsWith("mcp")||t.startsWith("Mcp")}function E(t){return!t.workflow_type}function A(t,a){if(t.length<=a)return t;const l=Math.floor((a-1)/2);return`${t.slice(0,l)}…${t.slice(t.length-l)}`}function ne(t,a){const l=Date.now(),c=new Map,x=[];for(const s of a)s.task_id?(c.has(s.task_id)||c.set(s.task_id,[]),c.get(s.task_id).push(s)):x.push(s);const r=[...t].sort((s,d)=>new Date(s.created_at).getTime()-new Date(d.created_at).getTime()),i=[];for(const s of t)i.push(new Date(s.created_at).getTime()),s.completed_at&&i.push(new Date(s.completed_at).getTime());for(const s of a)i.push(new Date(s.created_at).getTime()),s.resolved_at&&i.push(new Date(s.resolved_at).getTime()),s.claimed_at&&i.push(new Date(s.claimed_at).getTime());if(i.length===0)return{lanes:[],timeMin:0,timeMax:1};const o=Math.min(...i),f=t.some(s=>!s.completed_at)||a.some(s=>!s.resolved_at)?Math.max(l,Math.max(...i)):Math.max(...i),p=f-o||1,m=s=>(s-o)/p*100,h=[];for(const s of r){const d=new Date(s.created_at).getTime(),j=s.completed_at?new Date(s.completed_at).getTime():l,g=!s.completed_at;h.push({kind:"task",id:s.id,label:s.workflow_type,taskId:s.id,startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:g,task:s});const v=(c.get(s.id)||[]).sort((n,u)=>new Date(n.created_at).getTime()-new Date(u.created_at).getTime());for(const n of v){const u=new Date(n.created_at).getTime(),N=n.resolved_at?new Date(n.resolved_at).getTime():l,M=!n.resolved_at;let w=null;if(n.claimed_at){const U=new Date(n.claimed_at).getTime(),H=N-u||1;w=(U-u)/H*100}h.push({kind:"escalation",id:n.id,label:n.role,taskId:s.id,startMs:u,endMs:N,startPct:m(u),widthPct:Math.max((N-u)/p*100,.5),durationMs:N-u,isOpen:M,escalation:n,claimPct:w})}}for(const s of x){const d=new Date(s.created_at).getTime(),j=s.resolved_at?new Date(s.resolved_at).getTime():l;let g=null;if(s.claimed_at){const v=new Date(s.claimed_at).getTime(),n=j-d||1;g=(v-d)/n*100}h.push({kind:"escalation",id:s.id,label:s.role,taskId:"",startMs:d,endMs:j,startPct:m(d),widthPct:Math.max((j-d)/p*100,.5),durationMs:j-d,isOpen:!s.resolved_at,escalation:s,claimPct:g})}return{lanes:h,timeMin:o,timeMax:f}}function re(t,a,l,c=500){const[x,r]=b.useState(0),i=b.useRef(null),o=l-a||1;b.useEffect(()=>{if(t===0)return;i.current=null,r(0);let f;const p=m=>{i.current===null&&(i.current=m);const h=m-i.current,s=Math.min(h/c,1),d=1-Math.pow(1-s,3);r(d),s<1&&(f=requestAnimationFrame(p))};return f=requestAnimationFrame(p),()=>cancelAnimationFrame(f)},[t,c]);const k=b.useCallback(f=>{const p=(f.startMs-a)/o,m=(f.endMs-a)/o;if(x<p)return{width:0,opacity:0};const h=m-p||.001,s=Math.min((x-p)/h,1),d=f.widthPct*s,j=Math.min(s/.1,1);return{width:d,opacity:j}},[x,a,o]);return{progress:x,animatedBar:k}}function R({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"})})}function B({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M9.813 15.904L9 18.75l-.813-2.846a4.5 4.5 0 00-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 003.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 003.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 00-3.09 3.09zM18.259 8.715L18 9.75l-.259-1.035a3.375 3.375 0 00-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 002.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 002.455 2.456L21.75 6l-1.036.259a3.375 3.375 0 00-2.455 2.456zM16.894 20.567L16.5 21.75l-.394-1.183a2.25 2.25 0 00-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 001.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 001.423 1.423l1.183.394-1.183.394a2.25 2.25 0 00-1.423 1.423z"})})}function O({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0"})})}function F({className:t}){return e.jsx("svg",{className:t,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}function ie({allExpanded:t,onToggleAll:a}){return e.jsxs("div",{className:"flex items-center gap-4 mb-4 flex-wrap",children:[e.jsx("button",{onClick:a,className:"text-[10px] text-accent hover:underline",children:t?"Collapse all":"Expand all"}),e.jsxs("div",{className:"flex items-center gap-4 ml-auto",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(R,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(B,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"AI Task"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(F,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Escalation"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(O,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Notification"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Done"})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-2 h-2 rounded-full dot-ring bg-status-warning"}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"Active"})]})]})]})}function oe({ticks:t}){return e.jsxs("div",{className:"flex",children:[e.jsx("div",{className:"w-52 shrink-0"}),e.jsx("div",{className:"flex-1 relative h-6 border-b border-surface-border",children:t.map(a=>e.jsx("span",{className:"absolute text-[9px] font-mono text-text-tertiary -translate-x-1/2 bottom-1 whitespace-nowrap",style:{left:`${a.pct}%`},children:a.label},a.pct))})]})}function _({label:t,children:a}){return e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-0.5",children:t}),e.jsx("div",{className:"text-xs text-text-primary",children:a})]})}function le({traceId:t,href:a}){const[l,c]=b.useState(!1),x=i=>{i.stopPropagation(),navigator.clipboard.writeText(t),c(!0),setTimeout(()=>c(!1),1500)},r=i=>{i.stopPropagation(),a&&window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("span",{className:"group/trace inline-flex items-center gap-1.5",children:[a&&e.jsx("button",{onClick:r,title:"Open trace",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:"w-3 h-3 text-text-tertiary hover:text-accent",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-4.5-4.5h6m0 0v6m0-6L10.5 15"})})}),e.jsx("button",{onClick:x,title:"Copy trace ID",className:"opacity-0 group-hover/trace:opacity-100 transition-opacity p-0.5",children:e.jsx("svg",{className:`w-3 h-3 transition-colors ${l?"text-status-success":"text-text-tertiary hover:text-accent"}`,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:2,children:l?e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M5 13l4 4L19 7"}):e.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3"})})}),e.jsx("span",{className:"text-[11px] text-accent",children:"Trace Details"})]})}function ce({task:t,traceUrl:a}){const l=t.completed_at?new Date(t.completed_at).getTime()-new Date(t.created_at).getTime():Date.now()-new Date(t.created_at).getTime();return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Q,{type:t.workflow_type})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Started",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Completed",children:t.completed_at?e.jsx(y,{date:t.completed_at}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"In progress"})}),e.jsx(_,{label:"Duration",children:e.jsx(S,{ms:l,className:"font-mono text-sm"})})]}),t.milestones.length>0&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Milestones"}),e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.milestones.map((c,x)=>e.jsxs("span",{className:"px-2 py-0.5 text-[10px] font-mono bg-accent-faint/50 rounded text-text-secondary",children:[c.name,": ",String(c.value)]},x))})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/workflows/tasks/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Task Details"}),t.trace_id&&e.jsx(le,{traceId:t.trace_id,href:a?a.replace("{traceId}",t.trace_id):void 0})]})]})}function de({escalation:t}){const a=new Date(t.created_at).getTime(),l=t.claimed_at?new Date(t.claimed_at).getTime()-a:null,c=t.resolved_at?new Date(t.resolved_at).getTime()-a:null;return e.jsxs("div",{className:"grid grid-cols-[3fr_1fr] gap-6",children:[e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(W,{status:t.status}),e.jsx(Y,{role:t.role}),t.type&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:[t.type,t.subtype?` / ${t.subtype}`:""]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsx(_,{label:"Created",children:e.jsx(y,{date:t.created_at})}),e.jsx(_,{label:"Claimed",children:t.claimed_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.claimed_at}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:["after ",e.jsx(S,{ms:l}),t.assigned_to&&e.jsxs(e.Fragment,{children:[" ","by"," ",e.jsx("span",{className:"text-text-secondary font-medium",children:e.jsx(Z,{userId:t.assigned_to})})]})]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Unclaimed"})}),e.jsx(_,{label:"Resolved",children:t.resolved_at?e.jsxs(e.Fragment,{children:[e.jsx(y,{date:t.resolved_at}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:[e.jsx(S,{ms:c})," total"]})]}):e.jsx("span",{className:"text-text-tertiary italic text-xs",children:"Pending"})})]}),t.description&&e.jsxs("div",{children:[e.jsx("p",{className:"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("p",{className:"text-[11px] text-text-secondary leading-relaxed",children:t.description})]})]}),e.jsxs("div",{className:"flex flex-col items-end gap-2",children:[t.workflow_id&&e.jsx(D,{to:`/workflows/executions/${encodeURIComponent(t.workflow_id)}`,className:"block text-[11px] text-accent hover:underline",children:"Execution Details"}),e.jsx(D,{to:`/escalations/detail/${t.id}`,className:"block text-[11px] text-accent hover:underline",children:"Escalation Details"})]})]})}function xe({lane:t,ticks:a,isExpanded:l,onToggle:c,anim:x,animDone:r,traceUrl:i}){var m,h;const o=t.kind==="task",k=o?t.task.status:t.escalation.status,f=se(k,t.isOpen),p=x.opacity>0;return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center border-b border-surface-border cursor-pointer hover:bg-surface-sunken/40 transition-colors",onClick:c,children:[e.jsxs("div",{className:`w-52 shrink-0 py-3 pr-4 flex items-center gap-2 ${o?"":"pl-6"}`,style:{opacity:p?1:0,transition:"opacity 0.15s ease-out"},children:[o?ae(t.task.workflow_type)?e.jsx(B,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):e.jsx(R,{className:`w-4 h-4 shrink-0 ${$(t.task.status)}`}):E(t.escalation)?e.jsx(O,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}):e.jsx(F,{className:`w-4 h-4 shrink-0 ${I(t.escalation.status)}`}),e.jsx("p",{className:"text-xs font-mono text-text-secondary whitespace-nowrap overflow-hidden",title:te(t.kind,o?t.task.status:t.escalation.status,!o&&E(t.escalation)),children:o?A(t.label,24):A(((m=t.escalation)==null?void 0:m.role)??t.label,20)})]}),e.jsxs("div",{className:"flex-1 relative h-10",children:[a.map(s=>e.jsx("div",{className:"absolute top-0 bottom-0 w-px bg-surface-border opacity-30",style:{left:`${s.pct}%`}},s.pct)),e.jsxs("div",{className:`absolute top-2 h-6 rounded-sm ${l?`${f} ring-2 ring-accent ring-offset-1`:`${f} hover:opacity-80`}`,style:{left:`${t.startPct}%`,width:p?`${Math.max(x.width,.3)}%`:"0%",minWidth:p?"4px":"0px",opacity:x.opacity},title:`${t.label} — ${L(t.durationMs)} — ${new Date(t.startMs).toLocaleTimeString()}`,children:[x.width>8&&r&&e.jsx("span",{className:"absolute inset-0 flex items-center px-1.5 text-[9px] font-mono text-white truncate",children:L(t.durationMs)}),t.claimPct!=null&&r&&e.jsx("div",{className:"absolute top-0 bottom-0 w-px border-l border-dashed border-white/70",style:{left:`${t.claimPct}%`},title:(h=t.escalation)!=null&&h.assigned_to?`Claimed by ${t.escalation.assigned_to}`:"Claimed",children:e.jsx("div",{className:"absolute -top-1 -left-[3px] w-[7px] h-[7px] rounded-full bg-white border border-status-warning"})})]})]})]}),e.jsx(J,{open:l,children:e.jsx("div",{className:"py-4 px-6 pl-52 border-b border-surface-border bg-surface-sunken/20",children:o&&t.task?e.jsx(ce,{task:t.task,traceUrl:i}):t.escalation?e.jsx(de,{escalation:t.escalation}):null})})]})}function me({tasks:t,escalations:a,traceUrl:l}){const[c,x]=b.useState(new Set),{lanes:r,timeMin:i,timeMax:o}=b.useMemo(()=>ne(t,a),[t,a]),k=o-i||1,{progress:f,animatedBar:p}=re(r.length,i,o);if(r.length===0)return e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No events in this process."});const m=5,h=Array.from({length:m+1},(n,u)=>({pct:u/m*100,label:L(Math.round(u/m*k))})),s=n=>{x(u=>{const N=new Set(u);return N.has(n)?N.delete(n):N.add(n),N})},d=r.map(n=>n.id),j=d.length>0&&d.every(n=>c.has(n)),g=()=>{x(j?new Set:new Set(d))},v=f>=1;return e.jsxs("div",{className:"py-2",children:[e.jsx(ie,{allExpanded:j,onToggleAll:g}),e.jsx(oe,{ticks:h}),r.map(n=>e.jsx(xe,{lane:n,ticks:h,isExpanded:c.has(n.id),onToggle:()=>s(n.id),anim:p(n),animDone:v,traceUrl:l},`${n.kind}-${n.id}`))]})}function C(t){if(!t)return null;try{return JSON.parse(t)}catch{return null}}function ue(t){return t.length===0?null:[...t].sort((a,l)=>new Date(a.created_at).getTime()-new Date(l.created_at).getTime())[0]}function De(){var j;const{originId:t}=X();V(t);const{data:a,isLoading:l}=z(t??""),{data:c}=q(),x=((j=c==null?void 0:c.telemetry)==null?void 0:j.traceUrl)??null,r=(a==null?void 0:a.tasks)??[],i=(a==null?void 0:a.escalations)??[],o=b.useMemo(()=>ue(r),[r]),k=b.useMemo(()=>C(o==null?void 0:o.envelope),[o]),f=b.useMemo(()=>{if(o!=null&&o.data)return C(o.data);const g=r.filter(v=>v.status==="completed"&&v.data).sort((v,n)=>new Date(n.completed_at).getTime()-new Date(v.completed_at).getTime());return g.length>0?C(g[0].data):null},[o,r]),p=b.useMemo(()=>r.length>0&&r.some(g=>g.status!=="completed"&&g.status!=="cancelled"),[r]),m=b.useMemo(()=>{const g=r.filter(u=>u.status==="completed").length,v=r.filter(u=>u.status==="needs_intervention").length,n=i.filter(u=>u.status==="resolved").length;return{tasks:r.length,completed:g,escalated:v,escalations:i.length,resolved:n}},[r,i]),h=b.useMemo(()=>{if(r.length===0&&i.length===0)return null;const v=[...r.map(w=>w.created_at),...i.map(w=>w.created_at)].sort()[0],n=r.every(w=>w.status==="completed"||w.status==="cancelled"),u=i.every(w=>w.status==="resolved"),N=r.length>0&&n&&u,M=N?[...r.map(w=>w.completed_at),...i.map(w=>w.resolved_at)].filter(Boolean).sort().pop()??null:null;return{startIso:v,endIso:M,isFinished:N,elapsed:G(v,M)}},[r,i]),s=b.useMemo(()=>{const g=[];return h&&g.push({label:h.isFinished?"Completed":"Running",value:h.elapsed,dotClass:h.isFinished?"bg-status-success":"bg-status-pending animate-pulse"}),g.push({label:"Tasks",value:`${m.completed}/${m.tasks}`},{label:"Escalations",value:`${m.resolved}/${m.escalations}`}),g},[h,m]);if(l&&r.length===0)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]});const d=k||f||p;return e.jsxs("div",{children:[e.jsx(K,{title:"Process Detail",docsHash:"#docs:dashboard.md:process-detail",subtitle:t,stats:s}),d&&e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-8 mb-10",children:[e.jsx("div",{children:k?e.jsx(P,{data:k,label:"Input",defaultMode:"json",defaultCollapsed:!0}):e.jsxs("div",{children:[e.jsx(T,{children:"Input"}),e.jsx("div",{className:"font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-tertiary italic mt-2",children:"Waiting for task..."})]})}),e.jsx("div",{children:f?e.jsx(P,{data:f,label:"Output",defaultMode:"json",defaultCollapsed:!0}):p?e.jsxs("div",{children:[e.jsx(T,{children:"Output"}),e.jsxs("div",{className:"flex items-center gap-2 font-mono text-xs bg-surface-sunken rounded-md p-4 text-text-secondary mt-2",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-pending animate-pulse"}),"Processing..."]})]}):null})]}),e.jsx(T,{className:"mb-6",children:"Timeline"}),e.jsx(me,{tasks:r,escalations:i,traceUrl:x})]})}export{De as ProcessDetailPage};
|
|
2
|
-
//# sourceMappingURL=ProcessDetailPage-D8pAWUXx.js.map
|