@hotmeshio/long-tail 0.10.10 → 0.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/escalations/list.js +11 -4
- package/build/api/roles.d.ts +2 -0
- package/build/api/roles.js +4 -0
- package/build/lib/db/schemas/025_ops_home_default.sql +11 -0
- package/build/modules/features.d.ts +9 -0
- package/build/modules/features.js +1 -0
- package/build/services/role/index.js +1 -0
- package/build/services/role/sql.d.ts +6 -2
- package/build/services/role/sql.js +11 -2
- package/build/services/role/types.d.ts +9 -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 +1 -0
- package/build/system/seed/tool-manifests-admin.d.ts +82 -0
- package/build/system/seed/tool-manifests-admin.js +1 -1
- package/build/types/startup.d.ts +8 -0
- package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js → AdminDashboard-CkTbRfY9.js} +2 -2
- package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js.map → AdminDashboard-CkTbRfY9.js.map} +1 -1
- package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js → AgentConfigPage-Cm8FRpXi.js} +2 -2
- package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js.map → AgentConfigPage-Cm8FRpXi.js.map} +1 -1
- package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js → AgentDetailPage-sQ1-UT46.js} +2 -2
- package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js.map → AgentDetailPage-sQ1-UT46.js.map} +1 -1
- package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js → AgentsPage-bSx_mdae.js} +2 -2
- package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js.map → AgentsPage-bSx_mdae.js.map} +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js +2 -0
- package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js.map +1 -0
- package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js → BotPicker-C4uGH2x9.js} +2 -2
- package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js.map → BotPicker-C4uGH2x9.js.map} +1 -1
- package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js → CapabilitiesPage-BRoOeKcc.js} +2 -2
- package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js.map → CapabilitiesPage-BRoOeKcc.js.map} +1 -1
- package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js → CollapsibleSection-CIj8Adc9.js} +2 -2
- package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js.map → CollapsibleSection-CIj8Adc9.js.map} +1 -1
- package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js → ConfirmDeleteModal-Ugi_9Ukq.js} +2 -2
- package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js.map → ConfirmDeleteModal-Ugi_9Ukq.js.map} +1 -1
- package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js → CopyableId-GUEdiiL5.js} +2 -2
- package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js.map → CopyableId-GUEdiiL5.js.map} +1 -1
- package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js +2 -0
- package/dashboard/dist/assets/{CountdownTimer-BF71ldGF.js.map → CountdownTimer-D3t0XMhE.js.map} +1 -1
- package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js → CredentialsPage-B73Si6K1.js} +2 -2
- package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js.map → CredentialsPage-B73Si6K1.js.map} +1 -1
- package/dashboard/dist/assets/{CronLabel-CebR1m2k.js → CronLabel-Ca1aHolt.js} +2 -2
- package/dashboard/dist/assets/{CronLabel-CebR1m2k.js.map → CronLabel-Ca1aHolt.js.map} +1 -1
- package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js → CustomDurationPicker-_9E9x1YN.js} +2 -2
- package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js.map → CustomDurationPicker-_9E9x1YN.js.map} +1 -1
- package/dashboard/dist/assets/{DropZone-Bavzt2QR.js → DropZone-NYn6TWHz.js} +2 -2
- package/dashboard/dist/assets/{DropZone-Bavzt2QR.js.map → DropZone-NYn6TWHz.js.map} +1 -1
- package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js → ElapsedCell-karxia93.js} +2 -2
- package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js.map → ElapsedCell-karxia93.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js → EscalationListSchemaPage-CDaNmbUA.js} +2 -2
- package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js.map → EscalationListSchemaPage-CDaNmbUA.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js → EscalationSchemaPage-k-2hFT2t.js} +2 -2
- package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js.map → EscalationSchemaPage-k-2hFT2t.js.map} +1 -1
- package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js → EscalationsOverview-C1e7IPn_.js} +2 -2
- package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js.map → EscalationsOverview-C1e7IPn_.js.map} +1 -1
- package/dashboard/dist/assets/{EventTable-4JeTcXr_.js → EventTable-CIrrtL7_.js} +2 -2
- package/dashboard/dist/assets/{EventTable-4JeTcXr_.js.map → EventTable-CIrrtL7_.js.map} +1 -1
- package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js → FilterBar-CzjtH74v.js} +2 -2
- package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js.map → FilterBar-CzjtH74v.js.map} +1 -1
- package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js → GraphInvokePage-LMpWw8z1.js} +2 -2
- package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js.map → GraphInvokePage-LMpWw8z1.js.map} +1 -1
- package/dashboard/dist/assets/HomePage-Kl2DBG6l.js +2 -0
- package/dashboard/dist/assets/HomePage-Kl2DBG6l.js.map +1 -0
- package/dashboard/dist/assets/ListToolbar-B2fub0DY.js +2 -0
- package/dashboard/dist/assets/ListToolbar-B2fub0DY.js.map +1 -0
- package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js → McpOverview-odYnCZCC.js} +2 -2
- package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js.map → McpOverview-odYnCZCC.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js → McpQueryDetailPage-BtqwHUAg.js} +2 -2
- package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js.map → McpQueryDetailPage-BtqwHUAg.js.map} +1 -1
- package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js → McpQueryPage-CPkVwNIK.js} +2 -2
- package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js.map → McpQueryPage-CPkVwNIK.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js → McpRunDetailPage-D-Rz9MRw.js} +2 -2
- package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js.map → McpRunDetailPage-D-Rz9MRw.js.map} +1 -1
- package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js → McpRunsPage-rdpZ2yMh.js} +2 -2
- package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js.map → McpRunsPage-rdpZ2yMh.js.map} +1 -1
- package/dashboard/dist/assets/{Modal-CA2Iv02H.js → Modal-Dr1Xy0j0.js} +2 -2
- package/dashboard/dist/assets/{Modal-CA2Iv02H.js.map → Modal-Dr1Xy0j0.js.map} +1 -1
- package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js → NamespacePill-GwO-WfhX.js} +2 -2
- package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js.map → NamespacePill-GwO-WfhX.js.map} +1 -1
- package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js +2 -0
- package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js.map +1 -0
- package/dashboard/dist/assets/OperatorDashboard-Csei5vj-.js +2 -0
- package/dashboard/dist/assets/OperatorDashboard-Csei5vj-.js.map +1 -0
- package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js → PageHeader-Bo9BU9pK.js} +2 -2
- package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js.map → PageHeader-Bo9BU9pK.js.map} +1 -1
- package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js → PageHeaderWithStats-8_5cOSKL.js} +2 -2
- package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js.map → PageHeaderWithStats-8_5cOSKL.js.map} +1 -1
- package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js → PersonaDetailPage--ZL6Or6v.js} +2 -2
- package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js.map → PersonaDetailPage--ZL6Or6v.js.map} +1 -1
- package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js → PersonasPage-Bdcoay3P.js} +2 -2
- package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js.map → PersonasPage-Bdcoay3P.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js → ProcessDetailPage-HrmVQq7S.js} +2 -2
- package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js.map → ProcessDetailPage-HrmVQq7S.js.map} +1 -1
- package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js → ProcessesListPage-_xmj6Bo-.js} +2 -2
- package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js.map → ProcessesListPage-_xmj6Bo-.js.map} +1 -1
- package/dashboard/dist/assets/RoleDetailPage-C0ju2-4K.js +8 -0
- package/dashboard/dist/assets/RoleDetailPage-C0ju2-4K.js.map +1 -0
- package/dashboard/dist/assets/{RolePill-TySZq7dB.js → RolePill-CQlnEWkK.js} +2 -2
- package/dashboard/dist/assets/{RolePill-TySZq7dB.js.map → RolePill-CQlnEWkK.js.map} +1 -1
- package/dashboard/dist/assets/RolesPage-CKluVSpB.js +2 -0
- package/dashboard/dist/assets/{RolesPage-CNueMVuJ.js.map → RolesPage-CKluVSpB.js.map} +1 -1
- package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js → RunAsSelector-DdfecQ1U.js} +2 -2
- package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js.map → RunAsSelector-DdfecQ1U.js.map} +1 -1
- package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js → ScopeBadge-BBYkevuR.js} +2 -2
- package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js.map → ScopeBadge-BBYkevuR.js.map} +1 -1
- package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js → StickyPagination-cLddIdtT.js} +2 -2
- package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js.map → StickyPagination-cLddIdtT.js.map} +1 -1
- package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js → StreamMessageDetail-CZXWDawC.js} +2 -2
- package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js.map → StreamMessageDetail-CZXWDawC.js.map} +1 -1
- package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js → SwimlaneTimeline-fWY0gaf3.js} +2 -2
- package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js.map → SwimlaneTimeline-fWY0gaf3.js.map} +1 -1
- package/dashboard/dist/assets/{TagInput-D8gSp48D.js → TagInput-CDKbslLx.js} +2 -2
- package/dashboard/dist/assets/{TagInput-D8gSp48D.js.map → TagInput-CDKbslLx.js.map} +1 -1
- package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js → TaskDetailPage-BjE4G2yn.js} +2 -2
- package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js.map → TaskDetailPage-BjE4G2yn.js.map} +1 -1
- package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js → TaskQueuePill-G3RuYRNZ.js} +2 -2
- package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js.map → TaskQueuePill-G3RuYRNZ.js.map} +1 -1
- package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js → TasksListPage-KAhmCWB2.js} +2 -2
- package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js.map → TasksListPage-KAhmCWB2.js.map} +1 -1
- package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js → TimeAgo-C_H2TyZw.js} +2 -2
- package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js.map → TimeAgo-C_H2TyZw.js.map} +1 -1
- package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js → TimestampCell-COG_4Flg.js} +2 -2
- package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js.map → TimestampCell-COG_4Flg.js.map} +1 -1
- package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js → ToolPill-ChSyRJZC.js} +2 -2
- package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js.map → ToolPill-ChSyRJZC.js.map} +1 -1
- package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js → ToolTestPanel-BPdJECW0.js} +2 -2
- package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js.map → ToolTestPanel-BPdJECW0.js.map} +1 -1
- package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js → TopicDetailPage-DAqx5JqA.js} +3 -3
- package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js.map → TopicDetailPage-DAqx5JqA.js.map} +1 -1
- package/dashboard/dist/assets/TopicsPage-DoGqAdPm.js +2 -0
- package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js.map → TopicsPage-DoGqAdPm.js.map} +1 -1
- package/dashboard/dist/assets/{UserName-DggcLkSc.js → UserName-CKO_rk1R.js} +2 -2
- package/dashboard/dist/assets/{UserName-DggcLkSc.js.map → UserName-CKO_rk1R.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js → WorkflowExecutionPage-D3VQ9iQV.js} +2 -2
- package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js.map → WorkflowExecutionPage-D3VQ9iQV.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js → WorkflowPill-CNbwug5p.js} +2 -2
- package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js.map → WorkflowPill-CNbwug5p.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js → WorkflowsDashboard-DdJ86We6.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js.map → WorkflowsDashboard-DdJ86We6.js.map} +1 -1
- package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js → WorkflowsOverview-ZfFBzePp.js} +2 -2
- package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js.map → WorkflowsOverview-ZfFBzePp.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js → YamlWorkflowDetailPage-4bd5yXdA.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js.map → YamlWorkflowDetailPage-4bd5yXdA.js.map} +1 -1
- package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js → YamlWorkflowsPage-iHPNXjQj.js} +2 -2
- package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js.map → YamlWorkflowsPage-iHPNXjQj.js.map} +1 -1
- package/dashboard/dist/assets/{agents-mRV7m4sh.js → agents-DjD5U3Wb.js} +2 -2
- package/dashboard/dist/assets/{agents-mRV7m4sh.js.map → agents-DjD5U3Wb.js.map} +1 -1
- package/dashboard/dist/assets/{bots-SONCZlCM.js → bots-DiljVapH.js} +2 -2
- package/dashboard/dist/assets/{bots-SONCZlCM.js.map → bots-DiljVapH.js.map} +1 -1
- package/dashboard/dist/assets/{capabilities-DZjCMN32.js → capabilities-DV_5ghHT.js} +2 -2
- package/dashboard/dist/assets/{capabilities-DZjCMN32.js.map → capabilities-DV_5ghHT.js.map} +1 -1
- package/dashboard/dist/assets/{controlplane-RQNXjna2.js → controlplane-BKMvfWCB.js} +2 -2
- package/dashboard/dist/assets/{controlplane-RQNXjna2.js.map → controlplane-BKMvfWCB.js.map} +1 -1
- package/dashboard/dist/assets/escalation-columns-BQpCaJId.js +2 -0
- package/dashboard/dist/assets/escalation-columns-BQpCaJId.js.map +1 -0
- package/dashboard/dist/assets/{index-iHV3d7o3.js → index-B-WkiNRN.js} +2 -2
- package/dashboard/dist/assets/{index-iHV3d7o3.js.map → index-B-WkiNRN.js.map} +1 -1
- package/dashboard/dist/assets/{index-DY_hlZCQ.js → index-BO-7S9Xw.js} +2 -2
- package/dashboard/dist/assets/{index-DY_hlZCQ.js.map → index-BO-7S9Xw.js.map} +1 -1
- package/dashboard/dist/assets/{index-CK-6m8e_.js → index-BaV3l0UE.js} +2 -2
- package/dashboard/dist/assets/{index-CK-6m8e_.js.map → index-BaV3l0UE.js.map} +1 -1
- package/dashboard/dist/assets/{index-CxVGlkK6.js → index-BsOxMMmb.js} +2 -2
- package/dashboard/dist/assets/{index-CxVGlkK6.js.map → index-BsOxMMmb.js.map} +1 -1
- package/dashboard/dist/assets/{index-CkeSxuZ0.js → index-CI8rrKjx.js} +2 -2
- package/dashboard/dist/assets/{index-CkeSxuZ0.js.map → index-CI8rrKjx.js.map} +1 -1
- package/dashboard/dist/assets/{index-DYKRtstT.js → index-CItsikDw.js} +2 -2
- package/dashboard/dist/assets/{index-DYKRtstT.js.map → index-CItsikDw.js.map} +1 -1
- package/dashboard/dist/assets/{index-C6GsrvX1.js → index-CStR4uIU.js} +2 -2
- package/dashboard/dist/assets/{index-C6GsrvX1.js.map → index-CStR4uIU.js.map} +1 -1
- package/dashboard/dist/assets/{index-Dh3CVChT.js → index-DbTD-dio.js} +26 -26
- package/dashboard/dist/assets/index-DbTD-dio.js.map +1 -0
- package/dashboard/dist/assets/{index-DqsLfO-0.js → index-DhATO1cS.js} +2 -2
- package/dashboard/dist/assets/{index-DqsLfO-0.js.map → index-DhATO1cS.js.map} +1 -1
- package/dashboard/dist/assets/index-DnlsDaAw.css +1 -0
- package/dashboard/dist/assets/{index-ymm58cTW.js → index-Tx_ETzcH.js} +2 -2
- package/dashboard/dist/assets/{index-ymm58cTW.js.map → index-Tx_ETzcH.js.map} +1 -1
- package/dashboard/dist/assets/{index-D2CfSx_x.js → index-kzIIeVbx.js} +4 -4
- package/dashboard/dist/assets/{index-D2CfSx_x.js.map → index-kzIIeVbx.js.map} +1 -1
- package/dashboard/dist/assets/{index-DFJF8aWz.js → index-nIrYejxe.js} +2 -2
- package/dashboard/dist/assets/{index-DFJF8aWz.js.map → index-nIrYejxe.js.map} +1 -1
- package/dashboard/dist/assets/{index-DbZpL10z.js → index-xZqQxqu2.js} +2 -2
- package/dashboard/dist/assets/{index-DbZpL10z.js.map → index-xZqQxqu2.js.map} +1 -1
- package/dashboard/dist/assets/{knowledge-Bawo8u7l.js → knowledge-BocTnSiA.js} +2 -2
- package/dashboard/dist/assets/{knowledge-Bawo8u7l.js.map → knowledge-BocTnSiA.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-CKIpbpRZ.js → mcp-C1KBjKQ_.js} +2 -2
- package/dashboard/dist/assets/{mcp-CKIpbpRZ.js.map → mcp-C1KBjKQ_.js.map} +1 -1
- package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js → mcp-query-B3cjukkA.js} +2 -2
- package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js.map → mcp-query-B3cjukkA.js.map} +1 -1
- package/dashboard/dist/assets/{personas-BsARc3df.js → personas-DiA2bJaX.js} +2 -2
- package/dashboard/dist/assets/{personas-BsARc3df.js.map → personas-DiA2bJaX.js.map} +1 -1
- package/dashboard/dist/assets/{pipelines-BTSL-5ko.js → pipelines-Dt2d2EFR.js} +2 -2
- package/dashboard/dist/assets/{pipelines-BTSL-5ko.js.map → pipelines-Dt2d2EFR.js.map} +1 -1
- package/dashboard/dist/assets/{tasks-DggQdNbj.js → tasks-cDh2hNml.js} +2 -2
- package/dashboard/dist/assets/{tasks-DggQdNbj.js.map → tasks-cDh2hNml.js.map} +1 -1
- package/dashboard/dist/assets/{topics-DzAKa34X.js → topics-yFlGF-u1.js} +2 -2
- package/dashboard/dist/assets/{topics-DzAKa34X.js.map → topics-yFlGF-u1.js.map} +1 -1
- package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js → useEventHooks-D2R_ckS8.js} +2 -2
- package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js.map → useEventHooks-D2R_ckS8.js.map} +1 -1
- package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js → useFilterParams-B7suPsIK.js} +2 -2
- package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js.map → useFilterParams-B7suPsIK.js.map} +1 -1
- package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js → useNamespace-u-V1GVUD.js} +2 -2
- package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js.map → useNamespace-u-V1GVUD.js.map} +1 -1
- package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js → useYamlActivityEvents-BhOZeqgE.js} +2 -2
- package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js.map → useYamlActivityEvents-BhOZeqgE.js.map} +1 -1
- package/dashboard/dist/assets/{users-AO8lUyNr.js → users-BoXPwdee.js} +2 -2
- package/dashboard/dist/assets/{users-AO8lUyNr.js.map → users-BoXPwdee.js.map} +1 -1
- package/dashboard/dist/assets/{vendor-icons-DN9yGSuM.js → vendor-icons-D71XjkNy.js} +131 -136
- package/dashboard/dist/assets/vendor-icons-D71XjkNy.js.map +1 -0
- package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js → vendor-react-C1YOyCSV.js} +2 -2
- package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js.map → vendor-react-C1YOyCSV.js.map} +1 -1
- package/dashboard/dist/assets/{workflows-PtnlRK09.js → workflows-mCoyKuLZ.js} +2 -2
- package/dashboard/dist/assets/{workflows-PtnlRK09.js.map → workflows-mCoyKuLZ.js.map} +1 -1
- package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js → yaml-workflows-CWxXGDpn.js} +2 -2
- package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js.map → yaml-workflows-CWxXGDpn.js.map} +1 -1
- package/dashboard/dist/index.html +4 -4
- package/docs/dashboard.md +9 -2
- package/docs/design-principles.md +4 -0
- package/docs/hitl/pinned-views.md +3 -3
- package/docs/operations.md +1 -1
- package/package.json +1 -1
- package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js +0 -2
- package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +0 -1
- package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +0 -2
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js +0 -2
- package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +0 -1
- package/dashboard/dist/assets/ListToolbar-BFHVOba6.js +0 -2
- package/dashboard/dist/assets/ListToolbar-BFHVOba6.js.map +0 -1
- package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js +0 -2
- package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js.map +0 -1
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +0 -2
- package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +0 -1
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +0 -8
- package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +0 -1
- package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +0 -2
- package/dashboard/dist/assets/TopicsPage-CAP-GUbr.js +0 -2
- package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js +0 -2
- package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js.map +0 -1
- package/dashboard/dist/assets/index-2BwHxjCw.css +0 -1
- package/dashboard/dist/assets/index-Dh3CVChT.js.map +0 -1
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js +0 -2
- package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +0 -1
- package/dashboard/dist/assets/vendor-icons-DN9yGSuM.js.map +0 -1
|
@@ -40,6 +40,7 @@ exports.listDistinctTypes = listDistinctTypes;
|
|
|
40
40
|
exports.getEscalationStats = getEscalationStats;
|
|
41
41
|
exports.getStationMetrics = getStationMetrics;
|
|
42
42
|
const escalationService = __importStar(require("../../services/escalation"));
|
|
43
|
+
const features_1 = require("../../modules/features");
|
|
43
44
|
const helpers_1 = require("./helpers");
|
|
44
45
|
/** True when the caller asked for anything the plain list path can't express. */
|
|
45
46
|
function hasFacetQuery(i) {
|
|
@@ -278,10 +279,16 @@ async function getStationMetrics(input, auth) {
|
|
|
278
279
|
try {
|
|
279
280
|
// Station metrics are aggregate queue-SHAPE counts (pending/claimed/resolved
|
|
280
281
|
// + jeopardy) per role — the depth of a lane, not the disclosure of any one
|
|
281
|
-
// item.
|
|
282
|
-
//
|
|
283
|
-
//
|
|
284
|
-
//
|
|
282
|
+
// item. With publicPaceBoard (the default) every authenticated caller sees
|
|
283
|
+
// every station: the board is trends, and per-item lists stay behind their
|
|
284
|
+
// own RBAC. With the flag off, the view narrows to role membership,
|
|
285
|
+
// including read_scope='self' roles (whose per-item lists stay narrowed
|
|
286
|
+
// elsewhere) — without the selfRoles union, a self-scoped operator would
|
|
287
|
+
// see an empty board on their own lanes.
|
|
288
|
+
if ((0, features_1.getFeatureFlags)().publicPaceBoard) {
|
|
289
|
+
const stations = await escalationService.getStationMetrics(undefined, input.period);
|
|
290
|
+
return { status: 200, data: { stations } };
|
|
291
|
+
}
|
|
285
292
|
const scope = await (0, helpers_1.getEscalationReadScope)(auth.userId);
|
|
286
293
|
const memberRoles = [...scope.allRoles, ...scope.selfRoles];
|
|
287
294
|
if (!scope.global && memberRoles.length === 0) {
|
package/build/api/roles.d.ts
CHANGED
|
@@ -96,6 +96,8 @@ export declare function updateRole(input: {
|
|
|
96
96
|
}[] | null;
|
|
97
97
|
properties?: Record<string, any> | null;
|
|
98
98
|
ops_visible?: boolean;
|
|
99
|
+
/** Make this role's sequence the home Pace Board's default segment (single-holder: setting it clears the previous holder). */
|
|
100
|
+
ops_home_default?: boolean;
|
|
99
101
|
parent_role?: string | null;
|
|
100
102
|
sla_minutes?: number | null;
|
|
101
103
|
target_per_hour?: number | null;
|
package/build/api/roles.js
CHANGED
|
@@ -225,6 +225,9 @@ async function updateRole(input) {
|
|
|
225
225
|
if (input.ops_visible !== undefined && typeof input.ops_visible !== 'boolean') {
|
|
226
226
|
return { status: 400, error: 'ops_visible must be a boolean' };
|
|
227
227
|
}
|
|
228
|
+
if (input.ops_home_default !== undefined && typeof input.ops_home_default !== 'boolean') {
|
|
229
|
+
return { status: 400, error: 'ops_home_default must be a boolean' };
|
|
230
|
+
}
|
|
228
231
|
if (input.enforce_schema !== undefined && typeof input.enforce_schema !== 'boolean') {
|
|
229
232
|
return { status: 400, error: 'enforce_schema must be a boolean' };
|
|
230
233
|
}
|
|
@@ -262,6 +265,7 @@ async function updateRole(input) {
|
|
|
262
265
|
default_pins: input.default_pins,
|
|
263
266
|
properties: input.properties,
|
|
264
267
|
ops_visible: input.ops_visible,
|
|
268
|
+
ops_home_default: input.ops_home_default,
|
|
265
269
|
parent_role: input.parent_role,
|
|
266
270
|
sla_minutes: input.sla_minutes,
|
|
267
271
|
target_per_hour: input.target_per_hour,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Migration 025: Home Pace Board default segment
|
|
2
|
+
--
|
|
3
|
+
-- ops_home_default marks the role whose sequence leads the HOME page's Pace
|
|
4
|
+
-- Board. The board's full view lives on /operations; the home embed shows one
|
|
5
|
+
-- segment, and this flag lets an operator pick which one — a subordinate
|
|
6
|
+
-- setting under ops_visible on Role Detail. Single-holder: setting it on one
|
|
7
|
+
-- role clears it everywhere else in the same atomic statement. When no role
|
|
8
|
+
-- carries it, the home board falls back to the primary (first) segment.
|
|
9
|
+
|
|
10
|
+
ALTER TABLE lt_roles
|
|
11
|
+
ADD COLUMN IF NOT EXISTS ops_home_default BOOLEAN NOT NULL DEFAULT false;
|
|
@@ -12,6 +12,15 @@ export interface FeatureFlags {
|
|
|
12
12
|
* Default: true. Set `features.dbMaintenance: false` in start config to hide it.
|
|
13
13
|
*/
|
|
14
14
|
dbMaintenance: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* The Pace Board is readable by every authenticated user: station metrics
|
|
17
|
+
* (aggregate queue-shape counts and trends — never item content) span all
|
|
18
|
+
* roles for any login, and the board leads everyone's home page. Default:
|
|
19
|
+
* true. Set `features.publicPaceBoard: false` to scope metrics back to role
|
|
20
|
+
* membership — the right call for deployments that provision external
|
|
21
|
+
* one-time accounts (e.g. a customer resolving a single form).
|
|
22
|
+
*/
|
|
23
|
+
publicPaceBoard: boolean;
|
|
15
24
|
}
|
|
16
25
|
/** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
|
|
17
26
|
export declare function configureFeatureFlags(patch?: Partial<FeatureFlags>): void;
|
|
@@ -4,6 +4,7 @@ exports.configureFeatureFlags = configureFeatureFlags;
|
|
|
4
4
|
exports.getFeatureFlags = getFeatureFlags;
|
|
5
5
|
const DEFAULT_FLAGS = {
|
|
6
6
|
dbMaintenance: true,
|
|
7
|
+
publicPaceBoard: true,
|
|
7
8
|
};
|
|
8
9
|
let flags = { ...DEFAULT_FLAGS };
|
|
9
10
|
/** Merge a partial set of flags from the start config. Unspecified flags keep their default. */
|
|
@@ -149,6 +149,7 @@ async function updateRoleMetadata(role, input) {
|
|
|
149
149
|
provided('list_schema'), input.list_schema != null ? JSON.stringify(input.list_schema) : null,
|
|
150
150
|
provided('default_pins'), input.default_pins != null ? JSON.stringify(input.default_pins) : null,
|
|
151
151
|
provided('enforce_schema'), input.enforce_schema ?? null,
|
|
152
|
+
provided('ops_home_default'), input.ops_home_default ?? null,
|
|
152
153
|
]);
|
|
153
154
|
if (!rows[0])
|
|
154
155
|
return null;
|
|
@@ -46,8 +46,12 @@ export declare const DELETE_ROLE = "\n DELETE FROM lt_roles WHERE role = $1";
|
|
|
46
46
|
* enforce_schema ($33 = provided sentinel, $34 = value) is unversioned config:
|
|
47
47
|
* the server-side resolver-validation opt-in. The service layer invalidates
|
|
48
48
|
* the enforcement cache after this statement commits.
|
|
49
|
+
*
|
|
50
|
+
* ops_home_default ($35 = provided sentinel, $36 = value) is single-holder:
|
|
51
|
+
* setting it true clears the flag on every other role in the same statement
|
|
52
|
+
* (the home_clear CTE touches only OTHER rows, so the two UPDATEs never meet).
|
|
49
53
|
*/
|
|
50
|
-
export declare const UPDATE_ROLE_METADATA = "\n WITH updated AS (\n UPDATE lt_roles SET\n title = CASE WHEN $2::boolean THEN $3 ELSE title END,\n description = CASE WHEN $4::boolean THEN $5 ELSE description END,\n form_schema = CASE WHEN $6::boolean THEN $7::jsonb ELSE form_schema END,\n metadata_schema = CASE WHEN $8::boolean THEN $9::jsonb ELSE metadata_schema END,\n properties = CASE WHEN $10::boolean THEN COALESCE($11::jsonb, '{}'::jsonb) ELSE properties END,\n ops_visible = CASE WHEN $12::boolean THEN $13::boolean ELSE ops_visible END,\n parent_role = CASE WHEN $14::boolean THEN $15 ELSE parent_role END,\n sla_minutes = CASE WHEN $16::boolean THEN $17::numeric ELSE sla_minutes END,\n target_per_hour = CASE WHEN $18::boolean THEN $19::numeric ELSE target_per_hour END,\n worker_count = CASE WHEN $20::boolean THEN $21::int ELSE worker_count END,\n priority_threshold_minutes\n = CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,\n priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,\n list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,\n default_pins = CASE WHEN $31::boolean THEN $32::jsonb ELSE default_pins END,\n enforce_schema = CASE WHEN $33::boolean THEN COALESCE($34::boolean, false) ELSE enforce_schema END,\n current_schema_version = CASE\n WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)\n OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)\n THEN COALESCE(current_schema_version, 0) + 1\n ELSE current_schema_version END,\n current_list_schema_version = CASE\n WHEN $29::boolean AND $30::jsonb IS DISTINCT FROM list_schema\n THEN COALESCE(current_list_schema_version, 0) + 1\n ELSE current_list_schema_version END\n WHERE role = $1\n RETURNING\n role, title, description, form_schema, metadata_schema, properties,\n ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,\n priority_threshold_minutes, priority_facet,\n current_schema_version, list_schema, current_list_schema_version,\n default_pins, enforce_schema\n ), snapshot AS (\n INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)\n SELECT role, current_schema_version, form_schema, metadata_schema, $26\n FROM updated\n WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), list_snapshot AS (\n INSERT INTO lt_role_list_schemas (role, version, list_schema, change_summary)\n SELECT role, current_list_schema_version, list_schema, $26\n FROM updated\n WHERE $29::boolean AND current_list_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), upstream_prune AS (\n DELETE FROM lt_role_upstreams\n WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])\n ), upstream_add AS (\n INSERT INTO lt_role_upstreams (role, upstream_role)\n SELECT $1, u FROM unnest($28::text[]) AS u\n WHERE $27::boolean\n ON CONFLICT DO NOTHING\n )\n SELECT * FROM updated";
|
|
54
|
+
export declare const UPDATE_ROLE_METADATA = "\n WITH home_clear AS (\n UPDATE lt_roles SET ops_home_default = false\n WHERE $35::boolean AND COALESCE($36::boolean, false) AND role <> $1 AND ops_home_default\n ), updated AS (\n UPDATE lt_roles SET\n title = CASE WHEN $2::boolean THEN $3 ELSE title END,\n description = CASE WHEN $4::boolean THEN $5 ELSE description END,\n form_schema = CASE WHEN $6::boolean THEN $7::jsonb ELSE form_schema END,\n metadata_schema = CASE WHEN $8::boolean THEN $9::jsonb ELSE metadata_schema END,\n properties = CASE WHEN $10::boolean THEN COALESCE($11::jsonb, '{}'::jsonb) ELSE properties END,\n ops_visible = CASE WHEN $12::boolean THEN $13::boolean ELSE ops_visible END,\n parent_role = CASE WHEN $14::boolean THEN $15 ELSE parent_role END,\n sla_minutes = CASE WHEN $16::boolean THEN $17::numeric ELSE sla_minutes END,\n target_per_hour = CASE WHEN $18::boolean THEN $19::numeric ELSE target_per_hour END,\n worker_count = CASE WHEN $20::boolean THEN $21::int ELSE worker_count END,\n priority_threshold_minutes\n = CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,\n priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,\n list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,\n default_pins = CASE WHEN $31::boolean THEN $32::jsonb ELSE default_pins END,\n enforce_schema = CASE WHEN $33::boolean THEN COALESCE($34::boolean, false) ELSE enforce_schema END,\n ops_home_default = CASE WHEN $35::boolean THEN COALESCE($36::boolean, false) ELSE ops_home_default END,\n current_schema_version = CASE\n WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)\n OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)\n THEN COALESCE(current_schema_version, 0) + 1\n ELSE current_schema_version END,\n current_list_schema_version = CASE\n WHEN $29::boolean AND $30::jsonb IS DISTINCT FROM list_schema\n THEN COALESCE(current_list_schema_version, 0) + 1\n ELSE current_list_schema_version END\n WHERE role = $1\n RETURNING\n role, title, description, form_schema, metadata_schema, properties,\n ops_visible, ops_home_default, parent_role, sla_minutes, target_per_hour, worker_count,\n priority_threshold_minutes, priority_facet,\n current_schema_version, list_schema, current_list_schema_version,\n default_pins, enforce_schema\n ), snapshot AS (\n INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)\n SELECT role, current_schema_version, form_schema, metadata_schema, $26\n FROM updated\n WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), list_snapshot AS (\n INSERT INTO lt_role_list_schemas (role, version, list_schema, change_summary)\n SELECT role, current_list_schema_version, list_schema, $26\n FROM updated\n WHERE $29::boolean AND current_list_schema_version IS NOT NULL\n ON CONFLICT (role, version) DO NOTHING\n ), upstream_prune AS (\n DELETE FROM lt_role_upstreams\n WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])\n ), upstream_add AS (\n INSERT INTO lt_role_upstreams (role, upstream_role)\n SELECT $1, u FROM unnest($28::text[]) AS u\n WHERE $27::boolean\n ON CONFLICT DO NOTHING\n )\n SELECT * FROM updated";
|
|
51
55
|
export declare const GET_ROLE_FORM_SCHEMA = "\n SELECT form_schema FROM lt_roles WHERE role = $1";
|
|
52
56
|
/**
|
|
53
57
|
* The set of roles with server-side resolver validation turned on. Small and
|
|
@@ -71,7 +75,7 @@ export declare const GET_ROLE_LIST_SCHEMA_VERSION = "\n SELECT s.role, s.versio
|
|
|
71
75
|
* never versioned its list schema still answers, with version NULL).
|
|
72
76
|
*/
|
|
73
77
|
export declare const GET_ROLE_LIST_SCHEMA_CURRENT = "\n SELECT r.role, r.current_list_schema_version AS version, r.list_schema,\n s.change_summary, s.created_at,\n r.current_list_schema_version AS latest_version\n FROM lt_roles r\n LEFT JOIN lt_role_list_schemas s\n ON s.role = r.role AND s.version = r.current_list_schema_version\n WHERE r.role = $1";
|
|
74
|
-
export declare const LIST_ROLES_WITH_DETAILS = "\n WITH\n user_counts AS (\n SELECT role, COUNT(DISTINCT user_id)::int AS cnt\n FROM lt_user_roles\n GROUP BY role\n ),\n chain_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM (\n SELECT source_role AS role FROM lt_config_role_escalations\n UNION ALL\n SELECT target_role AS role FROM lt_config_role_escalations\n ) c\n GROUP BY role\n ),\n workflow_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM lt_config_roles\n GROUP BY role\n ),\n upstreams AS (\n SELECT role, array_agg(upstream_role ORDER BY upstream_role) AS ups\n FROM lt_role_upstreams\n GROUP BY role\n )\n SELECT\n r.role,\n r.title,\n r.description,\n r.form_schema,\n r.metadata_schema,\n r.properties,\n r.ops_visible,\n r.parent_role,\n r.sla_minutes,\n r.target_per_hour,\n r.worker_count,\n r.priority_threshold_minutes,\n r.priority_facet,\n r.current_schema_version,\n r.list_schema,\n r.current_list_schema_version,\n r.default_pins,\n r.enforce_schema,\n COALESCE(up.ups, '{}') AS upstream_roles,\n COALESCE(uc.cnt, 0) AS user_count,\n COALESCE(cc.cnt, 0) AS chain_count,\n COALESCE(wc.cnt, 0) AS workflow_count\n FROM lt_roles r\n LEFT JOIN user_counts uc ON uc.role = r.role\n LEFT JOIN chain_counts cc ON cc.role = r.role\n LEFT JOIN workflow_counts wc ON wc.role = r.role\n LEFT JOIN upstreams up ON up.role = r.role\n ORDER BY r.role";
|
|
78
|
+
export declare const LIST_ROLES_WITH_DETAILS = "\n WITH\n user_counts AS (\n SELECT role, COUNT(DISTINCT user_id)::int AS cnt\n FROM lt_user_roles\n GROUP BY role\n ),\n chain_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM (\n SELECT source_role AS role FROM lt_config_role_escalations\n UNION ALL\n SELECT target_role AS role FROM lt_config_role_escalations\n ) c\n GROUP BY role\n ),\n workflow_counts AS (\n SELECT role, COUNT(*)::int AS cnt\n FROM lt_config_roles\n GROUP BY role\n ),\n upstreams AS (\n SELECT role, array_agg(upstream_role ORDER BY upstream_role) AS ups\n FROM lt_role_upstreams\n GROUP BY role\n )\n SELECT\n r.role,\n r.title,\n r.description,\n r.form_schema,\n r.metadata_schema,\n r.properties,\n r.ops_visible,\n r.ops_home_default,\n r.parent_role,\n r.sla_minutes,\n r.target_per_hour,\n r.worker_count,\n r.priority_threshold_minutes,\n r.priority_facet,\n r.current_schema_version,\n r.list_schema,\n r.current_list_schema_version,\n r.default_pins,\n r.enforce_schema,\n COALESCE(up.ups, '{}') AS upstream_roles,\n COALESCE(uc.cnt, 0) AS user_count,\n COALESCE(cc.cnt, 0) AS chain_count,\n COALESCE(wc.cnt, 0) AS workflow_count\n FROM lt_roles r\n LEFT JOIN user_counts uc ON uc.role = r.role\n LEFT JOIN chain_counts cc ON cc.role = r.role\n LEFT JOIN workflow_counts wc ON wc.role = r.role\n LEFT JOIN upstreams up ON up.role = r.role\n ORDER BY r.role";
|
|
75
79
|
export declare const COUNT_USER_ROLE_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_user_roles WHERE role = $1";
|
|
76
80
|
export declare const COUNT_CHAIN_REFS = "\n SELECT COUNT(*)::int AS cnt\n FROM lt_config_role_escalations\n WHERE source_role = $1 OR target_role = $1";
|
|
77
81
|
export declare const COUNT_WORKFLOW_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_config_roles WHERE role = $1";
|
|
@@ -80,9 +80,16 @@ exports.DELETE_ROLE = `
|
|
|
80
80
|
* enforce_schema ($33 = provided sentinel, $34 = value) is unversioned config:
|
|
81
81
|
* the server-side resolver-validation opt-in. The service layer invalidates
|
|
82
82
|
* the enforcement cache after this statement commits.
|
|
83
|
+
*
|
|
84
|
+
* ops_home_default ($35 = provided sentinel, $36 = value) is single-holder:
|
|
85
|
+
* setting it true clears the flag on every other role in the same statement
|
|
86
|
+
* (the home_clear CTE touches only OTHER rows, so the two UPDATEs never meet).
|
|
83
87
|
*/
|
|
84
88
|
exports.UPDATE_ROLE_METADATA = `
|
|
85
|
-
WITH
|
|
89
|
+
WITH home_clear AS (
|
|
90
|
+
UPDATE lt_roles SET ops_home_default = false
|
|
91
|
+
WHERE $35::boolean AND COALESCE($36::boolean, false) AND role <> $1 AND ops_home_default
|
|
92
|
+
), updated AS (
|
|
86
93
|
UPDATE lt_roles SET
|
|
87
94
|
title = CASE WHEN $2::boolean THEN $3 ELSE title END,
|
|
88
95
|
description = CASE WHEN $4::boolean THEN $5 ELSE description END,
|
|
@@ -100,6 +107,7 @@ exports.UPDATE_ROLE_METADATA = `
|
|
|
100
107
|
list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,
|
|
101
108
|
default_pins = CASE WHEN $31::boolean THEN $32::jsonb ELSE default_pins END,
|
|
102
109
|
enforce_schema = CASE WHEN $33::boolean THEN COALESCE($34::boolean, false) ELSE enforce_schema END,
|
|
110
|
+
ops_home_default = CASE WHEN $35::boolean THEN COALESCE($36::boolean, false) ELSE ops_home_default END,
|
|
103
111
|
current_schema_version = CASE
|
|
104
112
|
WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)
|
|
105
113
|
OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)
|
|
@@ -112,7 +120,7 @@ exports.UPDATE_ROLE_METADATA = `
|
|
|
112
120
|
WHERE role = $1
|
|
113
121
|
RETURNING
|
|
114
122
|
role, title, description, form_schema, metadata_schema, properties,
|
|
115
|
-
ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,
|
|
123
|
+
ops_visible, ops_home_default, parent_role, sla_minutes, target_per_hour, worker_count,
|
|
116
124
|
priority_threshold_minutes, priority_facet,
|
|
117
125
|
current_schema_version, list_schema, current_list_schema_version,
|
|
118
126
|
default_pins, enforce_schema
|
|
@@ -247,6 +255,7 @@ exports.LIST_ROLES_WITH_DETAILS = `
|
|
|
247
255
|
r.metadata_schema,
|
|
248
256
|
r.properties,
|
|
249
257
|
r.ops_visible,
|
|
258
|
+
r.ops_home_default,
|
|
250
259
|
r.parent_role,
|
|
251
260
|
r.sla_minutes,
|
|
252
261
|
r.target_per_hour,
|
|
@@ -20,6 +20,13 @@ export interface RoleDetail {
|
|
|
20
20
|
/** Free-form user-owned bag. No reserved keys — use for icons, colors, tags, etc. */
|
|
21
21
|
properties: Record<string, any>;
|
|
22
22
|
ops_visible: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Marks this role's sequence as the HOME page's default Pace Board segment.
|
|
25
|
+
* Single-holder: setting it on one role clears it everywhere else. Only
|
|
26
|
+
* meaningful while ops_visible is on; unset anywhere → the home board shows
|
|
27
|
+
* the primary (first) segment.
|
|
28
|
+
*/
|
|
29
|
+
ops_home_default: boolean;
|
|
23
30
|
parent_role: string | null;
|
|
24
31
|
/** Target resolution time (minutes). Part of the ops triangle. */
|
|
25
32
|
sla_minutes: number | null;
|
|
@@ -134,6 +141,8 @@ export interface UpdateRoleInput {
|
|
|
134
141
|
}[] | null;
|
|
135
142
|
properties?: Record<string, any> | null;
|
|
136
143
|
ops_visible?: boolean;
|
|
144
|
+
/** Make this role's sequence the home Pace Board's default segment (single-holder). */
|
|
145
|
+
ops_home_default?: boolean;
|
|
137
146
|
parent_role?: string | null;
|
|
138
147
|
sla_minutes?: number | null;
|
|
139
148
|
target_per_hour?: number | null;
|
|
@@ -561,6 +561,7 @@ export declare const updateRoleSchema: z.ZodObject<{
|
|
|
561
561
|
metadata_schema: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
|
|
562
562
|
properties: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
|
|
563
563
|
ops_visible: z.ZodOptional<z.ZodBoolean>;
|
|
564
|
+
ops_home_default: z.ZodOptional<z.ZodBoolean>;
|
|
564
565
|
parent_role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
565
566
|
sla_minutes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
566
567
|
target_per_hour: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
@@ -598,6 +599,7 @@ export declare const updateRoleSchema: z.ZodObject<{
|
|
|
598
599
|
badge?: boolean | undefined;
|
|
599
600
|
}[] | null | undefined;
|
|
600
601
|
ops_visible?: boolean | undefined;
|
|
602
|
+
ops_home_default?: boolean | undefined;
|
|
601
603
|
parent_role?: string | null | undefined;
|
|
602
604
|
sla_minutes?: number | null | undefined;
|
|
603
605
|
target_per_hour?: number | null | undefined;
|
|
@@ -621,6 +623,7 @@ export declare const updateRoleSchema: z.ZodObject<{
|
|
|
621
623
|
badge?: boolean | undefined;
|
|
622
624
|
}[] | null | undefined;
|
|
623
625
|
ops_visible?: boolean | undefined;
|
|
626
|
+
ops_home_default?: boolean | undefined;
|
|
624
627
|
parent_role?: string | null | undefined;
|
|
625
628
|
sla_minutes?: number | null | undefined;
|
|
626
629
|
target_per_hour?: number | null | undefined;
|
|
@@ -243,6 +243,7 @@ exports.updateRoleSchema = zod_1.z.object({
|
|
|
243
243
|
metadata_schema: zod_1.z.record(zod_1.z.any()).nullable().optional().describe('JSON Schema declaring the expected shape of lt_escalations.metadata for this role. Drives creation-time validation and faceted-query key autocomplete.'),
|
|
244
244
|
properties: zod_1.z.record(zod_1.z.any()).nullable().optional().describe('Free user-owned bag (icon, color, tags, etc.). No reserved keys — use the typed columns below for operational values.'),
|
|
245
245
|
ops_visible: zod_1.z.boolean().optional().describe('When true, role appears as a station on the /operations view'),
|
|
246
|
+
ops_home_default: zod_1.z.boolean().optional().describe('Make this role\'s sequence the home Pace Board\'s default segment. Single-holder — setting it true clears the flag on every other role.'),
|
|
246
247
|
parent_role: zod_1.z.string().nullable().optional().describe('Parent role in the process dependency graph (nullable; roots have no parent)'),
|
|
247
248
|
sla_minutes: zod_1.z.number().nullable().optional().describe('Target resolution time in minutes. One of the capacity settings: target_per_hour = worker_count / (sla_minutes / 60)'),
|
|
248
249
|
target_per_hour: zod_1.z.number().nullable().optional().describe('Intended throughput (items resolved per hour). Drives the station pace baseline on the Operations view.'),
|
|
@@ -209,6 +209,7 @@ function registerUserTools(server) {
|
|
|
209
209
|
metadata_schema: args.metadata_schema,
|
|
210
210
|
properties: args.properties,
|
|
211
211
|
ops_visible: args.ops_visible,
|
|
212
|
+
ops_home_default: args.ops_home_default,
|
|
212
213
|
parent_role: args.parent_role,
|
|
213
214
|
sla_minutes: args.sla_minutes,
|
|
214
215
|
target_per_hour: args.target_per_hour,
|