@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.
Files changed (241) hide show
  1. package/build/api/escalations/list.js +11 -4
  2. package/build/api/roles.d.ts +2 -0
  3. package/build/api/roles.js +4 -0
  4. package/build/lib/db/schemas/025_ops_home_default.sql +11 -0
  5. package/build/modules/features.d.ts +9 -0
  6. package/build/modules/features.js +1 -0
  7. package/build/services/role/index.js +1 -0
  8. package/build/services/role/sql.d.ts +6 -2
  9. package/build/services/role/sql.js +11 -2
  10. package/build/services/role/types.d.ts +9 -0
  11. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  12. package/build/system/mcp-servers/admin/schemas.js +1 -0
  13. package/build/system/mcp-servers/admin/users.js +1 -0
  14. package/build/system/seed/tool-manifests-admin.d.ts +82 -0
  15. package/build/system/seed/tool-manifests-admin.js +1 -1
  16. package/build/types/startup.d.ts +8 -0
  17. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js → AdminDashboard-CkTbRfY9.js} +2 -2
  18. package/dashboard/dist/assets/{AdminDashboard-cGYuppUP.js.map → AdminDashboard-CkTbRfY9.js.map} +1 -1
  19. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js → AgentConfigPage-Cm8FRpXi.js} +2 -2
  20. package/dashboard/dist/assets/{AgentConfigPage-DwaUyoCy.js.map → AgentConfigPage-Cm8FRpXi.js.map} +1 -1
  21. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js → AgentDetailPage-sQ1-UT46.js} +2 -2
  22. package/dashboard/dist/assets/{AgentDetailPage-DxpFaltM.js.map → AgentDetailPage-sQ1-UT46.js.map} +1 -1
  23. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js → AgentsPage-bSx_mdae.js} +2 -2
  24. package/dashboard/dist/assets/{AgentsPage-ByOoA8oT.js.map → AgentsPage-bSx_mdae.js.map} +1 -1
  25. package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js +2 -0
  26. package/dashboard/dist/assets/AvailableEscalationsPage-8pMC7Xv6.js.map +1 -0
  27. package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js → BotPicker-C4uGH2x9.js} +2 -2
  28. package/dashboard/dist/assets/{BotPicker-Dohv8dhR.js.map → BotPicker-C4uGH2x9.js.map} +1 -1
  29. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js → CapabilitiesPage-BRoOeKcc.js} +2 -2
  30. package/dashboard/dist/assets/{CapabilitiesPage-DeijFG3J.js.map → CapabilitiesPage-BRoOeKcc.js.map} +1 -1
  31. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js → CollapsibleSection-CIj8Adc9.js} +2 -2
  32. package/dashboard/dist/assets/{CollapsibleSection-BPNwS4eO.js.map → CollapsibleSection-CIj8Adc9.js.map} +1 -1
  33. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js → ConfirmDeleteModal-Ugi_9Ukq.js} +2 -2
  34. package/dashboard/dist/assets/{ConfirmDeleteModal-DD7SEMeX.js.map → ConfirmDeleteModal-Ugi_9Ukq.js.map} +1 -1
  35. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js → CopyableId-GUEdiiL5.js} +2 -2
  36. package/dashboard/dist/assets/{CopyableId-BpB-NvDh.js.map → CopyableId-GUEdiiL5.js.map} +1 -1
  37. package/dashboard/dist/assets/CountdownTimer-D3t0XMhE.js +2 -0
  38. package/dashboard/dist/assets/{CountdownTimer-BF71ldGF.js.map → CountdownTimer-D3t0XMhE.js.map} +1 -1
  39. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js → CredentialsPage-B73Si6K1.js} +2 -2
  40. package/dashboard/dist/assets/{CredentialsPage-oeNmMzTM.js.map → CredentialsPage-B73Si6K1.js.map} +1 -1
  41. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js → CronLabel-Ca1aHolt.js} +2 -2
  42. package/dashboard/dist/assets/{CronLabel-CebR1m2k.js.map → CronLabel-Ca1aHolt.js.map} +1 -1
  43. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js → CustomDurationPicker-_9E9x1YN.js} +2 -2
  44. package/dashboard/dist/assets/{CustomDurationPicker-Bh9QdBVw.js.map → CustomDurationPicker-_9E9x1YN.js.map} +1 -1
  45. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js → DropZone-NYn6TWHz.js} +2 -2
  46. package/dashboard/dist/assets/{DropZone-Bavzt2QR.js.map → DropZone-NYn6TWHz.js.map} +1 -1
  47. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js → ElapsedCell-karxia93.js} +2 -2
  48. package/dashboard/dist/assets/{ElapsedCell-Caa6CU_y.js.map → ElapsedCell-karxia93.js.map} +1 -1
  49. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js → EscalationListSchemaPage-CDaNmbUA.js} +2 -2
  50. package/dashboard/dist/assets/{EscalationListSchemaPage-CAGfq0eK.js.map → EscalationListSchemaPage-CDaNmbUA.js.map} +1 -1
  51. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js → EscalationSchemaPage-k-2hFT2t.js} +2 -2
  52. package/dashboard/dist/assets/{EscalationSchemaPage-qDD4ur6P.js.map → EscalationSchemaPage-k-2hFT2t.js.map} +1 -1
  53. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js → EscalationsOverview-C1e7IPn_.js} +2 -2
  54. package/dashboard/dist/assets/{EscalationsOverview-CC1wRTzy.js.map → EscalationsOverview-C1e7IPn_.js.map} +1 -1
  55. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js → EventTable-CIrrtL7_.js} +2 -2
  56. package/dashboard/dist/assets/{EventTable-4JeTcXr_.js.map → EventTable-CIrrtL7_.js.map} +1 -1
  57. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js → FilterBar-CzjtH74v.js} +2 -2
  58. package/dashboard/dist/assets/{FilterBar-BOV8DWIO.js.map → FilterBar-CzjtH74v.js.map} +1 -1
  59. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js → GraphInvokePage-LMpWw8z1.js} +2 -2
  60. package/dashboard/dist/assets/{GraphInvokePage-C0i1speW.js.map → GraphInvokePage-LMpWw8z1.js.map} +1 -1
  61. package/dashboard/dist/assets/HomePage-Kl2DBG6l.js +2 -0
  62. package/dashboard/dist/assets/HomePage-Kl2DBG6l.js.map +1 -0
  63. package/dashboard/dist/assets/ListToolbar-B2fub0DY.js +2 -0
  64. package/dashboard/dist/assets/ListToolbar-B2fub0DY.js.map +1 -0
  65. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js → McpOverview-odYnCZCC.js} +2 -2
  66. package/dashboard/dist/assets/{McpOverview-Chn2zIXr.js.map → McpOverview-odYnCZCC.js.map} +1 -1
  67. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js → McpQueryDetailPage-BtqwHUAg.js} +2 -2
  68. package/dashboard/dist/assets/{McpQueryDetailPage-Cv1FKrvw.js.map → McpQueryDetailPage-BtqwHUAg.js.map} +1 -1
  69. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js → McpQueryPage-CPkVwNIK.js} +2 -2
  70. package/dashboard/dist/assets/{McpQueryPage-Dzn8JE4E.js.map → McpQueryPage-CPkVwNIK.js.map} +1 -1
  71. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js → McpRunDetailPage-D-Rz9MRw.js} +2 -2
  72. package/dashboard/dist/assets/{McpRunDetailPage-CuNtR4Ed.js.map → McpRunDetailPage-D-Rz9MRw.js.map} +1 -1
  73. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js → McpRunsPage-rdpZ2yMh.js} +2 -2
  74. package/dashboard/dist/assets/{McpRunsPage-C8iifeKN.js.map → McpRunsPage-rdpZ2yMh.js.map} +1 -1
  75. package/dashboard/dist/assets/{Modal-CA2Iv02H.js → Modal-Dr1Xy0j0.js} +2 -2
  76. package/dashboard/dist/assets/{Modal-CA2Iv02H.js.map → Modal-Dr1Xy0j0.js.map} +1 -1
  77. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js → NamespacePill-GwO-WfhX.js} +2 -2
  78. package/dashboard/dist/assets/{NamespacePill-ep9Zmokr.js.map → NamespacePill-GwO-WfhX.js.map} +1 -1
  79. package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js +2 -0
  80. package/dashboard/dist/assets/OperationsPage-DlyGLPAs.js.map +1 -0
  81. package/dashboard/dist/assets/OperatorDashboard-Csei5vj-.js +2 -0
  82. package/dashboard/dist/assets/OperatorDashboard-Csei5vj-.js.map +1 -0
  83. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js → PageHeader-Bo9BU9pK.js} +2 -2
  84. package/dashboard/dist/assets/{PageHeader-Bw8RNkqR.js.map → PageHeader-Bo9BU9pK.js.map} +1 -1
  85. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js → PageHeaderWithStats-8_5cOSKL.js} +2 -2
  86. package/dashboard/dist/assets/{PageHeaderWithStats-NR_4idn6.js.map → PageHeaderWithStats-8_5cOSKL.js.map} +1 -1
  87. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js → PersonaDetailPage--ZL6Or6v.js} +2 -2
  88. package/dashboard/dist/assets/{PersonaDetailPage-DKILoUqL.js.map → PersonaDetailPage--ZL6Or6v.js.map} +1 -1
  89. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js → PersonasPage-Bdcoay3P.js} +2 -2
  90. package/dashboard/dist/assets/{PersonasPage-qvzHTrFw.js.map → PersonasPage-Bdcoay3P.js.map} +1 -1
  91. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js → ProcessDetailPage-HrmVQq7S.js} +2 -2
  92. package/dashboard/dist/assets/{ProcessDetailPage-C3LfeKvi.js.map → ProcessDetailPage-HrmVQq7S.js.map} +1 -1
  93. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js → ProcessesListPage-_xmj6Bo-.js} +2 -2
  94. package/dashboard/dist/assets/{ProcessesListPage-OoZ_u4ty.js.map → ProcessesListPage-_xmj6Bo-.js.map} +1 -1
  95. package/dashboard/dist/assets/RoleDetailPage-C0ju2-4K.js +8 -0
  96. package/dashboard/dist/assets/RoleDetailPage-C0ju2-4K.js.map +1 -0
  97. package/dashboard/dist/assets/{RolePill-TySZq7dB.js → RolePill-CQlnEWkK.js} +2 -2
  98. package/dashboard/dist/assets/{RolePill-TySZq7dB.js.map → RolePill-CQlnEWkK.js.map} +1 -1
  99. package/dashboard/dist/assets/RolesPage-CKluVSpB.js +2 -0
  100. package/dashboard/dist/assets/{RolesPage-CNueMVuJ.js.map → RolesPage-CKluVSpB.js.map} +1 -1
  101. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js → RunAsSelector-DdfecQ1U.js} +2 -2
  102. package/dashboard/dist/assets/{RunAsSelector-CwWEpiSF.js.map → RunAsSelector-DdfecQ1U.js.map} +1 -1
  103. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js → ScopeBadge-BBYkevuR.js} +2 -2
  104. package/dashboard/dist/assets/{ScopeBadge-C7Uixtmk.js.map → ScopeBadge-BBYkevuR.js.map} +1 -1
  105. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js → StickyPagination-cLddIdtT.js} +2 -2
  106. package/dashboard/dist/assets/{StickyPagination-DvIF3kQK.js.map → StickyPagination-cLddIdtT.js.map} +1 -1
  107. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js → StreamMessageDetail-CZXWDawC.js} +2 -2
  108. package/dashboard/dist/assets/{StreamMessageDetail-DkFK_XGD.js.map → StreamMessageDetail-CZXWDawC.js.map} +1 -1
  109. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js → SwimlaneTimeline-fWY0gaf3.js} +2 -2
  110. package/dashboard/dist/assets/{SwimlaneTimeline-CMw-Et6h.js.map → SwimlaneTimeline-fWY0gaf3.js.map} +1 -1
  111. package/dashboard/dist/assets/{TagInput-D8gSp48D.js → TagInput-CDKbslLx.js} +2 -2
  112. package/dashboard/dist/assets/{TagInput-D8gSp48D.js.map → TagInput-CDKbslLx.js.map} +1 -1
  113. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js → TaskDetailPage-BjE4G2yn.js} +2 -2
  114. package/dashboard/dist/assets/{TaskDetailPage-BhXuChOf.js.map → TaskDetailPage-BjE4G2yn.js.map} +1 -1
  115. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js → TaskQueuePill-G3RuYRNZ.js} +2 -2
  116. package/dashboard/dist/assets/{TaskQueuePill-CHqolBmU.js.map → TaskQueuePill-G3RuYRNZ.js.map} +1 -1
  117. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js → TasksListPage-KAhmCWB2.js} +2 -2
  118. package/dashboard/dist/assets/{TasksListPage-6JHQQ5QZ.js.map → TasksListPage-KAhmCWB2.js.map} +1 -1
  119. package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js → TimeAgo-C_H2TyZw.js} +2 -2
  120. package/dashboard/dist/assets/{TimeAgo-CInx-vzY.js.map → TimeAgo-C_H2TyZw.js.map} +1 -1
  121. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js → TimestampCell-COG_4Flg.js} +2 -2
  122. package/dashboard/dist/assets/{TimestampCell-Fq17Zrsu.js.map → TimestampCell-COG_4Flg.js.map} +1 -1
  123. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js → ToolPill-ChSyRJZC.js} +2 -2
  124. package/dashboard/dist/assets/{ToolPill-BbgMDhaE.js.map → ToolPill-ChSyRJZC.js.map} +1 -1
  125. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js → ToolTestPanel-BPdJECW0.js} +2 -2
  126. package/dashboard/dist/assets/{ToolTestPanel-DhjEe59s.js.map → ToolTestPanel-BPdJECW0.js.map} +1 -1
  127. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js → TopicDetailPage-DAqx5JqA.js} +3 -3
  128. package/dashboard/dist/assets/{TopicDetailPage-DbIdmQpQ.js.map → TopicDetailPage-DAqx5JqA.js.map} +1 -1
  129. package/dashboard/dist/assets/TopicsPage-DoGqAdPm.js +2 -0
  130. package/dashboard/dist/assets/{TopicsPage-CAP-GUbr.js.map → TopicsPage-DoGqAdPm.js.map} +1 -1
  131. package/dashboard/dist/assets/{UserName-DggcLkSc.js → UserName-CKO_rk1R.js} +2 -2
  132. package/dashboard/dist/assets/{UserName-DggcLkSc.js.map → UserName-CKO_rk1R.js.map} +1 -1
  133. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js → WorkflowExecutionPage-D3VQ9iQV.js} +2 -2
  134. package/dashboard/dist/assets/{WorkflowExecutionPage-Bmra5fVt.js.map → WorkflowExecutionPage-D3VQ9iQV.js.map} +1 -1
  135. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js → WorkflowPill-CNbwug5p.js} +2 -2
  136. package/dashboard/dist/assets/{WorkflowPill-CcUUVugA.js.map → WorkflowPill-CNbwug5p.js.map} +1 -1
  137. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js → WorkflowsDashboard-DdJ86We6.js} +2 -2
  138. package/dashboard/dist/assets/{WorkflowsDashboard-BQsZAGYU.js.map → WorkflowsDashboard-DdJ86We6.js.map} +1 -1
  139. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js → WorkflowsOverview-ZfFBzePp.js} +2 -2
  140. package/dashboard/dist/assets/{WorkflowsOverview-CeliraHZ.js.map → WorkflowsOverview-ZfFBzePp.js.map} +1 -1
  141. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js → YamlWorkflowDetailPage-4bd5yXdA.js} +2 -2
  142. package/dashboard/dist/assets/{YamlWorkflowDetailPage-DGxlonrV.js.map → YamlWorkflowDetailPage-4bd5yXdA.js.map} +1 -1
  143. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js → YamlWorkflowsPage-iHPNXjQj.js} +2 -2
  144. package/dashboard/dist/assets/{YamlWorkflowsPage-DnT8UiyQ.js.map → YamlWorkflowsPage-iHPNXjQj.js.map} +1 -1
  145. package/dashboard/dist/assets/{agents-mRV7m4sh.js → agents-DjD5U3Wb.js} +2 -2
  146. package/dashboard/dist/assets/{agents-mRV7m4sh.js.map → agents-DjD5U3Wb.js.map} +1 -1
  147. package/dashboard/dist/assets/{bots-SONCZlCM.js → bots-DiljVapH.js} +2 -2
  148. package/dashboard/dist/assets/{bots-SONCZlCM.js.map → bots-DiljVapH.js.map} +1 -1
  149. package/dashboard/dist/assets/{capabilities-DZjCMN32.js → capabilities-DV_5ghHT.js} +2 -2
  150. package/dashboard/dist/assets/{capabilities-DZjCMN32.js.map → capabilities-DV_5ghHT.js.map} +1 -1
  151. package/dashboard/dist/assets/{controlplane-RQNXjna2.js → controlplane-BKMvfWCB.js} +2 -2
  152. package/dashboard/dist/assets/{controlplane-RQNXjna2.js.map → controlplane-BKMvfWCB.js.map} +1 -1
  153. package/dashboard/dist/assets/escalation-columns-BQpCaJId.js +2 -0
  154. package/dashboard/dist/assets/escalation-columns-BQpCaJId.js.map +1 -0
  155. package/dashboard/dist/assets/{index-iHV3d7o3.js → index-B-WkiNRN.js} +2 -2
  156. package/dashboard/dist/assets/{index-iHV3d7o3.js.map → index-B-WkiNRN.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-DY_hlZCQ.js → index-BO-7S9Xw.js} +2 -2
  158. package/dashboard/dist/assets/{index-DY_hlZCQ.js.map → index-BO-7S9Xw.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-CK-6m8e_.js → index-BaV3l0UE.js} +2 -2
  160. package/dashboard/dist/assets/{index-CK-6m8e_.js.map → index-BaV3l0UE.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-CxVGlkK6.js → index-BsOxMMmb.js} +2 -2
  162. package/dashboard/dist/assets/{index-CxVGlkK6.js.map → index-BsOxMMmb.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-CkeSxuZ0.js → index-CI8rrKjx.js} +2 -2
  164. package/dashboard/dist/assets/{index-CkeSxuZ0.js.map → index-CI8rrKjx.js.map} +1 -1
  165. package/dashboard/dist/assets/{index-DYKRtstT.js → index-CItsikDw.js} +2 -2
  166. package/dashboard/dist/assets/{index-DYKRtstT.js.map → index-CItsikDw.js.map} +1 -1
  167. package/dashboard/dist/assets/{index-C6GsrvX1.js → index-CStR4uIU.js} +2 -2
  168. package/dashboard/dist/assets/{index-C6GsrvX1.js.map → index-CStR4uIU.js.map} +1 -1
  169. package/dashboard/dist/assets/{index-Dh3CVChT.js → index-DbTD-dio.js} +26 -26
  170. package/dashboard/dist/assets/index-DbTD-dio.js.map +1 -0
  171. package/dashboard/dist/assets/{index-DqsLfO-0.js → index-DhATO1cS.js} +2 -2
  172. package/dashboard/dist/assets/{index-DqsLfO-0.js.map → index-DhATO1cS.js.map} +1 -1
  173. package/dashboard/dist/assets/index-DnlsDaAw.css +1 -0
  174. package/dashboard/dist/assets/{index-ymm58cTW.js → index-Tx_ETzcH.js} +2 -2
  175. package/dashboard/dist/assets/{index-ymm58cTW.js.map → index-Tx_ETzcH.js.map} +1 -1
  176. package/dashboard/dist/assets/{index-D2CfSx_x.js → index-kzIIeVbx.js} +4 -4
  177. package/dashboard/dist/assets/{index-D2CfSx_x.js.map → index-kzIIeVbx.js.map} +1 -1
  178. package/dashboard/dist/assets/{index-DFJF8aWz.js → index-nIrYejxe.js} +2 -2
  179. package/dashboard/dist/assets/{index-DFJF8aWz.js.map → index-nIrYejxe.js.map} +1 -1
  180. package/dashboard/dist/assets/{index-DbZpL10z.js → index-xZqQxqu2.js} +2 -2
  181. package/dashboard/dist/assets/{index-DbZpL10z.js.map → index-xZqQxqu2.js.map} +1 -1
  182. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js → knowledge-BocTnSiA.js} +2 -2
  183. package/dashboard/dist/assets/{knowledge-Bawo8u7l.js.map → knowledge-BocTnSiA.js.map} +1 -1
  184. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js → mcp-C1KBjKQ_.js} +2 -2
  185. package/dashboard/dist/assets/{mcp-CKIpbpRZ.js.map → mcp-C1KBjKQ_.js.map} +1 -1
  186. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js → mcp-query-B3cjukkA.js} +2 -2
  187. package/dashboard/dist/assets/{mcp-query-vld4hYxQ.js.map → mcp-query-B3cjukkA.js.map} +1 -1
  188. package/dashboard/dist/assets/{personas-BsARc3df.js → personas-DiA2bJaX.js} +2 -2
  189. package/dashboard/dist/assets/{personas-BsARc3df.js.map → personas-DiA2bJaX.js.map} +1 -1
  190. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js → pipelines-Dt2d2EFR.js} +2 -2
  191. package/dashboard/dist/assets/{pipelines-BTSL-5ko.js.map → pipelines-Dt2d2EFR.js.map} +1 -1
  192. package/dashboard/dist/assets/{tasks-DggQdNbj.js → tasks-cDh2hNml.js} +2 -2
  193. package/dashboard/dist/assets/{tasks-DggQdNbj.js.map → tasks-cDh2hNml.js.map} +1 -1
  194. package/dashboard/dist/assets/{topics-DzAKa34X.js → topics-yFlGF-u1.js} +2 -2
  195. package/dashboard/dist/assets/{topics-DzAKa34X.js.map → topics-yFlGF-u1.js.map} +1 -1
  196. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js → useEventHooks-D2R_ckS8.js} +2 -2
  197. package/dashboard/dist/assets/{useEventHooks-5uI9oI5W.js.map → useEventHooks-D2R_ckS8.js.map} +1 -1
  198. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js → useFilterParams-B7suPsIK.js} +2 -2
  199. package/dashboard/dist/assets/{useFilterParams-CvRyYHJN.js.map → useFilterParams-B7suPsIK.js.map} +1 -1
  200. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js → useNamespace-u-V1GVUD.js} +2 -2
  201. package/dashboard/dist/assets/{useNamespace-CEKzFIqe.js.map → useNamespace-u-V1GVUD.js.map} +1 -1
  202. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js → useYamlActivityEvents-BhOZeqgE.js} +2 -2
  203. package/dashboard/dist/assets/{useYamlActivityEvents-hHgX1Z50.js.map → useYamlActivityEvents-BhOZeqgE.js.map} +1 -1
  204. package/dashboard/dist/assets/{users-AO8lUyNr.js → users-BoXPwdee.js} +2 -2
  205. package/dashboard/dist/assets/{users-AO8lUyNr.js.map → users-BoXPwdee.js.map} +1 -1
  206. package/dashboard/dist/assets/{vendor-icons-DN9yGSuM.js → vendor-icons-D71XjkNy.js} +131 -136
  207. package/dashboard/dist/assets/vendor-icons-D71XjkNy.js.map +1 -0
  208. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js → vendor-react-C1YOyCSV.js} +2 -2
  209. package/dashboard/dist/assets/{vendor-react-BpdAFEQc.js.map → vendor-react-C1YOyCSV.js.map} +1 -1
  210. package/dashboard/dist/assets/{workflows-PtnlRK09.js → workflows-mCoyKuLZ.js} +2 -2
  211. package/dashboard/dist/assets/{workflows-PtnlRK09.js.map → workflows-mCoyKuLZ.js.map} +1 -1
  212. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js → yaml-workflows-CWxXGDpn.js} +2 -2
  213. package/dashboard/dist/assets/{yaml-workflows-DPu3Y8vG.js.map → yaml-workflows-CWxXGDpn.js.map} +1 -1
  214. package/dashboard/dist/index.html +4 -4
  215. package/docs/dashboard.md +9 -2
  216. package/docs/design-principles.md +4 -0
  217. package/docs/hitl/pinned-views.md +3 -3
  218. package/docs/operations.md +1 -1
  219. package/package.json +1 -1
  220. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js +0 -2
  221. package/dashboard/dist/assets/AvailableEscalationsPage-C1vtTvqP.js.map +0 -1
  222. package/dashboard/dist/assets/CountdownTimer-BF71ldGF.js +0 -2
  223. package/dashboard/dist/assets/HomePage-HPCd8SjF.js +0 -2
  224. package/dashboard/dist/assets/HomePage-HPCd8SjF.js.map +0 -1
  225. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js +0 -2
  226. package/dashboard/dist/assets/ListToolbar-BFHVOba6.js.map +0 -1
  227. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js +0 -2
  228. package/dashboard/dist/assets/OperationsPage-flrZ-EJ9.js.map +0 -1
  229. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js +0 -2
  230. package/dashboard/dist/assets/OperatorDashboard-Dhs2eo8p.js.map +0 -1
  231. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js +0 -8
  232. package/dashboard/dist/assets/RoleDetailPage-D70jTLZm.js.map +0 -1
  233. package/dashboard/dist/assets/RolesPage-CNueMVuJ.js +0 -2
  234. package/dashboard/dist/assets/TopicsPage-CAP-GUbr.js +0 -2
  235. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js +0 -2
  236. package/dashboard/dist/assets/escalation-columns-XLEcZRCg.js.map +0 -1
  237. package/dashboard/dist/assets/index-2BwHxjCw.css +0 -1
  238. package/dashboard/dist/assets/index-Dh3CVChT.js.map +0 -1
  239. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +0 -2
  240. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +0 -1
  241. 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. Membership in a role entitles you to see its shape, so this view
282
- // spans every role the user belongs to, including read_scope='self' roles
283
- // (whose per-item lists stay narrowed elsewhere). Without the selfRoles
284
- // union, a self-scoped operator would see an empty board on their own lanes.
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) {
@@ -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;
@@ -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 updated AS (
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,