@hotmeshio/long-tail 0.8.5 → 0.9.0

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 (236) hide show
  1. package/build/api/roles.d.ts +21 -0
  2. package/build/api/roles.js +50 -0
  3. package/build/lib/db/schemas/021_role_list_schema.sql +27 -0
  4. package/build/routes/roles.js +20 -0
  5. package/build/services/role/index.d.ts +13 -1
  6. package/build/services/role/index.js +27 -0
  7. package/build/services/role/sql.d.ts +14 -2
  8. package/build/services/role/sql.js +51 -3
  9. package/build/services/role/types.d.ts +27 -0
  10. package/dashboard/dist/assets/{AdminDashboard-RrSvb8d-.js → AdminDashboard-5bWcBxyS.js} +2 -2
  11. package/dashboard/dist/assets/{AdminDashboard-RrSvb8d-.js.map → AdminDashboard-5bWcBxyS.js.map} +1 -1
  12. package/dashboard/dist/assets/{AgentConfigPage-5RMdI0ku.js → AgentConfigPage-CVg_tFbf.js} +6 -6
  13. package/dashboard/dist/assets/{AgentConfigPage-5RMdI0ku.js.map → AgentConfigPage-CVg_tFbf.js.map} +1 -1
  14. package/dashboard/dist/assets/{AgentDetailPage-C_-sIBcr.js → AgentDetailPage-CLlkIoRQ.js} +4 -4
  15. package/dashboard/dist/assets/{AgentDetailPage-C_-sIBcr.js.map → AgentDetailPage-CLlkIoRQ.js.map} +1 -1
  16. package/dashboard/dist/assets/{AgentsPage-CxNNtSsf.js → AgentsPage-CjruF_ek.js} +2 -2
  17. package/dashboard/dist/assets/{AgentsPage-CxNNtSsf.js.map → AgentsPage-CjruF_ek.js.map} +1 -1
  18. package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js +2 -0
  19. package/dashboard/dist/assets/AvailableEscalationsPage-h6awiuVk.js.map +1 -0
  20. package/dashboard/dist/assets/{BotPicker-BQVz6bye.js → BotPicker-CGEFHHDE.js} +2 -2
  21. package/dashboard/dist/assets/{BotPicker-BQVz6bye.js.map → BotPicker-CGEFHHDE.js.map} +1 -1
  22. package/dashboard/dist/assets/{CapabilitiesPage-DlZ8SgO3.js → CapabilitiesPage-BI1tNYun.js} +2 -2
  23. package/dashboard/dist/assets/{CapabilitiesPage-DlZ8SgO3.js.map → CapabilitiesPage-BI1tNYun.js.map} +1 -1
  24. package/dashboard/dist/assets/{CollapsibleSection-lo8Qx4zb.js → CollapsibleSection-B9f52Z2K.js} +2 -2
  25. package/dashboard/dist/assets/{CollapsibleSection-lo8Qx4zb.js.map → CollapsibleSection-B9f52Z2K.js.map} +1 -1
  26. package/dashboard/dist/assets/{CopyableId-blg-gZvT.js → CopyableId-uot2mE_g.js} +2 -2
  27. package/dashboard/dist/assets/{CopyableId-blg-gZvT.js.map → CopyableId-uot2mE_g.js.map} +1 -1
  28. package/dashboard/dist/assets/CountdownTimer-C71erQ67.js +2 -0
  29. package/dashboard/dist/assets/CountdownTimer-C71erQ67.js.map +1 -0
  30. package/dashboard/dist/assets/{CredentialsPage-DJ9DyXsO.js → CredentialsPage-smk5H_mP.js} +2 -2
  31. package/dashboard/dist/assets/{CredentialsPage-DJ9DyXsO.js.map → CredentialsPage-smk5H_mP.js.map} +1 -1
  32. package/dashboard/dist/assets/{CronLabel-o0dbisw1.js → CronLabel-CCJLmkIq.js} +2 -2
  33. package/dashboard/dist/assets/{CronLabel-o0dbisw1.js.map → CronLabel-CCJLmkIq.js.map} +1 -1
  34. package/dashboard/dist/assets/CustomDurationPicker-DQ28g5GB.js +2 -0
  35. package/dashboard/dist/assets/CustomDurationPicker-DQ28g5GB.js.map +1 -0
  36. package/dashboard/dist/assets/DataTable-Byn3oyT9.js +2 -0
  37. package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +1 -0
  38. package/dashboard/dist/assets/{DropZone-SgiK1WOl.js → DropZone-C_Mc4UrO.js} +2 -2
  39. package/dashboard/dist/assets/{DropZone-SgiK1WOl.js.map → DropZone-C_Mc4UrO.js.map} +1 -1
  40. package/dashboard/dist/assets/{ElapsedCell-N22STQcg.js → ElapsedCell-Cw1uvJKx.js} +2 -2
  41. package/dashboard/dist/assets/{ElapsedCell-N22STQcg.js.map → ElapsedCell-Cw1uvJKx.js.map} +1 -1
  42. package/dashboard/dist/assets/EscalationListSchemaPage-3v2tiCnq.js +20 -0
  43. package/dashboard/dist/assets/EscalationListSchemaPage-3v2tiCnq.js.map +1 -0
  44. package/dashboard/dist/assets/{EscalationSchemaPage-Zsmewko2.js → EscalationSchemaPage-DIq2pMED.js} +2 -2
  45. package/dashboard/dist/assets/{EscalationSchemaPage-Zsmewko2.js.map → EscalationSchemaPage-DIq2pMED.js.map} +1 -1
  46. package/dashboard/dist/assets/{EscalationsOverview-CE2p70Ct.js → EscalationsOverview-BqOZ1v8w.js} +2 -2
  47. package/dashboard/dist/assets/{EscalationsOverview-CE2p70Ct.js.map → EscalationsOverview-BqOZ1v8w.js.map} +1 -1
  48. package/dashboard/dist/assets/EventTable-CyfHfOWj.js +2 -0
  49. package/dashboard/dist/assets/EventTable-CyfHfOWj.js.map +1 -0
  50. package/dashboard/dist/assets/{FilterBar-B4Mk2PvT.js → FilterBar-DDIn8TOs.js} +2 -2
  51. package/dashboard/dist/assets/{FilterBar-B4Mk2PvT.js.map → FilterBar-DDIn8TOs.js.map} +1 -1
  52. package/dashboard/dist/assets/{GraphInvokePage-DywWVSdj.js → GraphInvokePage-DbNUaWhH.js} +2 -2
  53. package/dashboard/dist/assets/{GraphInvokePage-DywWVSdj.js.map → GraphInvokePage-DbNUaWhH.js.map} +1 -1
  54. package/dashboard/dist/assets/{HomePage-CxtBiULd.js → HomePage-Cj9sLt4Z.js} +2 -2
  55. package/dashboard/dist/assets/{HomePage-CxtBiULd.js.map → HomePage-Cj9sLt4Z.js.map} +1 -1
  56. package/dashboard/dist/assets/{ListToolbar-Ok2O0wmC.js → ListToolbar-D7PoQOZC.js} +2 -2
  57. package/dashboard/dist/assets/{ListToolbar-Ok2O0wmC.js.map → ListToolbar-D7PoQOZC.js.map} +1 -1
  58. package/dashboard/dist/assets/{McpOverview-CTCYZXIp.js → McpOverview-D9g1iJyn.js} +2 -2
  59. package/dashboard/dist/assets/{McpOverview-CTCYZXIp.js.map → McpOverview-D9g1iJyn.js.map} +1 -1
  60. package/dashboard/dist/assets/{McpQueryDetailPage-BOaXf0bZ.js → McpQueryDetailPage-DwS1pXdT.js} +2 -2
  61. package/dashboard/dist/assets/{McpQueryDetailPage-BOaXf0bZ.js.map → McpQueryDetailPage-DwS1pXdT.js.map} +1 -1
  62. package/dashboard/dist/assets/{McpQueryPage-BbYojoHu.js → McpQueryPage-DZQ1z6-H.js} +2 -2
  63. package/dashboard/dist/assets/{McpQueryPage-BbYojoHu.js.map → McpQueryPage-DZQ1z6-H.js.map} +1 -1
  64. package/dashboard/dist/assets/McpRunDetailPage-Bx6w39lr.js +2 -0
  65. package/dashboard/dist/assets/{McpRunDetailPage-CXGCVmPq.js.map → McpRunDetailPage-Bx6w39lr.js.map} +1 -1
  66. package/dashboard/dist/assets/{McpRunsPage-Df1GqxUg.js → McpRunsPage-C-oS_tTh.js} +2 -2
  67. package/dashboard/dist/assets/{McpRunsPage-Df1GqxUg.js.map → McpRunsPage-C-oS_tTh.js.map} +1 -1
  68. package/dashboard/dist/assets/{NamespacePill-SErKwgkb.js → NamespacePill-DhgC3EUO.js} +2 -2
  69. package/dashboard/dist/assets/{NamespacePill-SErKwgkb.js.map → NamespacePill-DhgC3EUO.js.map} +1 -1
  70. package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js +2 -0
  71. package/dashboard/dist/assets/OperationsPage-CQzX6jM1.js.map +1 -0
  72. package/dashboard/dist/assets/OperatorDashboard-Cqf87ojd.js +2 -0
  73. package/dashboard/dist/assets/{OperatorDashboard-DIR7XDeD.js.map → OperatorDashboard-Cqf87ojd.js.map} +1 -1
  74. package/dashboard/dist/assets/PageHeader-sGNTmSXX.js +2 -0
  75. package/dashboard/dist/assets/PageHeader-sGNTmSXX.js.map +1 -0
  76. package/dashboard/dist/assets/{PageHeaderWithStats-W3akV6nB.js → PageHeaderWithStats-87STTAJX.js} +2 -2
  77. package/dashboard/dist/assets/{PageHeaderWithStats-W3akV6nB.js.map → PageHeaderWithStats-87STTAJX.js.map} +1 -1
  78. package/dashboard/dist/assets/{ProcessDetailPage-BuSi654J.js → ProcessDetailPage-CplnDXkz.js} +2 -2
  79. package/dashboard/dist/assets/{ProcessDetailPage-BuSi654J.js.map → ProcessDetailPage-CplnDXkz.js.map} +1 -1
  80. package/dashboard/dist/assets/{ProcessesListPage-Dhik7XpW.js → ProcessesListPage-DFOJC27f.js} +2 -2
  81. package/dashboard/dist/assets/{ProcessesListPage-Dhik7XpW.js.map → ProcessesListPage-DFOJC27f.js.map} +1 -1
  82. package/dashboard/dist/assets/RoleDetailPage-VrWOaPlg.js +8 -0
  83. package/dashboard/dist/assets/RoleDetailPage-VrWOaPlg.js.map +1 -0
  84. package/dashboard/dist/assets/{RolePill-DHWixsQR.js → RolePill-C91qbDOW.js} +2 -2
  85. package/dashboard/dist/assets/{RolePill-DHWixsQR.js.map → RolePill-C91qbDOW.js.map} +1 -1
  86. package/dashboard/dist/assets/{RolesPage-BRicD5mx.js → RolesPage-DdI1rVAP.js} +2 -2
  87. package/dashboard/dist/assets/{RolesPage-BRicD5mx.js.map → RolesPage-DdI1rVAP.js.map} +1 -1
  88. package/dashboard/dist/assets/{RunAsSelector-DipyBf_T.js → RunAsSelector-C6EozzKV.js} +2 -2
  89. package/dashboard/dist/assets/{RunAsSelector-DipyBf_T.js.map → RunAsSelector-C6EozzKV.js.map} +1 -1
  90. package/dashboard/dist/assets/SlidePanel-BpWveV1T.js +2 -0
  91. package/dashboard/dist/assets/SlidePanel-BpWveV1T.js.map +1 -0
  92. package/dashboard/dist/assets/{StatusBadge-DZ9137bI.js → StatusBadge-CEQMRmSQ.js} +2 -2
  93. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +1 -0
  94. package/dashboard/dist/assets/{StickyPagination-CD4W450h.js → StickyPagination-BEgkYJ0-.js} +2 -2
  95. package/dashboard/dist/assets/{StickyPagination-CD4W450h.js.map → StickyPagination-BEgkYJ0-.js.map} +1 -1
  96. package/dashboard/dist/assets/{StreamMessageDetail-BbDdWDUY.js → StreamMessageDetail-DWVPtzj7.js} +2 -2
  97. package/dashboard/dist/assets/{StreamMessageDetail-BbDdWDUY.js.map → StreamMessageDetail-DWVPtzj7.js.map} +1 -1
  98. package/dashboard/dist/assets/{SwimlaneTimeline-Bktv2vi5.js → SwimlaneTimeline-4NrDJNYc.js} +2 -2
  99. package/dashboard/dist/assets/{SwimlaneTimeline-Bktv2vi5.js.map → SwimlaneTimeline-4NrDJNYc.js.map} +1 -1
  100. package/dashboard/dist/assets/{TagInput-CGGC3DTR.js → TagInput-Csm36_pS.js} +2 -2
  101. package/dashboard/dist/assets/{TagInput-CGGC3DTR.js.map → TagInput-Csm36_pS.js.map} +1 -1
  102. package/dashboard/dist/assets/{TaskDetailPage-pSU3xuG9.js → TaskDetailPage-BvdaAUtF.js} +2 -2
  103. package/dashboard/dist/assets/{TaskDetailPage-pSU3xuG9.js.map → TaskDetailPage-BvdaAUtF.js.map} +1 -1
  104. package/dashboard/dist/assets/{TaskQueuePill-D6omQJNY.js → TaskQueuePill-5XdNaqwM.js} +2 -2
  105. package/dashboard/dist/assets/{TaskQueuePill-D6omQJNY.js.map → TaskQueuePill-5XdNaqwM.js.map} +1 -1
  106. package/dashboard/dist/assets/{TasksListPage-M6ok-Nfd.js → TasksListPage-BxA161LH.js} +2 -2
  107. package/dashboard/dist/assets/{TasksListPage-M6ok-Nfd.js.map → TasksListPage-BxA161LH.js.map} +1 -1
  108. package/dashboard/dist/assets/{TimeAgo-DVWhRNbi.js → TimeAgo-ChwJ4fjZ.js} +2 -2
  109. package/dashboard/dist/assets/{TimeAgo-DVWhRNbi.js.map → TimeAgo-ChwJ4fjZ.js.map} +1 -1
  110. package/dashboard/dist/assets/{TimestampCell-rG7pmIkW.js → TimestampCell-C7KzmvyC.js} +2 -2
  111. package/dashboard/dist/assets/{TimestampCell-rG7pmIkW.js.map → TimestampCell-C7KzmvyC.js.map} +1 -1
  112. package/dashboard/dist/assets/{ToolPill-BW0iRwZu.js → ToolPill-CAwj7EPw.js} +2 -2
  113. package/dashboard/dist/assets/{ToolPill-BW0iRwZu.js.map → ToolPill-CAwj7EPw.js.map} +1 -1
  114. package/dashboard/dist/assets/{ToolTestPanel-CLcMA8OE.js → ToolTestPanel-ISkuXtkT.js} +2 -2
  115. package/dashboard/dist/assets/{ToolTestPanel-CLcMA8OE.js.map → ToolTestPanel-ISkuXtkT.js.map} +1 -1
  116. package/dashboard/dist/assets/{TopicDetailPage-C9gvoWYu.js → TopicDetailPage-D8uZ8Wbs.js} +3 -3
  117. package/dashboard/dist/assets/{TopicDetailPage-C9gvoWYu.js.map → TopicDetailPage-D8uZ8Wbs.js.map} +1 -1
  118. package/dashboard/dist/assets/TopicsPage-rj88vA_1.js +2 -0
  119. package/dashboard/dist/assets/{TopicsPage-CIGi3TdT.js.map → TopicsPage-rj88vA_1.js.map} +1 -1
  120. package/dashboard/dist/assets/{UserName-CifbOahk.js → UserName-D03Lh6Aj.js} +2 -2
  121. package/dashboard/dist/assets/{UserName-CifbOahk.js.map → UserName-D03Lh6Aj.js.map} +1 -1
  122. package/dashboard/dist/assets/WorkflowExecutionPage-LD9WzPee.js +2 -0
  123. package/dashboard/dist/assets/WorkflowExecutionPage-LD9WzPee.js.map +1 -0
  124. package/dashboard/dist/assets/{WorkflowPill-BtNBSplz.js → WorkflowPill-fodIWnT3.js} +2 -2
  125. package/dashboard/dist/assets/{WorkflowPill-BtNBSplz.js.map → WorkflowPill-fodIWnT3.js.map} +1 -1
  126. package/dashboard/dist/assets/{WorkflowsDashboard-CSYrYQsO.js → WorkflowsDashboard-DH0jitAb.js} +2 -2
  127. package/dashboard/dist/assets/{WorkflowsDashboard-CSYrYQsO.js.map → WorkflowsDashboard-DH0jitAb.js.map} +1 -1
  128. package/dashboard/dist/assets/{WorkflowsOverview-CaXWYZuw.js → WorkflowsOverview-D6BVaH9e.js} +2 -2
  129. package/dashboard/dist/assets/{WorkflowsOverview-CaXWYZuw.js.map → WorkflowsOverview-D6BVaH9e.js.map} +1 -1
  130. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CRBXahFJ.js → YamlWorkflowDetailPage-D_CfNEqW.js} +2 -2
  131. package/dashboard/dist/assets/{YamlWorkflowDetailPage-CRBXahFJ.js.map → YamlWorkflowDetailPage-D_CfNEqW.js.map} +1 -1
  132. package/dashboard/dist/assets/{YamlWorkflowsPage-D5zc8Lta.js → YamlWorkflowsPage-BMJgtcAq.js} +2 -2
  133. package/dashboard/dist/assets/{YamlWorkflowsPage-D5zc8Lta.js.map → YamlWorkflowsPage-BMJgtcAq.js.map} +1 -1
  134. package/dashboard/dist/assets/{agents-D7vYXeLj.js → agents-Ci0tZDO3.js} +2 -2
  135. package/dashboard/dist/assets/{agents-D7vYXeLj.js.map → agents-Ci0tZDO3.js.map} +1 -1
  136. package/dashboard/dist/assets/{bots-CKaYN2fL.js → bots-DZyt1oO4.js} +2 -2
  137. package/dashboard/dist/assets/{bots-CKaYN2fL.js.map → bots-DZyt1oO4.js.map} +1 -1
  138. package/dashboard/dist/assets/{capabilities-BknM6oFm.js → capabilities-DzVKeWyC.js} +2 -2
  139. package/dashboard/dist/assets/{capabilities-BknM6oFm.js.map → capabilities-DzVKeWyC.js.map} +1 -1
  140. package/dashboard/dist/assets/{controlplane-BodNGCr-.js → controlplane-CQzrn-rD.js} +2 -2
  141. package/dashboard/dist/assets/{controlplane-BodNGCr-.js.map → controlplane-CQzrn-rD.js.map} +1 -1
  142. package/dashboard/dist/assets/escalation-columns-s29Q4mrF.js +2 -0
  143. package/dashboard/dist/assets/{escalation-columns-CcbLKRI4.js.map → escalation-columns-s29Q4mrF.js.map} +1 -1
  144. package/dashboard/dist/assets/{index-Gt2Rebs9.js → index-3SrgIA7w.js} +2 -2
  145. package/dashboard/dist/assets/{index-Gt2Rebs9.js.map → index-3SrgIA7w.js.map} +1 -1
  146. package/dashboard/dist/assets/{index-BH67e1Ah.js → index-B2dB90aC.js} +2 -2
  147. package/dashboard/dist/assets/{index-BH67e1Ah.js.map → index-B2dB90aC.js.map} +1 -1
  148. package/dashboard/dist/assets/index-BSOcWfeR.js +5 -0
  149. package/dashboard/dist/assets/index-BSOcWfeR.js.map +1 -0
  150. package/dashboard/dist/assets/{index-B-LQ8fsJ.js → index-BWy4UvaT.js} +2 -2
  151. package/dashboard/dist/assets/{index-B-LQ8fsJ.js.map → index-BWy4UvaT.js.map} +1 -1
  152. package/dashboard/dist/assets/{index-C3QKGY5C.js → index-BqKxJ2fB.js} +2 -2
  153. package/dashboard/dist/assets/{index-C3QKGY5C.js.map → index-BqKxJ2fB.js.map} +1 -1
  154. package/dashboard/dist/assets/{index-B_aFcGv9.js → index-C9moIiIq.js} +5 -5
  155. package/dashboard/dist/assets/index-C9moIiIq.js.map +1 -0
  156. package/dashboard/dist/assets/{index-D7NHjvA4.js → index-CcKXMU-s.js} +2 -2
  157. package/dashboard/dist/assets/{index-D7NHjvA4.js.map → index-CcKXMU-s.js.map} +1 -1
  158. package/dashboard/dist/assets/index-DIPe82gq.css +1 -0
  159. package/dashboard/dist/assets/{index-DHhz71yv.js → index-DOHGHMP7.js} +2 -2
  160. package/dashboard/dist/assets/{index-DHhz71yv.js.map → index-DOHGHMP7.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-CdN-Z8-r.js → index-DTn4XzYN.js} +2 -2
  162. package/dashboard/dist/assets/{index-CdN-Z8-r.js.map → index-DTn4XzYN.js.map} +1 -1
  163. package/dashboard/dist/assets/index-Dv8mzG9B.js +2 -0
  164. package/dashboard/dist/assets/index-Dv8mzG9B.js.map +1 -0
  165. package/dashboard/dist/assets/{index-CV8soXIM.js → index-LwodswlU.js} +2 -2
  166. package/dashboard/dist/assets/{index-CV8soXIM.js.map → index-LwodswlU.js.map} +1 -1
  167. package/dashboard/dist/assets/{index-_gh2K9DU.js → index-kPipMHZx.js} +2 -2
  168. package/dashboard/dist/assets/{index-_gh2K9DU.js.map → index-kPipMHZx.js.map} +1 -1
  169. package/dashboard/dist/assets/{index-Bwofyfi8.js → index-sdc9ecdW.js} +2 -2
  170. package/dashboard/dist/assets/{index-Bwofyfi8.js.map → index-sdc9ecdW.js.map} +1 -1
  171. package/dashboard/dist/assets/{knowledge-CE6gjN3G.js → knowledge-fi5z5YLq.js} +2 -2
  172. package/dashboard/dist/assets/{knowledge-CE6gjN3G.js.map → knowledge-fi5z5YLq.js.map} +1 -1
  173. package/dashboard/dist/assets/{mcp-B4F-T-7R.js → mcp-CH8Tj9Pw.js} +2 -2
  174. package/dashboard/dist/assets/{mcp-B4F-T-7R.js.map → mcp-CH8Tj9Pw.js.map} +1 -1
  175. package/dashboard/dist/assets/{mcp-query-CYOarL1K.js → mcp-query-6alwNh7K.js} +2 -2
  176. package/dashboard/dist/assets/{mcp-query-CYOarL1K.js.map → mcp-query-6alwNh7K.js.map} +1 -1
  177. package/dashboard/dist/assets/{pipelines-B4gB9qMx.js → pipelines-Dqh9PLUw.js} +2 -2
  178. package/dashboard/dist/assets/{pipelines-B4gB9qMx.js.map → pipelines-Dqh9PLUw.js.map} +1 -1
  179. package/dashboard/dist/assets/roles-dJKBZUBh.js +2 -0
  180. package/dashboard/dist/assets/roles-dJKBZUBh.js.map +1 -0
  181. package/dashboard/dist/assets/{tasks-GG8c_U9w.js → tasks-BYz490un.js} +2 -2
  182. package/dashboard/dist/assets/{tasks-GG8c_U9w.js.map → tasks-BYz490un.js.map} +1 -1
  183. package/dashboard/dist/assets/{topics-C7-6oOgA.js → topics-Dt975EWi.js} +2 -2
  184. package/dashboard/dist/assets/{topics-C7-6oOgA.js.map → topics-Dt975EWi.js.map} +1 -1
  185. package/dashboard/dist/assets/{useEventHooks-82IiMmOc.js → useEventHooks-ZT6RV2Gj.js} +2 -2
  186. package/dashboard/dist/assets/{useEventHooks-82IiMmOc.js.map → useEventHooks-ZT6RV2Gj.js.map} +1 -1
  187. package/dashboard/dist/assets/{useNamespace-DQEqD2LA.js → useNamespace-B_G1iE9i.js} +2 -2
  188. package/dashboard/dist/assets/{useNamespace-DQEqD2LA.js.map → useNamespace-B_G1iE9i.js.map} +1 -1
  189. package/dashboard/dist/assets/{useYamlActivityEvents-Bm0-ewLx.js → useYamlActivityEvents-DGkvIadL.js} +2 -2
  190. package/dashboard/dist/assets/{useYamlActivityEvents-Bm0-ewLx.js.map → useYamlActivityEvents-DGkvIadL.js.map} +1 -1
  191. package/dashboard/dist/assets/{users-DHx2ium7.js → users-C2jopvM1.js} +2 -2
  192. package/dashboard/dist/assets/{users-DHx2ium7.js.map → users-C2jopvM1.js.map} +1 -1
  193. package/dashboard/dist/assets/{vendor-icons-DOIDKgo6.js → vendor-icons-BXhWQC7l.js} +161 -121
  194. package/dashboard/dist/assets/vendor-icons-BXhWQC7l.js.map +1 -0
  195. package/dashboard/dist/assets/{workflows-qIbkeQ_5.js → workflows-By8Wgvig.js} +2 -2
  196. package/dashboard/dist/assets/{workflows-qIbkeQ_5.js.map → workflows-By8Wgvig.js.map} +1 -1
  197. package/dashboard/dist/assets/{yaml-workflows-FibyeHpo.js → yaml-workflows-Cq_vp41d.js} +2 -2
  198. package/dashboard/dist/assets/{yaml-workflows-FibyeHpo.js.map → yaml-workflows-Cq_vp41d.js.map} +1 -1
  199. package/dashboard/dist/index.html +3 -3
  200. package/docs/dashboard.md +15 -2
  201. package/docs/hitl-guide.md +132 -22
  202. package/package.json +2 -2
  203. package/dashboard/dist/assets/AvailableEscalationsPage-BcbhA6NE.js +0 -2
  204. package/dashboard/dist/assets/AvailableEscalationsPage-BcbhA6NE.js.map +0 -1
  205. package/dashboard/dist/assets/CustomDurationPicker-CGiwKSVJ.js +0 -2
  206. package/dashboard/dist/assets/CustomDurationPicker-CGiwKSVJ.js.map +0 -1
  207. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js +0 -2
  208. package/dashboard/dist/assets/DataTable-ZWgVQg7F.js.map +0 -1
  209. package/dashboard/dist/assets/EventTable-B3Gj7Ayg.js +0 -2
  210. package/dashboard/dist/assets/EventTable-B3Gj7Ayg.js.map +0 -1
  211. package/dashboard/dist/assets/McpRunDetailPage-CXGCVmPq.js +0 -2
  212. package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js +0 -2
  213. package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js.map +0 -1
  214. package/dashboard/dist/assets/OperatorDashboard-DIR7XDeD.js +0 -2
  215. package/dashboard/dist/assets/PageHeader-DJo7yMUR.js +0 -2
  216. package/dashboard/dist/assets/PageHeader-DJo7yMUR.js.map +0 -1
  217. package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js +0 -8
  218. package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js.map +0 -1
  219. package/dashboard/dist/assets/StatusBadge-DZ9137bI.js.map +0 -1
  220. package/dashboard/dist/assets/TopicsPage-CIGi3TdT.js +0 -2
  221. package/dashboard/dist/assets/WorkflowExecutionPage-BR0oVx_p.js +0 -2
  222. package/dashboard/dist/assets/WorkflowExecutionPage-BR0oVx_p.js.map +0 -1
  223. package/dashboard/dist/assets/escalation-CH_XK2XM.js +0 -2
  224. package/dashboard/dist/assets/escalation-CH_XK2XM.js.map +0 -1
  225. package/dashboard/dist/assets/escalation-columns-CcbLKRI4.js +0 -2
  226. package/dashboard/dist/assets/index--xNp5rx6.css +0 -1
  227. package/dashboard/dist/assets/index-B_aFcGv9.js.map +0 -1
  228. package/dashboard/dist/assets/index-CJpywoA8.js +0 -2
  229. package/dashboard/dist/assets/index-CJpywoA8.js.map +0 -1
  230. package/dashboard/dist/assets/index-IIq5Tkqs.js +0 -6
  231. package/dashboard/dist/assets/index-IIq5Tkqs.js.map +0 -1
  232. package/dashboard/dist/assets/roles-LZf98ePg.js +0 -2
  233. package/dashboard/dist/assets/roles-LZf98ePg.js.map +0 -1
  234. package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js +0 -2
  235. package/dashboard/dist/assets/useCollapsedSections-BU5HULGs.js.map +0 -1
  236. package/dashboard/dist/assets/vendor-icons-DOIDKgo6.js.map +0 -1
@@ -86,6 +86,8 @@ export declare function updateRole(input: {
86
86
  /** The escalation resolve FORM schema (the JIT UI). Fields may carry x-lt-bind. */
87
87
  form_schema?: Record<string, any> | null;
88
88
  metadata_schema?: Record<string, any> | null;
89
+ /** The escalation LIST schema — rich formatting for this role's list page. */
90
+ list_schema?: Record<string, any> | null;
89
91
  properties?: Record<string, any> | null;
90
92
  ops_visible?: boolean;
91
93
  parent_role?: string | null;
@@ -129,6 +131,25 @@ export declare function getRoleSchema(input: {
129
131
  export declare function listRoleSchemaVersions(input: {
130
132
  role: string;
131
133
  }): Promise<LTApiResult>;
134
+ /**
135
+ * Fetch a role's LIST schema (independent version lineage from the form schema).
136
+ * With `version`, returns that immutable snapshot — a missing version is a 404.
137
+ * Without `version`, returns the live (latest) list schema with its version.
138
+ *
139
+ * @returns `{ status: 200, data: RoleListSchemaVersion }` on success
140
+ */
141
+ export declare function getRoleListSchema(input: {
142
+ role: string;
143
+ version?: number;
144
+ }): Promise<LTApiResult>;
145
+ /**
146
+ * List a role's LIST schema version history, newest first.
147
+ *
148
+ * @returns `{ status: 200, data: { versions: RoleListSchemaVersionSummary[] } }`
149
+ */
150
+ export declare function listRoleListSchemaVersions(input: {
151
+ role: string;
152
+ }): Promise<LTApiResult>;
132
153
  /**
133
154
  * Delete a role from the system. Requires admin privileges.
134
155
  *
@@ -44,6 +44,8 @@ exports.replaceEscalationTargets = replaceEscalationTargets;
44
44
  exports.updateRole = updateRole;
45
45
  exports.getRoleSchema = getRoleSchema;
46
46
  exports.listRoleSchemaVersions = listRoleSchemaVersions;
47
+ exports.getRoleListSchema = getRoleListSchema;
48
+ exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
47
49
  exports.deleteRole = deleteRole;
48
50
  const roleService = __importStar(require("../services/role"));
49
51
  const facet_sql_1 = require("../services/escalation/facet-sql");
@@ -244,6 +246,7 @@ async function updateRole(input) {
244
246
  description: input.description,
245
247
  form_schema: input.form_schema,
246
248
  metadata_schema: input.metadata_schema,
249
+ list_schema: input.list_schema,
247
250
  properties: input.properties,
248
251
  ops_visible: input.ops_visible,
249
252
  parent_role: input.parent_role,
@@ -320,6 +323,53 @@ async function listRoleSchemaVersions(input) {
320
323
  return { status: 500, error: err.message };
321
324
  }
322
325
  }
326
+ /**
327
+ * Fetch a role's LIST schema (independent version lineage from the form schema).
328
+ * With `version`, returns that immutable snapshot — a missing version is a 404.
329
+ * Without `version`, returns the live (latest) list schema with its version.
330
+ *
331
+ * @returns `{ status: 200, data: RoleListSchemaVersion }` on success
332
+ */
333
+ async function getRoleListSchema(input) {
334
+ try {
335
+ if (!input.role) {
336
+ return { status: 400, error: 'role is required' };
337
+ }
338
+ if (input.version !== undefined && (!Number.isInteger(input.version) || input.version < 1)) {
339
+ return { status: 400, error: 'version must be a positive integer' };
340
+ }
341
+ const schema = await roleService.getRoleListSchema(input.role, input.version);
342
+ if (!schema) {
343
+ return {
344
+ status: 404,
345
+ error: input.version !== undefined
346
+ ? `List schema version ${input.version} not found for role '${input.role}'`
347
+ : `Role '${input.role}' not found`,
348
+ };
349
+ }
350
+ return { status: 200, data: schema };
351
+ }
352
+ catch (err) {
353
+ return { status: 500, error: err.message };
354
+ }
355
+ }
356
+ /**
357
+ * List a role's LIST schema version history, newest first.
358
+ *
359
+ * @returns `{ status: 200, data: { versions: RoleListSchemaVersionSummary[] } }`
360
+ */
361
+ async function listRoleListSchemaVersions(input) {
362
+ try {
363
+ if (!input.role) {
364
+ return { status: 400, error: 'role is required' };
365
+ }
366
+ const versions = await roleService.listRoleListSchemaVersions(input.role);
367
+ return { status: 200, data: { versions } };
368
+ }
369
+ catch (err) {
370
+ return { status: 500, error: err.message };
371
+ }
372
+ }
323
373
  /**
324
374
  * Delete a role from the system. Requires admin privileges.
325
375
  *
@@ -0,0 +1,27 @@
1
+ -- Migration 021: Role escalations LIST schema
2
+ --
3
+ -- list_schema is the list-page analog of form_schema: it richly formats the
4
+ -- escalation LIST page when the list is scoped to exactly one role that owns a
5
+ -- list_schema (opt-in — absent leaves the engineer table unchanged). Unlike
6
+ -- form_schema it is NOT pinned per-escalation; the list always renders the
7
+ -- role's latest.
8
+ --
9
+ -- It versions INDEPENDENTLY of form_schema / metadata_schema: its own snapshot
10
+ -- table (lt_role_list_schemas) and its own counter (current_list_schema_version),
11
+ -- so editing the list view never advances the resolve form's version. The write
12
+ -- rides the same atomic UPDATE_ROLE_METADATA statement (services/role/sql.ts),
13
+ -- which bumps current_list_schema_version and appends a snapshot only when the
14
+ -- provided list_schema actually differs.
15
+
16
+ ALTER TABLE lt_roles
17
+ ADD COLUMN IF NOT EXISTS list_schema JSONB,
18
+ ADD COLUMN IF NOT EXISTS current_list_schema_version INTEGER;
19
+
20
+ CREATE TABLE IF NOT EXISTS lt_role_list_schemas (
21
+ role TEXT NOT NULL REFERENCES lt_roles(role) ON DELETE CASCADE,
22
+ version INTEGER NOT NULL,
23
+ list_schema JSONB,
24
+ change_summary TEXT,
25
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
26
+ PRIMARY KEY (role, version)
27
+ );
@@ -123,6 +123,26 @@ router.get('/:role/schema/versions', async (req, res) => {
123
123
  const result = await api.listRoleSchemaVersions({ role: req.params.role });
124
124
  res.status(result.status).json(result.data ?? { error: result.error });
125
125
  });
126
+ /**
127
+ * GET /api/roles/:role/list-schema
128
+ * Fetch the role's LIST schema (rich list-page formatting). `?version=N` pins a
129
+ * snapshot; omitted, the live (latest) list schema is returned with its version.
130
+ * Versions independently from the resolve form schema.
131
+ */
132
+ router.get('/:role/list-schema', async (req, res) => {
133
+ const versionParam = req.query.version;
134
+ const version = versionParam !== undefined ? Number(versionParam) : undefined;
135
+ const result = await api.getRoleListSchema({ role: req.params.role, version });
136
+ res.status(result.status).json(result.data ?? { error: result.error });
137
+ });
138
+ /**
139
+ * GET /api/roles/:role/list-schema/versions
140
+ * List the role's LIST schema version history (newest first).
141
+ */
142
+ router.get('/:role/list-schema/versions', async (req, res) => {
143
+ const result = await api.listRoleListSchemaVersions({ role: req.params.role });
144
+ res.status(result.status).json(result.data ?? { error: result.error });
145
+ });
126
146
  /**
127
147
  * GET /api/roles/:role/escalation-targets
128
148
  * Get allowed escalation targets for a specific role.
@@ -1,4 +1,4 @@
1
- import type { EscalationChain, RoleDetail, RoleSchemaVersion, RoleSchemaVersionSummary, UpdateRoleInput } from './types';
1
+ import type { EscalationChain, RoleDetail, RoleSchemaVersion, RoleSchemaVersionSummary, RoleListSchemaVersion, RoleListSchemaVersionSummary, UpdateRoleInput } from './types';
2
2
  /**
3
3
  * Get the roles a given source role can escalate to.
4
4
  */
@@ -60,6 +60,18 @@ export declare function listRoleSchemaVersions(role: string): Promise<RoleSchema
60
60
  * Returns null when the role (or the requested version) does not exist.
61
61
  */
62
62
  export declare function getRoleSchema(role: string, version?: number): Promise<RoleSchemaVersion | null>;
63
+ /**
64
+ * List the list-schema version history for a role (newest first). The schema is
65
+ * elided — presence flag only; fetch a full snapshot via getRoleListSchema.
66
+ */
67
+ export declare function listRoleListSchemaVersions(role: string): Promise<RoleListSchemaVersionSummary[]>;
68
+ /**
69
+ * Fetch a role's list schema. With a version, reads the immutable snapshot from
70
+ * lt_role_list_schemas; without one, the live (latest) column — a role that has
71
+ * never versioned its list schema still answers with version null. Returns null
72
+ * when the role (or the requested version) does not exist.
73
+ */
74
+ export declare function getRoleListSchema(role: string, version?: number): Promise<RoleListSchemaVersion | null>;
63
75
  /**
64
76
  * Fetch a role's live form_schema — the escalation form the dashboard renders.
65
77
  */
@@ -13,6 +13,8 @@ exports.updateRoleMetadata = updateRoleMetadata;
13
13
  exports.getRoleUpstreams = getRoleUpstreams;
14
14
  exports.listRoleSchemaVersions = listRoleSchemaVersions;
15
15
  exports.getRoleSchema = getRoleSchema;
16
+ exports.listRoleListSchemaVersions = listRoleListSchemaVersions;
17
+ exports.getRoleListSchema = getRoleListSchema;
16
18
  exports.getRoleFormSchema = getRoleFormSchema;
17
19
  exports.getRoleMetadataSchema = getRoleMetadataSchema;
18
20
  exports.deleteRole = deleteRole;
@@ -143,6 +145,7 @@ async function updateRoleMetadata(role, input) {
143
145
  provided('priority_facet'), input.priority_facet ?? null,
144
146
  input.change_summary ?? null,
145
147
  provided('upstream_roles'), upstreams,
148
+ provided('list_schema'), input.list_schema != null ? JSON.stringify(input.list_schema) : null,
146
149
  ]);
147
150
  if (!rows[0])
148
151
  return null;
@@ -184,6 +187,30 @@ async function getRoleSchema(role, version) {
184
187
  return null;
185
188
  return { ...rows[0], role };
186
189
  }
190
+ /**
191
+ * List the list-schema version history for a role (newest first). The schema is
192
+ * elided — presence flag only; fetch a full snapshot via getRoleListSchema.
193
+ */
194
+ async function listRoleListSchemaVersions(role) {
195
+ const pool = (0, db_1.getPool)();
196
+ const { rows } = await pool.query(sql_1.LIST_ROLE_LIST_SCHEMA_VERSIONS, [role]);
197
+ return rows;
198
+ }
199
+ /**
200
+ * Fetch a role's list schema. With a version, reads the immutable snapshot from
201
+ * lt_role_list_schemas; without one, the live (latest) column — a role that has
202
+ * never versioned its list schema still answers with version null. Returns null
203
+ * when the role (or the requested version) does not exist.
204
+ */
205
+ async function getRoleListSchema(role, version) {
206
+ const pool = (0, db_1.getPool)();
207
+ const { rows } = version != null
208
+ ? await pool.query(sql_1.GET_ROLE_LIST_SCHEMA_VERSION, [role, version])
209
+ : await pool.query(sql_1.GET_ROLE_LIST_SCHEMA_CURRENT, [role]);
210
+ if (!rows[0])
211
+ return null;
212
+ return { ...rows[0], role };
213
+ }
187
214
  /**
188
215
  * Fetch a role's live form_schema — the escalation form the dashboard renders.
189
216
  */
@@ -34,8 +34,13 @@ export declare const DELETE_ROLE = "\n DELETE FROM lt_roles WHERE role = $1";
34
34
  * touching the same row: the DELETE only removes rows leaving the set, and the
35
35
  * INSERT's ON CONFLICT DO NOTHING skips rows that stay (delete+insert of the
36
36
  * SAME key in one statement would silently drop it — CTEs share a snapshot).
37
+ *
38
+ * The list_schema ($29 = provided sentinel, $30 = value) versions INDEPENDENTLY
39
+ * of the form/metadata pair: its own current_list_schema_version and its own
40
+ * snapshot table (lt_role_list_schemas), so a list-view edit never advances the
41
+ * resolve form's version. It shares $26 as the change summary.
37
42
  */
38
- 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 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 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\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 ), 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";
43
+ 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 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 ), 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";
39
44
  export declare const GET_ROLE_FORM_SCHEMA = "\n SELECT form_schema FROM lt_roles WHERE role = $1";
40
45
  export declare const GET_ROLE_METADATA_SCHEMA = "\n SELECT metadata_schema FROM lt_roles WHERE role = $1";
41
46
  export declare const GET_ROLE_UPSTREAMS = "\n SELECT upstream_role FROM lt_role_upstreams WHERE role = $1 ORDER BY upstream_role";
@@ -46,7 +51,14 @@ export declare const GET_ROLE_SCHEMA_VERSION = "\n SELECT s.role, s.version, s.
46
51
  * versioned its schema still answers, with version NULL).
47
52
  */
48
53
  export declare const GET_ROLE_SCHEMA_CURRENT = "\n SELECT r.role, r.current_schema_version AS version, r.form_schema,\n r.metadata_schema, s.change_summary, s.created_at,\n r.current_schema_version AS latest_version\n FROM lt_roles r\n LEFT JOIN lt_role_schemas s\n ON s.role = r.role AND s.version = r.current_schema_version\n WHERE r.role = $1";
49
- 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 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";
54
+ export declare const LIST_ROLE_LIST_SCHEMA_VERSIONS = "\n SELECT\n s.version,\n s.list_schema IS NOT NULL AS has_list_schema,\n s.change_summary,\n s.created_at,\n s.version = r.current_list_schema_version AS is_current\n FROM lt_role_list_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1\n ORDER BY s.version DESC";
55
+ export declare const GET_ROLE_LIST_SCHEMA_VERSION = "\n SELECT s.role, s.version, s.list_schema,\n s.change_summary, s.created_at, r.current_list_schema_version AS latest_version\n FROM lt_role_list_schemas s\n JOIN lt_roles r ON r.role = s.role\n WHERE s.role = $1 AND s.version = $2";
56
+ /**
57
+ * Latest list schema resolves from the live lt_roles column (a role that has
58
+ * never versioned its list schema still answers, with version NULL).
59
+ */
60
+ 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";
61
+ 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 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";
50
62
  export declare const COUNT_USER_ROLE_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_user_roles WHERE role = $1";
51
63
  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";
52
64
  export declare const COUNT_WORKFLOW_REFS = "\n SELECT COUNT(*)::int AS cnt FROM lt_config_roles WHERE role = $1";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  // ─── Escalation chain queries ───────────────────────────────────────────────
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_METADATA_SCHEMA = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
4
+ exports.COUNT_ACTIVE_ESCALATION_REFS = exports.COUNT_WORKFLOW_REFS = exports.COUNT_CHAIN_REFS = exports.COUNT_USER_ROLE_REFS = exports.LIST_ROLES_WITH_DETAILS = exports.GET_ROLE_LIST_SCHEMA_CURRENT = exports.GET_ROLE_LIST_SCHEMA_VERSION = exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = exports.GET_ROLE_SCHEMA_CURRENT = exports.GET_ROLE_SCHEMA_VERSION = exports.LIST_ROLE_SCHEMA_VERSIONS = exports.GET_ROLE_UPSTREAMS = exports.GET_ROLE_METADATA_SCHEMA = exports.GET_ROLE_FORM_SCHEMA = exports.UPDATE_ROLE_METADATA = exports.DELETE_ROLE = exports.LIST_ROLES = exports.ENSURE_ROLE_EXISTS = exports.CHECK_ESCALATION_CHAIN_EXISTS = exports.DELETE_ESCALATION_CHAINS_BY_SOURCE = exports.DELETE_ESCALATION_CHAIN = exports.ADD_ESCALATION_CHAIN = exports.INSERT_ESCALATION_CHAIN = exports.GET_ALL_ESCALATION_CHAINS = exports.GET_ESCALATION_TARGETS = void 0;
5
5
  exports.GET_ESCALATION_TARGETS = `
6
6
  SELECT target_role
7
7
  FROM lt_config_role_escalations
@@ -68,6 +68,11 @@ exports.DELETE_ROLE = `
68
68
  * touching the same row: the DELETE only removes rows leaving the set, and the
69
69
  * INSERT's ON CONFLICT DO NOTHING skips rows that stay (delete+insert of the
70
70
  * SAME key in one statement would silently drop it — CTEs share a snapshot).
71
+ *
72
+ * The list_schema ($29 = provided sentinel, $30 = value) versions INDEPENDENTLY
73
+ * of the form/metadata pair: its own current_list_schema_version and its own
74
+ * snapshot table (lt_role_list_schemas), so a list-view edit never advances the
75
+ * resolve form's version. It shares $26 as the change summary.
71
76
  */
72
77
  exports.UPDATE_ROLE_METADATA = `
73
78
  WITH updated AS (
@@ -85,23 +90,34 @@ exports.UPDATE_ROLE_METADATA = `
85
90
  priority_threshold_minutes
86
91
  = CASE WHEN $22::boolean THEN $23::numeric ELSE priority_threshold_minutes END,
87
92
  priority_facet = CASE WHEN $24::boolean THEN $25 ELSE priority_facet END,
93
+ list_schema = CASE WHEN $29::boolean THEN $30::jsonb ELSE list_schema END,
88
94
  current_schema_version = CASE
89
95
  WHEN ($6::boolean AND $7::jsonb IS DISTINCT FROM form_schema)
90
96
  OR ($8::boolean AND $9::jsonb IS DISTINCT FROM metadata_schema)
91
97
  THEN COALESCE(current_schema_version, 0) + 1
92
- ELSE current_schema_version END
98
+ ELSE current_schema_version END,
99
+ current_list_schema_version = CASE
100
+ WHEN $29::boolean AND $30::jsonb IS DISTINCT FROM list_schema
101
+ THEN COALESCE(current_list_schema_version, 0) + 1
102
+ ELSE current_list_schema_version END
93
103
  WHERE role = $1
94
104
  RETURNING
95
105
  role, title, description, form_schema, metadata_schema, properties,
96
106
  ops_visible, parent_role, sla_minutes, target_per_hour, worker_count,
97
107
  priority_threshold_minutes, priority_facet,
98
- current_schema_version
108
+ current_schema_version, list_schema, current_list_schema_version
99
109
  ), snapshot AS (
100
110
  INSERT INTO lt_role_schemas (role, version, form_schema, metadata_schema, change_summary)
101
111
  SELECT role, current_schema_version, form_schema, metadata_schema, $26
102
112
  FROM updated
103
113
  WHERE ($6::boolean OR $8::boolean) AND current_schema_version IS NOT NULL
104
114
  ON CONFLICT (role, version) DO NOTHING
115
+ ), list_snapshot AS (
116
+ INSERT INTO lt_role_list_schemas (role, version, list_schema, change_summary)
117
+ SELECT role, current_list_schema_version, list_schema, $26
118
+ FROM updated
119
+ WHERE $29::boolean AND current_list_schema_version IS NOT NULL
120
+ ON CONFLICT (role, version) DO NOTHING
105
121
  ), upstream_prune AS (
106
122
  DELETE FROM lt_role_upstreams
107
123
  WHERE $27::boolean AND role = $1 AND upstream_role <> ALL($28::text[])
@@ -149,6 +165,36 @@ exports.GET_ROLE_SCHEMA_CURRENT = `
149
165
  LEFT JOIN lt_role_schemas s
150
166
  ON s.role = r.role AND s.version = r.current_schema_version
151
167
  WHERE r.role = $1`;
168
+ // ─── Versioned role LIST schemas (independent version lineage) ──────────────
169
+ exports.LIST_ROLE_LIST_SCHEMA_VERSIONS = `
170
+ SELECT
171
+ s.version,
172
+ s.list_schema IS NOT NULL AS has_list_schema,
173
+ s.change_summary,
174
+ s.created_at,
175
+ s.version = r.current_list_schema_version AS is_current
176
+ FROM lt_role_list_schemas s
177
+ JOIN lt_roles r ON r.role = s.role
178
+ WHERE s.role = $1
179
+ ORDER BY s.version DESC`;
180
+ exports.GET_ROLE_LIST_SCHEMA_VERSION = `
181
+ SELECT s.role, s.version, s.list_schema,
182
+ s.change_summary, s.created_at, r.current_list_schema_version AS latest_version
183
+ FROM lt_role_list_schemas s
184
+ JOIN lt_roles r ON r.role = s.role
185
+ WHERE s.role = $1 AND s.version = $2`;
186
+ /**
187
+ * Latest list schema resolves from the live lt_roles column (a role that has
188
+ * never versioned its list schema still answers, with version NULL).
189
+ */
190
+ exports.GET_ROLE_LIST_SCHEMA_CURRENT = `
191
+ SELECT r.role, r.current_list_schema_version AS version, r.list_schema,
192
+ s.change_summary, s.created_at,
193
+ r.current_list_schema_version AS latest_version
194
+ FROM lt_roles r
195
+ LEFT JOIN lt_role_list_schemas s
196
+ ON s.role = r.role AND s.version = r.current_list_schema_version
197
+ WHERE r.role = $1`;
152
198
  // ─── Role detail aggregation ────────────────────────────────────────────────
153
199
  exports.LIST_ROLES_WITH_DETAILS = `
154
200
  WITH
@@ -191,6 +237,8 @@ exports.LIST_ROLES_WITH_DETAILS = `
191
237
  r.priority_threshold_minutes,
192
238
  r.priority_facet,
193
239
  r.current_schema_version,
240
+ r.list_schema,
241
+ r.current_list_schema_version,
194
242
  COALESCE(up.ups, '{}') AS upstream_roles,
195
243
  COALESCE(uc.cnt, 0) AS user_count,
196
244
  COALESCE(cc.cnt, 0) AS chain_count,
@@ -46,6 +46,14 @@ export interface RoleDetail {
46
46
  * role first carries a schema.
47
47
  */
48
48
  current_schema_version: number | null;
49
+ /**
50
+ * JSON contract (x-lt-* markup) that richly formats the escalation LIST page
51
+ * when it is scoped to just this role. Opt-in and versioned INDEPENDENTLY of
52
+ * form_schema — a display template, always rendered at its latest version.
53
+ */
54
+ list_schema: Record<string, any> | null;
55
+ /** Version of the live list_schema; null until the role first carries one. */
56
+ current_list_schema_version: number | null;
49
57
  /**
50
58
  * Roles this station draws input from that live in OTHER sequences.
51
59
  * parent_role is the single "prior step" placing the role in one sequence;
@@ -77,11 +85,30 @@ export interface RoleSchemaVersionSummary {
77
85
  created_at: string;
78
86
  is_current: boolean;
79
87
  }
88
+ /** One immutable snapshot of a role's LIST schema (independent version lineage). */
89
+ export interface RoleListSchemaVersion {
90
+ role: string;
91
+ version: number | null;
92
+ list_schema: Record<string, any> | null;
93
+ change_summary: string | null;
94
+ created_at: string | null;
95
+ latest_version: number | null;
96
+ }
97
+ /** Listing row for the list-schema version history (schema elided). */
98
+ export interface RoleListSchemaVersionSummary {
99
+ version: number;
100
+ has_list_schema: boolean;
101
+ change_summary: string | null;
102
+ created_at: string;
103
+ is_current: boolean;
104
+ }
80
105
  export interface UpdateRoleInput {
81
106
  title?: string | null;
82
107
  description?: string | null;
83
108
  form_schema?: Record<string, any> | null;
84
109
  metadata_schema?: Record<string, any> | null;
110
+ /** JSON contract that richly formats this role's escalation list page. */
111
+ list_schema?: Record<string, any> | null;
85
112
  properties?: Record<string, any> | null;
86
113
  ops_visible?: boolean;
87
114
  parent_role?: string | null;
@@ -1,2 +1,2 @@
1
- import{j as o}from"./vendor-query-B2UbickB.js";import{c as n}from"./tasks-GG8c_U9w.js";import{t as m}from"./index-B_aFcGv9.js";import{f as c}from"./useEventHooks-82IiMmOc.js";import{u}from"./mcp-B4F-T-7R.js";import{P as d}from"./PageHeaderWithStats-W3akV6nB.js";import"./vendor-react-CXumBFUA.js";import"./vendor-icons-DOIDKgo6.js";function j(){var a;c();const{data:s}=n({limit:1}),{data:e}=m({status:"pending",limit:1}),{data:t}=u(),r=((a=t==null?void 0:t.servers)==null?void 0:a.filter(i=>i.status==="connected").length)??0,l=t?`${r}/${t.total}`:"—";return o.jsx("div",{children:o.jsx(d,{title:"Admin",stats:[{label:"Tasks",value:(s==null?void 0:s.total)??"—"},{label:"Pending Escalations",value:(e==null?void 0:e.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:l},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]})})}export{j as AdminDashboard};
2
- //# sourceMappingURL=AdminDashboard-RrSvb8d-.js.map
1
+ import{j as o}from"./vendor-query-B2UbickB.js";import{c as n}from"./tasks-BYz490un.js";import{j as m}from"./index-C9moIiIq.js";import{f as c}from"./useEventHooks-ZT6RV2Gj.js";import{u}from"./mcp-CH8Tj9Pw.js";import{P as d}from"./PageHeaderWithStats-87STTAJX.js";import"./vendor-react-CXumBFUA.js";import"./vendor-icons-BXhWQC7l.js";function S(){var a;c();const{data:s}=n({limit:1}),{data:e}=m({status:"pending",limit:1}),{data:t}=u(),r=((a=t==null?void 0:t.servers)==null?void 0:a.filter(i=>i.status==="connected").length)??0,l=t?`${r}/${t.total}`:"—";return o.jsx("div",{children:o.jsx(d,{title:"Admin",stats:[{label:"Tasks",value:(s==null?void 0:s.total)??"—"},{label:"Pending Escalations",value:(e==null?void 0:e.total)??"—",dotClass:"bg-status-pending"},{label:"MCP Servers",value:l},{label:"System",value:"Healthy",dotClass:"bg-status-success"}]})})}export{S as AdminDashboard};
2
+ //# sourceMappingURL=AdminDashboard-5bWcBxyS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminDashboard-RrSvb8d-.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsx","PageHeaderWithStats"],"mappings":"4UAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,aACG,MAAA,CACC,SAAAM,EAAAA,IAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,CAAA,EAEJ,CAEJ"}
1
+ {"version":3,"file":"AdminDashboard-5bWcBxyS.js","sources":["../../src/pages/admin/AdminDashboard.tsx"],"sourcesContent":["import { useTasks } from '../../api/tasks';\nimport { useEscalations } from '../../api/escalations';\nimport { useEscalationListEvents } from '../../hooks/useEventHooks';\nimport { useMcpServers } from '../../api/mcp';\nimport { PageHeaderWithStats } from '../../components/common/layout/PageHeaderWithStats';\n\nexport function AdminDashboard() {\n useEscalationListEvents();\n const { data: taskData } = useTasks({ limit: 1 });\n const { data: pendingEsc } = useEscalations({ status: 'pending', limit: 1 });\n const { data: mcpData } = useMcpServers();\n\n const connectedServers =\n mcpData?.servers?.filter((s) => s.status === 'connected').length ?? 0;\n const mcpLabel = mcpData ? `${connectedServers}/${mcpData.total}` : '—';\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Admin\"\n stats={[\n { label: 'Tasks', value: taskData?.total ?? '—' },\n { label: 'Pending Escalations', value: pendingEsc?.total ?? '—', dotClass: 'bg-status-pending' },\n { label: 'MCP Servers', value: mcpLabel },\n { label: 'System', value: 'Healthy', dotClass: 'bg-status-success' },\n ]}\n />\n </div>\n );\n}\n"],"names":["AdminDashboard","useEscalationListEvents","taskData","useTasks","pendingEsc","useEscalations","mcpData","useMcpServers","connectedServers","_a","s","mcpLabel","jsx","PageHeaderWithStats"],"mappings":"4UAMO,SAASA,GAAiB,OAC/BC,EAAA,EACA,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAS,CAAE,MAAO,EAAG,EAC1C,CAAE,KAAMC,CAAA,EAAeC,EAAe,CAAE,OAAQ,UAAW,MAAO,EAAG,EACrE,CAAE,KAAMC,CAAA,EAAYC,EAAA,EAEpBC,IACJC,EAAAH,GAAA,YAAAA,EAAS,UAAT,YAAAG,EAAkB,OAAQC,GAAMA,EAAE,SAAW,aAAa,SAAU,EAChEC,EAAWL,EAAU,GAAGE,CAAgB,IAAIF,EAAQ,KAAK,GAAK,IAEpE,aACG,MAAA,CACC,SAAAM,EAAAA,IAACC,EAAA,CACC,MAAM,QACN,MAAO,CACL,CAAE,MAAO,QAAS,OAAOX,GAAA,YAAAA,EAAU,QAAS,GAAA,EAC5C,CAAE,MAAO,sBAAuB,OAAOE,GAAA,YAAAA,EAAY,QAAS,IAAK,SAAU,mBAAA,EAC3E,CAAE,MAAO,cAAe,MAAOO,CAAA,EAC/B,CAAE,MAAO,SAAU,MAAO,UAAW,SAAU,mBAAA,CAAoB,CACrE,CAAA,EAEJ,CAEJ"}