@hotmeshio/long-tail 0.8.3 → 0.8.5

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 (217) hide show
  1. package/build/api/escalations/create.js +19 -60
  2. package/build/api/escalations/index.d.ts +1 -1
  3. package/build/api/escalations/index.js +2 -1
  4. package/build/api/escalations/resolve.d.ts +28 -0
  5. package/build/api/escalations/resolve.js +110 -4
  6. package/build/api/escalations/single.js +8 -4
  7. package/build/api/roles.d.ts +1 -0
  8. package/build/lib/db/index.js +12 -1
  9. package/build/lib/db/migrate.js +27 -0
  10. package/build/modules/defaults.d.ts +2 -0
  11. package/build/modules/defaults.js +3 -1
  12. package/build/routes/escalations/resolve.js +18 -0
  13. package/build/scripts/twin-farm.d.ts +12 -13
  14. package/build/scripts/twin-farm.js +61 -75
  15. package/build/sdk/index.d.ts +8 -0
  16. package/build/sdk/index.js +1 -0
  17. package/build/services/escalation/crud.d.ts +36 -0
  18. package/build/services/escalation/crud.js +53 -0
  19. package/build/services/escalation/queries.d.ts +13 -0
  20. package/build/services/escalation/queries.js +27 -0
  21. package/build/services/maintenance/index.js +22 -0
  22. package/build/services/orchestrator/condition.d.ts +18 -12
  23. package/build/services/orchestrator/condition.js +11 -8
  24. package/build/services/role/index.d.ts +1 -2
  25. package/build/services/role/index.js +1 -2
  26. package/build/services/role/schema-validator.d.ts +9 -0
  27. package/build/services/role/schema-validator.js +42 -0
  28. package/build/services/role/sql.d.ts +1 -1
  29. package/build/services/role/sql.js +2 -2
  30. package/build/services/role/types.d.ts +8 -6
  31. package/build/system/mcp-servers/admin/schemas.js +4 -2
  32. package/build/system/mcp-servers/human-queue-schemas.js +6 -2
  33. package/build/system/mcp-servers/human-queue.js +11 -3
  34. package/build/tsconfig.tsbuildinfo +1 -1
  35. package/build/types/config.d.ts +2 -0
  36. package/build/types/maintenance.d.ts +6 -1
  37. package/build/types/startup.d.ts +5 -1
  38. package/dashboard/dist/assets/{AdminDashboard-Dhr7sUq6.js → AdminDashboard-RrSvb8d-.js} +2 -2
  39. package/dashboard/dist/assets/{AdminDashboard-Dhr7sUq6.js.map → AdminDashboard-RrSvb8d-.js.map} +1 -1
  40. package/dashboard/dist/assets/{AgentConfigPage-CUPm8FjH.js → AgentConfigPage-5RMdI0ku.js} +2 -2
  41. package/dashboard/dist/assets/{AgentConfigPage-CUPm8FjH.js.map → AgentConfigPage-5RMdI0ku.js.map} +1 -1
  42. package/dashboard/dist/assets/{AgentDetailPage-C9Tmmhhc.js → AgentDetailPage-C_-sIBcr.js} +2 -2
  43. package/dashboard/dist/assets/{AgentDetailPage-C9Tmmhhc.js.map → AgentDetailPage-C_-sIBcr.js.map} +1 -1
  44. package/dashboard/dist/assets/{AgentsPage-Pj47ZJ2U.js → AgentsPage-CxNNtSsf.js} +2 -2
  45. package/dashboard/dist/assets/{AgentsPage-Pj47ZJ2U.js.map → AgentsPage-CxNNtSsf.js.map} +1 -1
  46. package/dashboard/dist/assets/{AvailableEscalationsPage-BxakNqha.js → AvailableEscalationsPage-BcbhA6NE.js} +2 -2
  47. package/dashboard/dist/assets/{AvailableEscalationsPage-BxakNqha.js.map → AvailableEscalationsPage-BcbhA6NE.js.map} +1 -1
  48. package/dashboard/dist/assets/{BotPicker-CCIo5ic0.js → BotPicker-BQVz6bye.js} +2 -2
  49. package/dashboard/dist/assets/{BotPicker-CCIo5ic0.js.map → BotPicker-BQVz6bye.js.map} +1 -1
  50. package/dashboard/dist/assets/{CapabilitiesPage-XFVq4iPX.js → CapabilitiesPage-DlZ8SgO3.js} +2 -2
  51. package/dashboard/dist/assets/{CapabilitiesPage-XFVq4iPX.js.map → CapabilitiesPage-DlZ8SgO3.js.map} +1 -1
  52. package/dashboard/dist/assets/{CollapsibleSection-CBKICsCu.js → CollapsibleSection-lo8Qx4zb.js} +2 -2
  53. package/dashboard/dist/assets/{CollapsibleSection-CBKICsCu.js.map → CollapsibleSection-lo8Qx4zb.js.map} +1 -1
  54. package/dashboard/dist/assets/{CredentialsPage-BN_d7ybc.js → CredentialsPage-DJ9DyXsO.js} +2 -2
  55. package/dashboard/dist/assets/{CredentialsPage-BN_d7ybc.js.map → CredentialsPage-DJ9DyXsO.js.map} +1 -1
  56. package/dashboard/dist/assets/{CronLabel-4V_EXMUg.js → CronLabel-o0dbisw1.js} +2 -2
  57. package/dashboard/dist/assets/{CronLabel-4V_EXMUg.js.map → CronLabel-o0dbisw1.js.map} +1 -1
  58. package/dashboard/dist/assets/{CustomDurationPicker-BdurQj-B.js → CustomDurationPicker-CGiwKSVJ.js} +2 -2
  59. package/dashboard/dist/assets/{CustomDurationPicker-BdurQj-B.js.map → CustomDurationPicker-CGiwKSVJ.js.map} +1 -1
  60. package/dashboard/dist/assets/{ElapsedCell-CO8XMSJX.js → ElapsedCell-N22STQcg.js} +2 -2
  61. package/dashboard/dist/assets/{ElapsedCell-CO8XMSJX.js.map → ElapsedCell-N22STQcg.js.map} +1 -1
  62. package/dashboard/dist/assets/EscalationSchemaPage-Zsmewko2.js +9 -0
  63. package/dashboard/dist/assets/EscalationSchemaPage-Zsmewko2.js.map +1 -0
  64. package/dashboard/dist/assets/{EscalationsOverview-qlo0mxxa.js → EscalationsOverview-CE2p70Ct.js} +2 -2
  65. package/dashboard/dist/assets/{EscalationsOverview-qlo0mxxa.js.map → EscalationsOverview-CE2p70Ct.js.map} +1 -1
  66. package/dashboard/dist/assets/{EventTable-D9RjAT_a.js → EventTable-B3Gj7Ayg.js} +2 -2
  67. package/dashboard/dist/assets/{EventTable-D9RjAT_a.js.map → EventTable-B3Gj7Ayg.js.map} +1 -1
  68. package/dashboard/dist/assets/{GraphInvokePage-CU3r2tzN.js → GraphInvokePage-DywWVSdj.js} +2 -2
  69. package/dashboard/dist/assets/{GraphInvokePage-CU3r2tzN.js.map → GraphInvokePage-DywWVSdj.js.map} +1 -1
  70. package/dashboard/dist/assets/{HomePage-B7pb4-Gx.js → HomePage-CxtBiULd.js} +2 -2
  71. package/dashboard/dist/assets/{HomePage-B7pb4-Gx.js.map → HomePage-CxtBiULd.js.map} +1 -1
  72. package/dashboard/dist/assets/{ListToolbar-C_64Y22Z.js → ListToolbar-Ok2O0wmC.js} +2 -2
  73. package/dashboard/dist/assets/{ListToolbar-C_64Y22Z.js.map → ListToolbar-Ok2O0wmC.js.map} +1 -1
  74. package/dashboard/dist/assets/{McpOverview-D-4eSOTc.js → McpOverview-CTCYZXIp.js} +2 -2
  75. package/dashboard/dist/assets/{McpOverview-D-4eSOTc.js.map → McpOverview-CTCYZXIp.js.map} +1 -1
  76. package/dashboard/dist/assets/{McpQueryDetailPage-BYwDb8LC.js → McpQueryDetailPage-BOaXf0bZ.js} +2 -2
  77. package/dashboard/dist/assets/{McpQueryDetailPage-BYwDb8LC.js.map → McpQueryDetailPage-BOaXf0bZ.js.map} +1 -1
  78. package/dashboard/dist/assets/{McpQueryPage-CIijB5t2.js → McpQueryPage-BbYojoHu.js} +2 -2
  79. package/dashboard/dist/assets/{McpQueryPage-CIijB5t2.js.map → McpQueryPage-BbYojoHu.js.map} +1 -1
  80. package/dashboard/dist/assets/{McpRunDetailPage-CQmhfgju.js → McpRunDetailPage-CXGCVmPq.js} +2 -2
  81. package/dashboard/dist/assets/{McpRunDetailPage-CQmhfgju.js.map → McpRunDetailPage-CXGCVmPq.js.map} +1 -1
  82. package/dashboard/dist/assets/{McpRunsPage-CdDyeOdi.js → McpRunsPage-Df1GqxUg.js} +2 -2
  83. package/dashboard/dist/assets/{McpRunsPage-CdDyeOdi.js.map → McpRunsPage-Df1GqxUg.js.map} +1 -1
  84. package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js +2 -0
  85. package/dashboard/dist/assets/OperationsPage-DgZYi-BC.js.map +1 -0
  86. package/dashboard/dist/assets/{OperatorDashboard-DFORmS46.js → OperatorDashboard-DIR7XDeD.js} +2 -2
  87. package/dashboard/dist/assets/{OperatorDashboard-DFORmS46.js.map → OperatorDashboard-DIR7XDeD.js.map} +1 -1
  88. package/dashboard/dist/assets/{ProcessDetailPage-DwypVFE2.js → ProcessDetailPage-BuSi654J.js} +2 -2
  89. package/dashboard/dist/assets/{ProcessDetailPage-DwypVFE2.js.map → ProcessDetailPage-BuSi654J.js.map} +1 -1
  90. package/dashboard/dist/assets/{ProcessesListPage-tNLvALwT.js → ProcessesListPage-Dhik7XpW.js} +2 -2
  91. package/dashboard/dist/assets/{ProcessesListPage-tNLvALwT.js.map → ProcessesListPage-Dhik7XpW.js.map} +1 -1
  92. package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js +8 -0
  93. package/dashboard/dist/assets/RoleDetailPage-BfzqQxMU.js.map +1 -0
  94. package/dashboard/dist/assets/{RolesPage-txueySPI.js → RolesPage-BRicD5mx.js} +2 -2
  95. package/dashboard/dist/assets/{RolesPage-txueySPI.js.map → RolesPage-BRicD5mx.js.map} +1 -1
  96. package/dashboard/dist/assets/{RunAsSelector-Bvefon9B.js → RunAsSelector-DipyBf_T.js} +2 -2
  97. package/dashboard/dist/assets/{RunAsSelector-Bvefon9B.js.map → RunAsSelector-DipyBf_T.js.map} +1 -1
  98. package/dashboard/dist/assets/{StickyPagination-CeQCzVIA.js → StickyPagination-CD4W450h.js} +2 -2
  99. package/dashboard/dist/assets/{StickyPagination-CeQCzVIA.js.map → StickyPagination-CD4W450h.js.map} +1 -1
  100. package/dashboard/dist/assets/{StreamMessageDetail-6wEm6o6t.js → StreamMessageDetail-BbDdWDUY.js} +2 -2
  101. package/dashboard/dist/assets/{StreamMessageDetail-6wEm6o6t.js.map → StreamMessageDetail-BbDdWDUY.js.map} +1 -1
  102. package/dashboard/dist/assets/{SwimlaneTimeline-C97Rldf5.js → SwimlaneTimeline-Bktv2vi5.js} +2 -2
  103. package/dashboard/dist/assets/{SwimlaneTimeline-C97Rldf5.js.map → SwimlaneTimeline-Bktv2vi5.js.map} +1 -1
  104. package/dashboard/dist/assets/{TaskDetailPage-B09mLOCE.js → TaskDetailPage-pSU3xuG9.js} +2 -2
  105. package/dashboard/dist/assets/{TaskDetailPage-B09mLOCE.js.map → TaskDetailPage-pSU3xuG9.js.map} +1 -1
  106. package/dashboard/dist/assets/{TasksListPage-CQhiSGkN.js → TasksListPage-M6ok-Nfd.js} +2 -2
  107. package/dashboard/dist/assets/{TasksListPage-CQhiSGkN.js.map → TasksListPage-M6ok-Nfd.js.map} +1 -1
  108. package/dashboard/dist/assets/{TimeAgo-BkyeBcMF.js → TimeAgo-DVWhRNbi.js} +2 -2
  109. package/dashboard/dist/assets/{TimeAgo-BkyeBcMF.js.map → TimeAgo-DVWhRNbi.js.map} +1 -1
  110. package/dashboard/dist/assets/{TimestampCell-DVp_UdEB.js → TimestampCell-rG7pmIkW.js} +2 -2
  111. package/dashboard/dist/assets/{TimestampCell-DVp_UdEB.js.map → TimestampCell-rG7pmIkW.js.map} +1 -1
  112. package/dashboard/dist/assets/{ToolTestPanel-CZOuRP_i.js → ToolTestPanel-CLcMA8OE.js} +2 -2
  113. package/dashboard/dist/assets/{ToolTestPanel-CZOuRP_i.js.map → ToolTestPanel-CLcMA8OE.js.map} +1 -1
  114. package/dashboard/dist/assets/{TopicDetailPage-0mvQde8R.js → TopicDetailPage-C9gvoWYu.js} +2 -2
  115. package/dashboard/dist/assets/{TopicDetailPage-0mvQde8R.js.map → TopicDetailPage-C9gvoWYu.js.map} +1 -1
  116. package/dashboard/dist/assets/{TopicsPage-DkvsHLLe.js → TopicsPage-CIGi3TdT.js} +2 -2
  117. package/dashboard/dist/assets/{TopicsPage-DkvsHLLe.js.map → TopicsPage-CIGi3TdT.js.map} +1 -1
  118. package/dashboard/dist/assets/{UserName-EaD_Tz9y.js → UserName-CifbOahk.js} +2 -2
  119. package/dashboard/dist/assets/{UserName-EaD_Tz9y.js.map → UserName-CifbOahk.js.map} +1 -1
  120. package/dashboard/dist/assets/{WorkflowExecutionPage-CjMSQ9Bb.js → WorkflowExecutionPage-BR0oVx_p.js} +2 -2
  121. package/dashboard/dist/assets/{WorkflowExecutionPage-CjMSQ9Bb.js.map → WorkflowExecutionPage-BR0oVx_p.js.map} +1 -1
  122. package/dashboard/dist/assets/{WorkflowsDashboard-BgUz_jO6.js → WorkflowsDashboard-CSYrYQsO.js} +2 -2
  123. package/dashboard/dist/assets/{WorkflowsDashboard-BgUz_jO6.js.map → WorkflowsDashboard-CSYrYQsO.js.map} +1 -1
  124. package/dashboard/dist/assets/{WorkflowsOverview-BzUjUfAz.js → WorkflowsOverview-CaXWYZuw.js} +2 -2
  125. package/dashboard/dist/assets/{WorkflowsOverview-BzUjUfAz.js.map → WorkflowsOverview-CaXWYZuw.js.map} +1 -1
  126. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C48Ui513.js → YamlWorkflowDetailPage-CRBXahFJ.js} +2 -2
  127. package/dashboard/dist/assets/{YamlWorkflowDetailPage-C48Ui513.js.map → YamlWorkflowDetailPage-CRBXahFJ.js.map} +1 -1
  128. package/dashboard/dist/assets/{YamlWorkflowsPage-CQ-dk84N.js → YamlWorkflowsPage-D5zc8Lta.js} +2 -2
  129. package/dashboard/dist/assets/{YamlWorkflowsPage-CQ-dk84N.js.map → YamlWorkflowsPage-D5zc8Lta.js.map} +1 -1
  130. package/dashboard/dist/assets/{agents-O1GlQE9p.js → agents-D7vYXeLj.js} +2 -2
  131. package/dashboard/dist/assets/{agents-O1GlQE9p.js.map → agents-D7vYXeLj.js.map} +1 -1
  132. package/dashboard/dist/assets/{bots-DB5Z7MEk.js → bots-CKaYN2fL.js} +2 -2
  133. package/dashboard/dist/assets/{bots-DB5Z7MEk.js.map → bots-CKaYN2fL.js.map} +1 -1
  134. package/dashboard/dist/assets/{capabilities-Du9EfNdT.js → capabilities-BknM6oFm.js} +2 -2
  135. package/dashboard/dist/assets/{capabilities-Du9EfNdT.js.map → capabilities-BknM6oFm.js.map} +1 -1
  136. package/dashboard/dist/assets/{controlplane-ku4V2nVk.js → controlplane-BodNGCr-.js} +2 -2
  137. package/dashboard/dist/assets/{controlplane-ku4V2nVk.js.map → controlplane-BodNGCr-.js.map} +1 -1
  138. package/dashboard/dist/assets/{escalation-oVVz7Lw2.js → escalation-CH_XK2XM.js} +2 -2
  139. package/dashboard/dist/assets/{escalation-oVVz7Lw2.js.map → escalation-CH_XK2XM.js.map} +1 -1
  140. package/dashboard/dist/assets/{escalation-columns-C-xaR_Qg.js → escalation-columns-CcbLKRI4.js} +2 -2
  141. package/dashboard/dist/assets/{escalation-columns-C-xaR_Qg.js.map → escalation-columns-CcbLKRI4.js.map} +1 -1
  142. package/dashboard/dist/assets/index--xNp5rx6.css +1 -0
  143. package/dashboard/dist/assets/{index-aHhMmZ0W.js → index-B-LQ8fsJ.js} +2 -2
  144. package/dashboard/dist/assets/{index-aHhMmZ0W.js.map → index-B-LQ8fsJ.js.map} +1 -1
  145. package/dashboard/dist/assets/{index-CyXilW90.js → index-BH67e1Ah.js} +2 -2
  146. package/dashboard/dist/assets/{index-CyXilW90.js.map → index-BH67e1Ah.js.map} +1 -1
  147. package/dashboard/dist/assets/{index-MbEPoyTe.js → index-B_aFcGv9.js} +4 -4
  148. package/dashboard/dist/assets/{index-MbEPoyTe.js.map → index-B_aFcGv9.js.map} +1 -1
  149. package/dashboard/dist/assets/{index-DsKK1fCc.js → index-Bwofyfi8.js} +2 -2
  150. package/dashboard/dist/assets/{index-DsKK1fCc.js.map → index-Bwofyfi8.js.map} +1 -1
  151. package/dashboard/dist/assets/{index-61yKjTkk.js → index-C3QKGY5C.js} +2 -2
  152. package/dashboard/dist/assets/{index-61yKjTkk.js.map → index-C3QKGY5C.js.map} +1 -1
  153. package/dashboard/dist/assets/{index-BwXtXaw8.js → index-CJpywoA8.js} +2 -2
  154. package/dashboard/dist/assets/{index-BwXtXaw8.js.map → index-CJpywoA8.js.map} +1 -1
  155. package/dashboard/dist/assets/index-CV8soXIM.js +5 -0
  156. package/dashboard/dist/assets/index-CV8soXIM.js.map +1 -0
  157. package/dashboard/dist/assets/{index-CxlsLEr1.js → index-CdN-Z8-r.js} +2 -2
  158. package/dashboard/dist/assets/{index-CxlsLEr1.js.map → index-CdN-Z8-r.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-DcZDyLHC.js → index-D7NHjvA4.js} +2 -2
  160. package/dashboard/dist/assets/{index-DcZDyLHC.js.map → index-D7NHjvA4.js.map} +1 -1
  161. package/dashboard/dist/assets/{index-DkZnXWTA.js → index-DHhz71yv.js} +2 -2
  162. package/dashboard/dist/assets/{index-DkZnXWTA.js.map → index-DHhz71yv.js.map} +1 -1
  163. package/dashboard/dist/assets/{index-DgAmkmtv.js → index-Gt2Rebs9.js} +2 -2
  164. package/dashboard/dist/assets/{index-DgAmkmtv.js.map → index-Gt2Rebs9.js.map} +1 -1
  165. package/dashboard/dist/assets/index-IIq5Tkqs.js +6 -0
  166. package/dashboard/dist/assets/index-IIq5Tkqs.js.map +1 -0
  167. package/dashboard/dist/assets/{index-Bcgsf2yD.js → index-_gh2K9DU.js} +2 -2
  168. package/dashboard/dist/assets/{index-Bcgsf2yD.js.map → index-_gh2K9DU.js.map} +1 -1
  169. package/dashboard/dist/assets/{knowledge-CTjJVvIG.js → knowledge-CE6gjN3G.js} +2 -2
  170. package/dashboard/dist/assets/{knowledge-CTjJVvIG.js.map → knowledge-CE6gjN3G.js.map} +1 -1
  171. package/dashboard/dist/assets/{mcp-CsHkygRS.js → mcp-B4F-T-7R.js} +2 -2
  172. package/dashboard/dist/assets/{mcp-CsHkygRS.js.map → mcp-B4F-T-7R.js.map} +1 -1
  173. package/dashboard/dist/assets/{mcp-query-BCt4tpjO.js → mcp-query-CYOarL1K.js} +2 -2
  174. package/dashboard/dist/assets/{mcp-query-BCt4tpjO.js.map → mcp-query-CYOarL1K.js.map} +1 -1
  175. package/dashboard/dist/assets/{pipelines-BpGmuS5V.js → pipelines-B4gB9qMx.js} +2 -2
  176. package/dashboard/dist/assets/{pipelines-BpGmuS5V.js.map → pipelines-B4gB9qMx.js.map} +1 -1
  177. package/dashboard/dist/assets/{roles-lHLgLwOY.js → roles-LZf98ePg.js} +2 -2
  178. package/dashboard/dist/assets/{roles-lHLgLwOY.js.map → roles-LZf98ePg.js.map} +1 -1
  179. package/dashboard/dist/assets/{tasks-BHfimh-E.js → tasks-GG8c_U9w.js} +2 -2
  180. package/dashboard/dist/assets/{tasks-BHfimh-E.js.map → tasks-GG8c_U9w.js.map} +1 -1
  181. package/dashboard/dist/assets/{topics-BW2cS79q.js → topics-C7-6oOgA.js} +2 -2
  182. package/dashboard/dist/assets/{topics-BW2cS79q.js.map → topics-C7-6oOgA.js.map} +1 -1
  183. package/dashboard/dist/assets/{useEventHooks-CeOIM1Ix.js → useEventHooks-82IiMmOc.js} +2 -2
  184. package/dashboard/dist/assets/{useEventHooks-CeOIM1Ix.js.map → useEventHooks-82IiMmOc.js.map} +1 -1
  185. package/dashboard/dist/assets/{useNamespace-CEVLPGGY.js → useNamespace-DQEqD2LA.js} +2 -2
  186. package/dashboard/dist/assets/{useNamespace-CEVLPGGY.js.map → useNamespace-DQEqD2LA.js.map} +1 -1
  187. package/dashboard/dist/assets/{useYamlActivityEvents-DdRNcy7s.js → useYamlActivityEvents-Bm0-ewLx.js} +2 -2
  188. package/dashboard/dist/assets/{useYamlActivityEvents-DdRNcy7s.js.map → useYamlActivityEvents-Bm0-ewLx.js.map} +1 -1
  189. package/dashboard/dist/assets/{users-CAih5Fty.js → users-DHx2ium7.js} +2 -2
  190. package/dashboard/dist/assets/{users-CAih5Fty.js.map → users-DHx2ium7.js.map} +1 -1
  191. package/dashboard/dist/assets/{workflows-C_gCwB9q.js → workflows-qIbkeQ_5.js} +2 -2
  192. package/dashboard/dist/assets/{workflows-C_gCwB9q.js.map → workflows-qIbkeQ_5.js.map} +1 -1
  193. package/dashboard/dist/assets/{yaml-workflows-CPabf8Sf.js → yaml-workflows-FibyeHpo.js} +2 -2
  194. package/dashboard/dist/assets/{yaml-workflows-CPabf8Sf.js.map → yaml-workflows-FibyeHpo.js.map} +1 -1
  195. package/dashboard/dist/index.html +2 -2
  196. package/docs/api/http/escalations.md +28 -4
  197. package/docs/api/http/roles.md +1 -1
  198. package/docs/api/http/workflows.md +1 -1
  199. package/docs/api/sdk/escalations.md +40 -5
  200. package/docs/api/sdk/workflows.md +1 -1
  201. package/docs/dashboard.md +3 -3
  202. package/docs/data.md +2 -2
  203. package/docs/hitl-guide.md +114 -6
  204. package/docs/maintenance.md +6 -3
  205. package/docs/oauth-and-delegation.md +1 -1
  206. package/package.json +2 -2
  207. package/dashboard/dist/assets/EscalationSchemaPage-hzFtuyha.js +0 -9
  208. package/dashboard/dist/assets/EscalationSchemaPage-hzFtuyha.js.map +0 -1
  209. package/dashboard/dist/assets/OperationsPage-Cz_0K8tj.js +0 -2
  210. package/dashboard/dist/assets/OperationsPage-Cz_0K8tj.js.map +0 -1
  211. package/dashboard/dist/assets/RoleDetailPage-BPsrUqIa.js +0 -11
  212. package/dashboard/dist/assets/RoleDetailPage-BPsrUqIa.js.map +0 -1
  213. package/dashboard/dist/assets/index-BdqKh0UK.css +0 -1
  214. package/dashboard/dist/assets/index-CAzFU1rn.js +0 -9
  215. package/dashboard/dist/assets/index-CAzFU1rn.js.map +0 -1
  216. package/dashboard/dist/assets/index-D0bDVU2a.js +0 -6
  217. package/dashboard/dist/assets/index-D0bDVU2a.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationsPage-Cz_0K8tj.js","sources":["../../src/pages/operations/PaceChart.tsx","../../src/pages/operations/priority-link.ts","../../src/pages/operations/StationDetailPanel.tsx","../../src/pages/operations/OperationsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport type { StationMetric } from '../../api/escalations';\n\nexport interface ChartStation {\n role: string;\n title: string | null;\n target_per_hour: number | null;\n parent_role: string | null;\n /** Roles feeding this station from other sequences — drawn as a merge glyph, not a bend in the line. */\n upstream_roles?: string[];\n metric: StationMetric | undefined;\n}\n\ninterface PaceChartProps {\n stations: ChartStation[];\n selectedRole: string | null;\n onSelect: (role: string) => void;\n /** Merge-glyph click — jump to the sequence that feeds this station. */\n onUpstreamSelect?: (upstreamRole: string) => void;\n /** Priority-badge click — open the station's queue oldest-first by its age facet. */\n onPrioritySelect?: (role: string) => void;\n /** Selected window length in hours — target count = target_per_hour × this. */\n periodHours: number;\n}\n\n// ── SVG layout ────────────────────────────────────────────────────────────────\n\nconst W = 800;\nconst H = 270;\nconst ML = 40;\nconst MR = 76;\nconst MT = 24;\nconst MB = 72;\n\nconst chartW = W - ML - MR;\nconst chartH = H - MT - MB;\nconst bottom = MT + chartH;\nconst right = ML + chartW;\n\n// Smooth transition applied when the window changes and values re-scale.\nconst EASE = '0.5s cubic-bezier(0.4, 0, 0.2, 1)';\n\n// ── Path builders ─────────────────────────────────────────────────────────────\n\n// A one-point curve still needs a stroke: a short segment — slightly longer\n// than an em dash — centered through the point. It anchors the dot and its\n// end label in vertical space when a sequence has a single station (or a\n// single station carries a target).\nconst SOLO_HALF = 9;\nfunction soloSegment(p: { x: number; y: number }): string {\n return `M ${(p.x - SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)} L ${(p.x + SOLO_HALF).toFixed(1)} ${p.y.toFixed(1)}`;\n}\n\n/** Catmull-Rom → cubic bezier — smooth curves for the target, actual, and active lines. */\nfunction catmullPath(pts: { x: number; y: number }[]): string {\n if (pts.length === 0) return '';\n if (pts.length === 1) return soloSegment(pts[0]);\n const segs: string[] = [];\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(0, i - 1)];\n const p1 = pts[i];\n const p2 = pts[i + 1];\n const p3 = pts[Math.min(pts.length - 1, i + 2)];\n const cp1x = (p1.x + (p2.x - p0.x) / 6).toFixed(1);\n const cp1y = (p1.y + (p2.y - p0.y) / 6).toFixed(1);\n const cp2x = (p2.x - (p3.x - p1.x) / 6).toFixed(1);\n const cp2y = (p2.y - (p3.y - p1.y) / 6).toFixed(1);\n if (i === 0) segs.push(`M ${p1.x.toFixed(1)} ${p1.y.toFixed(1)}`);\n segs.push(`C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x.toFixed(1)} ${p2.y.toFixed(1)}`);\n }\n return segs.join(' ');\n}\n\n/**\n * Closed region between two curves — upper spline forward, lower spline back.\n * Used for the queue-composition bands: the vertical thickness at any station\n * is the count difference between the two curves.\n */\nfunction bandPath(upper: { x: number; y: number }[], lower: { x: number; y: number }[]): string {\n if (upper.length < 2 || lower.length < 2) return '';\n const forward = catmullPath(upper);\n const rev = [...lower].reverse();\n const back = catmullPath(rev);\n // Drop the back path's leading M — the L below connects the two curves.\n const backSegs = back.slice(back.indexOf('C'));\n return `${forward} L ${rev[0].x.toFixed(1)} ${rev[0].y.toFixed(1)} ${backSegs} Z`;\n}\n\nfunction compact(n: number): string {\n return n >= 10000 ? `${Math.round(n / 1000)}k` : n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);\n}\n\nfunction last<T>(a: T[]): T | undefined {\n return a.length > 0 ? a[a.length - 1] : undefined;\n}\n\n// ── Colors ────────────────────────────────────────────────────────────────────\n\n// Shared queue-state palette — the chart bands and the station table columns\n// use the same hues so the two views read as one.\nexport const ACTIVE_COLOR = '#6366f1'; // claimed, being worked right now — indigo\nexport const QUEUED_COLOR = '#0ea5e9'; // pending and unclaimed, waiting in the queue — sky\nexport const RESOLVED_COLOR = '#1E3A8A'; // done — navy, matches the default theme accent\nexport const TARGET_COLOR = '#059669'; // target pace line — emerald\n\n// Priority — unclaimed items past the role's age threshold, the count the\n// floor pulls to the front of the rack. Powder blue for the badge circle;\n// the count text uses the same hue deepened enough to read at chart sizes.\nexport const PRIORITY_COLOR = '#b0e0e6';\nexport const PRIORITY_TEXT_COLOR = '#5b93ad';\n\n// ── End-label stacking — spread close labels so text doesn't collide ────────────\n\nconst MIN_GAP = 13;\nfunction spreadLabels<T extends { y: number }>(labels: T[], maxY: number): (T & { labelY: number })[] {\n const sorted = [...labels].sort((a, b) => a.y - b.y);\n let prev = -Infinity;\n const placed = sorted.map((l) => {\n const labelY = Math.max(l.y + 3, prev + MIN_GAP);\n prev = labelY;\n return { ...l, labelY };\n });\n // On a quiet window every curve sits at zero and the stack would descend\n // past the floor into the station titles — lift the whole stack back above\n // maxY instead.\n const overflow = placed.length > 0 ? placed[placed.length - 1].labelY - maxY : 0;\n if (overflow > 0) {\n for (const l of placed) l.labelY -= overflow;\n }\n return placed;\n}\n\n// ── Chart ─────────────────────────────────────────────────────────────────────\n\nexport function PaceChart({ stations, selectedRole, onSelect, onUpstreamSelect, onPrioritySelect, periodHours }: PaceChartProps) {\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n\n const n = stations.length;\n if (n === 0) return null;\n\n const xOf = (i: number) => (n === 1 ? ML + chartW / 2 : ML + (i / (n - 1)) * chartW);\n const xMap = new Map(stations.map((s, i) => [s.role, xOf(i)]));\n\n // Per-station counts for the selected window:\n // - target : expected units = target_per_hour × periodHours (e.g. 22/h · 15m ≈ 5).\n // - actual : units resolved in the window (\"the number we see\").\n // - active : units in the queue being worked right now (claimed).\n const rows = stations.map((s, i) => {\n const target = s.target_per_hour ?? null;\n const expected = target != null ? target * periodHours : null;\n return {\n idx: i,\n x: xOf(i),\n expected,\n actual: s.metric?.resolved ?? 0,\n active: s.metric?.claimed ?? 0,\n pending: s.metric?.pending ?? 0,\n priorityCount: s.metric?.priority_count ?? 0,\n };\n });\n\n const hasTargets = rows.some((r) => r.expected != null);\n\n const dataMax = Math.max(\n 1,\n ...rows.map((r) => r.expected ?? 0),\n ...rows.map((r) => r.actual),\n ...rows.map((r) => (r.expected != null ? r.pending : 0)),\n );\n const maxVal = dataMax * 1.15;\n const yScale = (v: number) => MT + chartH * (1 - Math.max(0, Math.min(v, maxVal)) / maxVal);\n\n const withTarget = rows.filter((r) => r.expected != null);\n const targetPts = withTarget.map((r) => ({ ...r, y: yScale(r.expected as number) }));\n const actualPts = withTarget.map((r) => ({ ...r, y: yScale(r.actual) }));\n const activePts = withTarget.map((r) => ({ ...r, y: yScale(r.active) }));\n const pendingPts = withTarget.map((r) => ({ ...r, y: yScale(r.pending) }));\n\n const targetLinePath = catmullPath(targetPts);\n const actualSplinePath = catmullPath(actualPts);\n const activeSplinePath = catmullPath(activePts);\n const pendingSplinePath = catmullPath(pendingPts);\n\n const lastActual = last(actualPts);\n const lastTarget = last(targetPts);\n const lastActive = last(activePts);\n const lastPending = last(pendingPts);\n\n const areaPath =\n actualPts.length >= 2 && lastActual\n ? `${actualSplinePath} L ${lastActual.x.toFixed(1)} ${bottom} L ${actualPts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n\n // Queue composition — pending splits into two stacked bands:\n // floor → active curve = claimed, being worked (indigo)\n // active → pending curve = waiting, unclaimed (sky)\n // When workers claim everything the instant it lands, the sky band collapses\n // to zero and the whole queue reads as indigo.\n const hasQueue = withTarget.some((r) => r.pending > 0 || r.active > 0);\n const workedBandPath =\n hasQueue && activePts.length >= 2 && lastActive\n ? `${activeSplinePath} L ${lastActive.x.toFixed(1)} ${bottom} L ${activePts[0].x.toFixed(1)} ${bottom} Z`\n : '';\n const queuedBandPath = hasQueue ? bandPath(pendingPts, activePts) : '';\n\n // Quiet lines keep their curves (flat at zero) but skip their end labels —\n // a stack of names pointing at nothing is noise.\n const showActiveLabel = withTarget.some((r) => r.active > 0);\n const showQueuedLabel = withTarget.some((r) => r.pending > r.active);\n const endLabels = spreadLabels(\n [\n lastTarget ? { key: 'target', text: 'Target', color: TARGET_COLOR, y: lastTarget.y } : null,\n lastActual ? { key: 'actual', text: 'Resolved', color: RESOLVED_COLOR, y: lastActual.y } : null,\n showActiveLabel && lastActive\n ? { key: 'active', text: 'Claimed', color: ACTIVE_COLOR, y: lastActive.y }\n : null,\n showQueuedLabel && lastPending\n ? { key: 'queued', text: 'Pending', color: QUEUED_COLOR, y: lastPending.y }\n : null,\n ].filter(Boolean) as { key: string; text: string; color: string; y: number }[],\n bottom + 4,\n );\n\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"w-full h-full\" preserveAspectRatio=\"xMidYMid meet\" style={{ display: 'block' }}>\n {/* Dependency connector lines (parent → child), drawn at chart floor */}\n {stations.map((s) => {\n if (!s.parent_role) return null;\n const px = xMap.get(s.parent_role);\n if (px == null) return null;\n const cx = xOf(stations.findIndex((r) => r.role === s.role));\n return <line key={`dep-${s.role}`} x1={px} y1={bottom} x2={cx} y2={bottom} stroke=\"#e2e8f0\" strokeWidth={0.75} />;\n })}\n\n {/* Area under the actual curve */}\n {areaPath && <path d={areaPath} fill={RESOLVED_COLOR} opacity={0.05} style={{ transition: `d ${EASE}` }} />}\n\n {/* Queue composition bands — the band heights split each station's\n pending total into claimed-and-worked (indigo, floor→active) and\n waiting-unclaimed (sky, active→pending). */}\n {workedBandPath && (\n <path d={workedBandPath} fill={ACTIVE_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n {queuedBandPath && (\n <path d={queuedBandPath} fill={QUEUED_COLOR} opacity={0.12} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Target — thin emerald reference curve at the window's expected count */}\n {targetLinePath && (\n <path d={targetLinePath} fill=\"none\" stroke={TARGET_COLOR} strokeWidth={0.5} strokeLinejoin=\"round\" opacity={0.9} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Per-role target for the window (target_per_hour × duration), just above the red line */}\n {targetPts.map((tp) => (\n <text\n key={`tval-${tp.idx}`}\n x={tp.x}\n y={tp.y - 3.5}\n textAnchor=\"middle\"\n fontSize={6.5}\n fill={TARGET_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"500\"\n opacity={0.7}\n style={{ transition: `y ${EASE}` }}\n >\n {Math.round(tp.expected as number)}\n </text>\n ))}\n\n {/* Pending — thin dotted sky edge along the queue total (top of the bands) */}\n {hasQueue && pendingSplinePath && (\n <path d={pendingSplinePath} fill=\"none\" stroke={QUEUED_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.55} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Active — thin dotted indigo, how many are claimed and being worked */}\n {activeSplinePath && (\n <path d={activeSplinePath} fill=\"none\" stroke={ACTIVE_COLOR} strokeWidth={0.75} strokeDasharray=\"2 3\" strokeLinecap=\"round\" opacity={0.5} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Actual — thin solid, primary line */}\n {actualSplinePath && (\n <path d={actualSplinePath} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={0.6} strokeLinejoin=\"round\" strokeLinecap=\"round\" opacity={0.65} style={{ transition: `d ${EASE}` }} />\n )}\n\n {/* Queue markers — a dot on the active line per station.\n Above the dot, at the pending edge: the queue total (sky when part of\n it is still waiting, slate when everything is claimed).\n Below the dot: active (claimed, being worked right now). */}\n {activePts.map((ap, i) => {\n if (ap.pending <= 0 && ap.active <= 0) return null;\n const ar = Math.max(2.5, Math.min(5, 2.5 + ap.active / 10));\n const hasWaiting = ap.pending > ap.active;\n // Anchor the queue-total label to the pending edge so it rides the top\n // of the band; keep it clear of the dot when the two curves touch.\n const pendingLabelY = Math.min(pendingPts[i].y - 4, ap.y - ar - 4);\n return (\n <g key={`active-${ap.idx}`}>\n {ap.pending > 0 && (\n <text\n x={ap.x}\n y={pendingLabelY}\n textAnchor=\"middle\"\n fontSize={7.5}\n fill={hasWaiting ? QUEUED_COLOR : '#64748b'}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"600\"\n style={{ transition: `y ${EASE}` }}\n >\n {ap.pending}\n </text>\n )}\n <g transform={`translate(${ap.x} ${ap.y})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={ar} fill={ACTIVE_COLOR} opacity={0.85} />\n {ap.active > 0 && (\n <text y={ar + 9} textAnchor=\"middle\" fontSize={7.5} fill={ACTIVE_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"600\">\n {ap.active}\n </text>\n )}\n </g>\n </g>\n );\n })}\n\n {/* Station nodes — actual (resolved) as a dot on the actual line, styled like\n the active dot but a bit larger (actual is the most important number).\n The count sits below the dot so it stays legible as numbers grow. */}\n {rows.map((row) => {\n const s = stations[row.idx];\n const x = row.x;\n const cy = row.expected != null ? yScale(row.actual) : bottom;\n // Same small scale as the active dot — a hair larger.\n const r = Math.max(2.25, Math.min(4, 2.25 + row.actual / 160));\n const isSelected = s.role === selectedRole;\n const isHovered = hoveredIdx === row.idx;\n\n const tooltip =\n row.expected == null\n ? 'idle · set a target rate to plot pace'\n : `${row.actual} resolved · target ${Math.round(row.expected)}`\n + (row.pending > row.active ? ` · ${row.pending - row.active} pending` : '')\n + (row.active > 0 ? ` · ${row.active} claimed` : '')\n + (row.priorityCount > 0 ? ` · ${row.priorityCount} priority` : '');\n const tipW = tooltip.length * 5.5 + 20;\n const tipX = Math.max(ML + tipW / 2 + 4, Math.min(right - tipW / 2 - 4, x));\n const tipY = cy - r - 10;\n\n return (\n <g\n key={s.role}\n onClick={() => onSelect(s.role)}\n onMouseEnter={() => setHoveredIdx(row.idx)}\n onMouseLeave={() => setHoveredIdx(null)}\n style={{ cursor: 'pointer' }}\n >\n {/* Animated marker group — slides vertically as the window rescales */}\n <g transform={`translate(${x} ${cy})`} style={{ transition: `transform ${EASE}` }}>\n <circle r={22} fill=\"transparent\" />\n <circle r={r} fill={RESOLVED_COLOR} opacity={0.9} style={{ transition: `r ${EASE}` }} />\n {row.expected != null && (\n <text y={-r - 5} textAnchor=\"middle\" fontSize={9.5} fill={RESOLVED_COLOR} fontFamily=\"ui-monospace, monospace\" fontWeight=\"500\">\n {compact(row.actual)}\n </text>\n )}\n {isHovered && !isSelected && <circle r={r + 3} fill=\"none\" stroke={RESOLVED_COLOR} strokeWidth={1} opacity={0.4} />}\n {isSelected && <circle r={r + 4} fill=\"none\" stroke=\"#6366f1\" strokeWidth={2} />}\n </g>\n\n {/* Priority badge — powder blue circle carrying the count of\n unclaimed items past the role's age threshold. Clicking opens\n the station's queue oldest-first by the priority facet so the\n runner grabs the top few and moves them to the front. */}\n {row.priorityCount > 0 && (\n <g\n transform={`translate(${x + 15} ${Math.max(cy - 15, 12)})`}\n onClick={(e) => {\n e.stopPropagation();\n onPrioritySelect?.(s.role);\n }}\n style={{ cursor: 'pointer', transition: `transform ${EASE}` }}\n >\n <title>{`${row.priorityCount} past the priority threshold — click to pull oldest first`}</title>\n <circle\n r={6.5 + (String(row.priorityCount).length - 1) * 2}\n fill={PRIORITY_COLOR}\n opacity={0.9}\n />\n <text\n y={2.5}\n textAnchor=\"middle\"\n fontSize={7}\n fill={PRIORITY_TEXT_COLOR}\n fontFamily=\"ui-monospace, monospace\"\n fontWeight=\"700\"\n >\n {row.priorityCount}\n </text>\n </g>\n )}\n\n {/* Merge affordance — this station also receives input from another\n sequence. The dashed drop into the floor says \"a side-quest\n lands here\"; clicking it opens that sequence. It is a symbol,\n deliberately not a line — the upstream is NOT a descendant. */}\n {(s.upstream_roles?.length ?? 0) > 0 && (\n <g\n transform={`translate(${x - 20} ${bottom})`}\n onClick={(e) => {\n e.stopPropagation();\n onUpstreamSelect?.(s.upstream_roles![0]);\n }}\n style={{ cursor: 'pointer' }}\n >\n <title>{`Fed by ${s.upstream_roles!.join(', ')} — click to view that sequence`}</title>\n <circle r={9} cy={-6} fill=\"transparent\" />\n <path d=\"M -7 -14 C -3 -14 -1 -9 0 -2\" fill=\"none\" stroke=\"#94a3b8\" strokeWidth={1} strokeDasharray=\"2 2\" strokeLinecap=\"round\" />\n <path d=\"M 0 -2 L 8 -2\" stroke=\"#94a3b8\" strokeWidth={1} strokeLinecap=\"round\" />\n <path d=\"M 8 -2 l -3.5 -2 v 4 z\" fill=\"#94a3b8\" />\n </g>\n )}\n\n {/* Station labels (fixed at the floor) */}\n <text x={x} y={bottom + 14} textAnchor=\"middle\" fontSize={9.5} fill=\"#475569\" fontFamily=\"ui-sans-serif, sans-serif\" fontWeight=\"500\">\n {s.title ?? s.role}\n </text>\n <text x={x} y={bottom + 26} textAnchor=\"middle\" fontSize={8} fill=\"#94a3b8\" fontFamily=\"ui-monospace, monospace\">\n {s.role}\n </text>\n\n {/* Tooltip */}\n {isHovered && (\n <g>\n <rect x={tipX - tipW / 2} y={tipY - 16} width={tipW} height={19} rx={3} fill=\"#0f172a\" opacity={0.88} />\n <text x={tipX} y={tipY - 3} textAnchor=\"middle\" fontSize={8.5} fill=\"white\" fontFamily=\"ui-monospace, monospace\">\n {tooltip}\n </text>\n </g>\n )}\n </g>\n );\n })}\n\n {/* No-target hint */}\n {!hasTargets && (\n <text x={ML + chartW / 2} y={bottom + 48} textAnchor=\"middle\" fontSize={8.5} fill=\"#94a3b8\" fontFamily=\"ui-sans-serif, sans-serif\">\n Set target_per_hour on each role in Admin → Roles to enable the pace chart\n </text>\n )}\n\n {/* End labels — text + count, rendered last so they sit above everything */}\n {endLabels.map((l) => (\n <text\n key={l.key}\n x={right + 6}\n y={l.labelY}\n fontSize={8}\n fill={l.color}\n fontFamily=\"ui-sans-serif, sans-serif\"\n fontWeight={l.key === 'actual' ? 700 : 500}\n opacity={l.key === 'active' ? 0.85 : 1}\n style={{ transition: `y ${EASE}` }}\n >\n {l.text}\n </text>\n ))}\n </svg>\n );\n}\n","import type { RoleDetail } from '../../api/roles';\n\n/**\n * Deep link to the available-escalations queue ordered oldest-first by the\n * role's priority age origin: the metadata facet when configured (faceted\n * orderBy, nulls last), else created_at. Mirrors the priority_count SQL so\n * the counted items sit at the top of the list the runner opens.\n */\nexport function priorityQueueLink(role: Pick<RoleDetail, 'role' | 'priority_facet'>): string {\n const base = `/escalations/available?role=${encodeURIComponent(role.role)}`;\n if (role.priority_facet) {\n const orderBy = JSON.stringify([{ field: `metadata.${role.priority_facet}`, direction: 'asc' }]);\n return `${base}&orderBy=${encodeURIComponent(orderBy)}`;\n }\n return `${base}&sort_by=created_at&order=asc`;\n}\n","import { useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport { X, ExternalLink } from 'lucide-react';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport type { RoleDetail } from '../../api/roles';\nimport { PRIORITY_TEXT_COLOR } from './PaceChart';\nimport { priorityQueueLink } from './priority-link';\n\ninterface StationDetailPanelProps {\n role: RoleDetail | null;\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n globalPeriod: string;\n onClose: () => void;\n}\n\n// Mirrors OperationsPage's selector — the panel reports the same windows the\n// chart can show, and opens on whichever one the chart has selected.\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\nconst isPeriod = (p: string): p is Period => (PERIODS as readonly string[]).includes(p);\n\nfunction fmt(min: number | null): string {\n if (min == null) return '—';\n if (min < 1) {\n const s = Math.round(min * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (min < 60) return `${min.toFixed(0)}m`;\n return `${(min / 60).toFixed(1)}h`;\n}\n\nfunction MetricRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between py-1\">\n <span className=\"text-[10px] text-text-tertiary uppercase tracking-wider\">{label}</span>\n <span className=\"text-xs font-mono font-medium text-text-primary tabular-nums\">{value}</span>\n </div>\n );\n}\n\nfunction PeriodSelector({ period, onChange }: { period: Period; onChange: (p: Period) => void }) {\n return (\n <div className=\"flex items-center gap-1 mb-4\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => onChange(p)}\n className={`px-2 py-0.5 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n}\n\nfunction RoleView({ role, globalPeriod, onClose }: { role: RoleDetail; globalPeriod: string; onClose: () => void }) {\n // Open on the chart's selected window so the panel's numbers agree with the\n // chart beside it; the local selector still lets the viewer drill around.\n const [period, setPeriod] = useState<Period>(isPeriod(globalPeriod) ? globalPeriod : '24h');\n const { data } = useStationMetrics(period);\n const metric = data?.stations.find((s) => s.role === role.role);\n const slaMinutes = role.sla_minutes ?? undefined;\n const targetPerHour = role.target_per_hour ?? undefined;\n const workerCount = role.worker_count ?? undefined;\n\n return (\n <>\n {/* Header */}\n <div className=\"flex items-start justify-between mb-1\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-baseline gap-1.5 flex-wrap\">\n <span className=\"text-sm font-mono font-bold text-text-primary\">{role.role}</span>\n {role.title && (\n <span className=\"text-[10px] text-text-secondary\">{role.title}</span>\n )}\n </div>\n {role.description && (\n <p className=\"text-[10px] text-text-tertiary mt-0.5 line-clamp-2 leading-relaxed\">\n {role.description}\n </p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors mt-0.5 shrink-0 ml-2\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1 text-[10px] text-accent hover:underline mb-4\"\n >\n <ExternalLink className=\"w-2.5 h-2.5\" />\n Edit in Roles\n </Link>\n\n <PeriodSelector period={period} onChange={setPeriod} />\n\n {/* Capacity settings */}\n {(targetPerHour || slaMinutes || workerCount) && (\n <div className=\"flex items-center gap-4 mb-4 text-[10px]\">\n {targetPerHour && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{targetPerHour}/h</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">target</div>\n </div>\n )}\n {slaMinutes && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{slaMinutes}m</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">SLA</div>\n </div>\n )}\n {workerCount && (\n <div>\n <div className=\"font-mono font-semibold text-text-primary\">{workerCount}</div>\n <div className=\"text-text-quaternary uppercase tracking-wider text-[8.5px]\">workers</div>\n </div>\n )}\n </div>\n )}\n\n {/* Two-column wait / work grid */}\n <div className=\"grid grid-cols-2 gap-x-3\">\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Wait (queue)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.wait.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.wait.avg ?? null)} />\n </div>\n <div>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-1.5\">Work (proc.)</p>\n <MetricRow label=\"P99\" value={fmt(metric?.work.p99 ?? null)} />\n <MetricRow label=\"avg\" value={fmt(metric?.work.avg ?? null)} />\n </div>\n </div>\n\n {/* SLA + priority */}\n <div className=\"border-t border-surface-border/40 pt-2 mt-3 space-y-1.5\">\n {slaMinutes && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[10px] text-text-tertiary\">SLA target</span>\n <span className=\"text-xs font-mono text-text-secondary\">{slaMinutes}m</span>\n </div>\n )}\n {metric && metric.priority_count > 0 && (\n <Link\n to={priorityQueueLink(role)}\n className=\"flex items-center justify-between group\"\n >\n <span className=\"text-[10px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {metric.priority_count} priority — pull oldest first\n </span>\n <ExternalLink className=\"w-3 h-3 transition-colors\" style={{ color: PRIORITY_TEXT_COLOR }} />\n </Link>\n )}\n </div>\n\n {/* View queue — `role=` drives the visible filter bar on the escalations\n page (the JSON `roles=` facet param filters silently and leaves the\n bar reading \"all roles\"). */}\n <div className=\"mt-4 border-t border-surface-border/40 pt-3\">\n <Link\n to={`/escalations/available?role=${encodeURIComponent(role.role)}`}\n className=\"flex items-center gap-1.5 text-[10px] text-accent hover:underline\"\n >\n View full queue\n <ExternalLink className=\"w-2.5 h-2.5\" />\n </Link>\n </div>\n </>\n );\n}\n\nfunction OverviewPanel({\n allMetrics,\n orderedRoles,\n period,\n}: {\n allMetrics: StationMetric[];\n orderedRoles: RoleDetail[];\n period: string;\n}) {\n const totalPending = allMetrics.reduce((s, m) => s + m.pending, 0);\n const totalResolved = allMetrics.reduce((s, m) => s + m.resolved, 0);\n const totalPriority = allMetrics.reduce((s, m) => s + m.priority_count, 0);\n\n const metricByRole = new Map(allMetrics.map((m) => [m.role, m]));\n const stationsAtRisk = allMetrics.filter((m) => m.priority_count > 0).length;\n const stationsWithLoad = allMetrics.filter((m) => m.pending > 0).length;\n\n return (\n <>\n <p className=\"text-[9px] text-text-quaternary uppercase tracking-wider mb-3\">\n Pipeline · {period}\n </p>\n\n {/* Health headline */}\n <div className=\"mb-4\">\n {stationsAtRisk > 0 ? (\n <p className=\"text-[11px]\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {stationsAtRisk} station{stationsAtRisk > 1 ? 's' : ''} with priority items\n </p>\n ) : stationsWithLoad > 0 ? (\n <p className=\"text-[11px] text-status-warning\">\n {stationsWithLoad} station{stationsWithLoad > 1 ? 's' : ''} with backlog\n </p>\n ) : totalResolved > 0 ? (\n <p className=\"text-[11px] text-status-success\">Flowing — queue clear</p>\n ) : (\n <p className=\"text-[11px] text-text-quaternary\">Quiet — awaiting work</p>\n )}\n </div>\n\n {/* Key counters */}\n <div className=\"space-y-1.5 mb-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Pending</span>\n <span className={`text-xs font-mono tabular-nums ${totalPending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'}`}>\n {totalPending}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Resolved · {period}</span>\n <span className=\"text-xs font-mono tabular-nums text-text-secondary\">{totalResolved}</span>\n </div>\n {totalPriority > 0 && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[9px] text-text-quaternary uppercase tracking-wider\">Priority</span>\n <span className=\"text-xs font-mono tabular-nums font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {totalPriority}\n </span>\n </div>\n )}\n </div>\n\n {/* Divider + column headers */}\n <div className=\"border-t border-surface-border/40 pt-2 mb-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider flex-1\">Station</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">pend</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">clmd</span>\n <span className=\"text-[8px] text-text-quaternary uppercase tracking-wider w-8 text-right shrink-0\">res</span>\n </div>\n </div>\n\n {/* Station list in pipeline order */}\n <div className=\"space-y-0.5\">\n {orderedRoles.map((r) => {\n const m = metricByRole.get(r.role);\n const pending = m?.pending ?? 0;\n const claimed = m?.claimed ?? 0;\n const resolved = m?.resolved ?? 0;\n const priorityCount = m?.priority_count ?? 0;\n const label = r.title || r.role;\n const hasAlert = priorityCount > 0;\n const hasLoad = pending > 0;\n\n return (\n <div key={r.role} className=\"flex items-center gap-2 py-0.5\">\n <span\n className={`text-[10px] font-mono flex-1 truncate ${\n hasLoad ? 'text-text-primary' : 'text-text-quaternary'\n }`}\n >\n {label}\n {hasAlert && (\n <span className=\"ml-1 text-[8px] font-semibold\" style={{ color: PRIORITY_TEXT_COLOR }}>\n {priorityCount} PRIORITY\n </span>\n )}\n </span>\n <span\n className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${\n hasLoad ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending > 0 ? pending : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${claimed > 0 ? 'text-accent' : 'text-text-quaternary'}`}>\n {claimed > 0 ? claimed : '—'}\n </span>\n <span className={`text-[10px] font-mono tabular-nums w-8 text-right shrink-0 ${resolved > 0 ? 'text-text-secondary' : 'text-text-quaternary'}`}>\n {resolved > 0 ? resolved : '—'}\n </span>\n </div>\n );\n })}\n </div>\n\n <p className=\"text-[9px] text-text-quaternary mt-5\">\n Select a station for queue detail.\n </p>\n </>\n );\n}\n\nexport function StationDetailPanel({\n role,\n allMetrics,\n orderedRoles,\n globalPeriod,\n onClose,\n}: StationDetailPanelProps) {\n return (\n <div className=\"w-[280px] shrink-0 px-6 py-8 flex flex-col overflow-y-auto min-h-0\">\n {role ? (\n <RoleView role={role} globalPeriod={globalPeriod} onClose={onClose} />\n ) : (\n <OverviewPanel allMetrics={allMetrics} orderedRoles={orderedRoles} period={globalPeriod} />\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Link, useNavigate, useSearchParams } from 'react-router-dom';\nimport { GitMerge, RefreshCw } from 'lucide-react';\nimport { useRoleDetails, type RoleDetail } from '../../api/roles';\nimport { useStationMetrics } from '../../api/escalations';\nimport type { StationMetric } from '../../api/escalations';\nimport { useStationMetricsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport {\n PaceChart,\n ACTIVE_COLOR,\n QUEUED_COLOR,\n RESOLVED_COLOR,\n TARGET_COLOR,\n PRIORITY_COLOR,\n PRIORITY_TEXT_COLOR,\n type ChartStation,\n} from './PaceChart';\nimport { StationDetailPanel } from './StationDetailPanel';\nimport { priorityQueueLink } from './priority-link';\n\n// Column band tints — the same hues as the chart's queue-composition bands\n// (~8% alpha), so PENDING/ACTIVE/RESOLVED in the table visually continue the\n// sky/indigo/sage story told above.\nconst TARGET_BAND = `${TARGET_COLOR}14`;\nconst PENDING_BAND = `${QUEUED_COLOR}14`;\nconst ACTIVE_BAND = `${ACTIVE_COLOR}14`;\nconst RESOLVED_BAND = `${RESOLVED_COLOR}14`;\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nconst PERIODS = ['15m', '1h', '24h', '7d', '30d'] as const;\ntype Period = (typeof PERIODS)[number];\n\n// Window length in hours — used to express the target as a count for the\n// selected window (target_per_hour × hours), e.g. 22/h over 15m ≈ 5 expected.\nconst PERIOD_HOURS: Record<Period, number> = {\n '15m': 0.25,\n '1h': 1,\n '24h': 24,\n '7d': 168,\n '30d': 720,\n};\n\ninterface OrderedStation {\n role: RoleDetail;\n depth: number;\n}\n\n/**\n * One sequence of stations, named by its origin role. Execution is a graph;\n * each fragment is the human-readable line the user composed via parent_role.\n * Cross-fragment edges live in upstream_roles and render as a merge affordance\n * on the chart, never as a bend in the line.\n */\ninterface SequenceFragment {\n origin: RoleDetail;\n stations: OrderedStation[];\n}\n\n// ── Fragment builder — BFS per parent_role root, tracking actual depth ────────\n\nexport function buildFragments(roles: RoleDetail[]): SequenceFragment[] {\n const opsRoles = roles.filter((r) => r.ops_visible);\n const roleMap = new Map(opsRoles.map((r) => [r.role, r]));\n const visited = new Set<string>();\n\n // Roots: no parent, or parent not in ops set — each roots its own fragment.\n const roots = opsRoles.filter((r) => !r.parent_role || !roleMap.has(r.parent_role));\n\n const fragments: SequenceFragment[] = roots.map((root) => {\n const stations: OrderedStation[] = [];\n const queue: OrderedStation[] = [{ role: root, depth: 0 }];\n while (queue.length > 0) {\n const item = queue.shift()!;\n if (visited.has(item.role.role)) continue;\n visited.add(item.role.role);\n stations.push(item);\n opsRoles\n .filter((c) => c.parent_role === item.role.role && !visited.has(c.role))\n .forEach((c) => queue.push({ role: c, depth: item.depth + 1 }));\n }\n return { origin: root, stations };\n });\n\n // Unreachable (cycles / dangling) — each stands alone rather than vanishing.\n opsRoles\n .filter((r) => !visited.has(r.role))\n .forEach((r) => fragments.push({ origin: r, stations: [{ role: r, depth: 0 }] }));\n\n // Longest line first — the primary sequence leads; side-quests follow.\n return fragments.sort(\n (a, b) => b.stations.length - a.stations.length || a.origin.role.localeCompare(b.origin.role),\n );\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction fmtMin(v: number | null): string {\n if (v == null) return '—';\n if (v < 1) {\n const s = Math.round(v * 60);\n return s <= 0 ? '< 1s' : `${s}s`;\n }\n if (v < 60) return `${v.toFixed(0)}m`;\n return `${(v / 60).toFixed(1)}h`;\n}\n\nfunction loadBar(pending: number, target: number | null) {\n // No target, or nothing pending — there is no live load to trend. Show the\n // empty state rather than inventing a rate from historical throughput.\n if (!target || pending === 0) return { pct: null, color: 'bg-surface-border' };\n\n const ratio = pending / target;\n const pct = Math.round(ratio * 100);\n // Amber: backlog. Orange: some work but well under pace. Green: healthy.\n const color = ratio > 1.0 ? 'bg-status-warning' : ratio < 0.2 ? 'bg-status-draft' : 'bg-status-success';\n return { pct, color };\n}\n\n// ── Station table row ─────────────────────────────────────────────────────────\n\nfunction StationRow({\n role,\n metric,\n selected,\n onClick,\n}: {\n role: RoleDetail;\n metric: StationMetric | undefined;\n selected: boolean;\n onClick: () => void;\n}) {\n const pending = metric?.pending ?? 0;\n const claimed = metric?.claimed ?? 0;\n const resolved = metric?.resolved ?? 0;\n const priorityCount = metric?.priority_count ?? 0;\n const target = role.target_per_hour ?? null;\n const { pct, color } = loadBar(pending, target);\n const barWidth = pct != null ? Math.min(100, pct) : 0;\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => { if (e.key === 'Enter') onClick(); }}\n className={`grid items-center gap-4 pr-3 cursor-pointer transition-colors ${\n selected ? 'border-l-2 !border-l-accent pl-2.5' : 'pl-3'\n }`}\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {/* Role name */}\n <div className=\"flex items-center gap-1.5 min-w-0 py-1.5\">\n <span\n className=\"font-mono font-bold text-text-primary truncate text-[11px]\"\n >\n {role.role}\n </span>\n {role.title && (\n <span className=\"text-[10px] text-text-tertiary truncate\">{role.title}</span>\n )}\n {(role.upstream_roles?.length ?? 0) > 0 && (\n <span title={`Fed by ${role.upstream_roles.join(', ')}`} className=\"shrink-0 leading-none\">\n <GitMerge className=\"w-3 h-3 text-text-quaternary\" />\n </span>\n )}\n </div>\n\n {/* Target / hour — emerald band, same hue as the chart's target line */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: TARGET_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n target != null ? 'text-text-secondary' : 'text-text-quaternary'\n }`}\n >\n {target != null ? target : '—'}\n </span>\n </div>\n\n {/* Pending — sky band, same hue as the chart's waiting band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: PENDING_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n pending > 0 ? 'text-text-primary font-semibold' : 'text-text-quaternary'\n }`}\n >\n {pending}\n </span>\n </div>\n\n {/* Active — indigo band, same hue as the chart's worked band */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: ACTIVE_BAND }}\n >\n <span\n className={`text-xs font-mono tabular-nums ${\n claimed > 0 ? 'text-accent font-semibold' : 'text-text-quaternary'\n }`}\n >\n {claimed}\n </span>\n </div>\n\n {/* Resolved — sage band, same hue as the chart's actual curve */}\n <div\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: RESOLVED_BAND }}\n >\n <span className=\"text-xs font-mono tabular-nums text-text-quaternary\">\n {resolved}\n </span>\n </div>\n\n {/* P99 wait */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.wait.p99 ?? null)}\n </span>\n\n {/* P99 work */}\n <span className=\"text-xs font-mono tabular-nums text-right py-1.5 text-text-secondary\">\n {fmtMin(metric?.work.p99 ?? null)}\n </span>\n\n {/* Load mini-bar */}\n <div className=\"flex items-center gap-2 py-1.5\">\n <div className=\"w-12 h-1.5 bg-surface-sunken rounded-full overflow-hidden shrink-0\">\n <div className={`h-full rounded-full ${color}`} style={{ width: `${barWidth}%` }} />\n </div>\n <span\n className={`text-[10px] font-mono tabular-nums ${\n pct != null && pct > 100\n ? 'text-status-warning font-semibold'\n : 'text-text-quaternary'\n }`}\n >\n {pct != null ? `${pct}%` : '—'}\n </span>\n </div>\n </div>\n\n {/* Priority sub-row — unclaimed items past the role's age threshold */}\n {priorityCount > 0 && (\n <div className=\"flex items-center gap-1.5 pb-2 pl-3.5\">\n <span\n className=\"w-2.5 h-2.5 rounded-full dot-ring shrink-0\"\n style={{ backgroundColor: PRIORITY_COLOR }}\n />\n <Link\n to={priorityQueueLink(role)}\n className=\"text-[10px] hover:underline\"\n style={{ color: PRIORITY_TEXT_COLOR }}\n onClick={(e) => e.stopPropagation()}\n >\n {priorityCount} priority — pull oldest first →\n </Link>\n </div>\n )}\n </>\n );\n}\n\n// ── Table header ──────────────────────────────────────────────────────────────\n\nfunction TableHead() {\n // Queue-state columns carry the chart's band hue into the table.\n const cols: { label: string; band?: string; hue?: string }[] = [\n { label: 'ROLE' },\n { label: 'TARGET/H', band: TARGET_BAND, hue: TARGET_COLOR },\n { label: 'PENDING', band: PENDING_BAND, hue: QUEUED_COLOR },\n { label: 'CLAIMED', band: ACTIVE_BAND, hue: ACTIVE_COLOR },\n { label: 'RESOLVED', band: RESOLVED_BAND, hue: RESOLVED_COLOR },\n { label: 'P99 WAIT' },\n { label: 'P99 WORK' },\n { label: 'TREND' },\n ];\n return (\n <div\n className=\"grid items-center gap-4 px-3 border-b border-surface-border mb-0.5\"\n style={{ gridTemplateColumns: '1fr 64px 56px 56px 60px 72px 72px 104px' }}\n >\n {cols.map((col, i) =>\n col.band ? (\n <div\n key={col.label}\n className=\"self-stretch flex items-center justify-end px-1.5\"\n style={{ backgroundColor: col.band }}\n >\n <span\n className=\"text-[9px] font-semibold uppercase tracking-wider\"\n style={{ color: col.hue }}\n >\n {col.label}\n </span>\n </div>\n ) : (\n <span\n key={col.label}\n className={`text-[9px] font-semibold uppercase tracking-wider text-text-quaternary py-1.5 ${\n i > 0 && i < 7 ? 'text-right' : ''\n }`}\n >\n {col.label}\n </span>\n ),\n )}\n </div>\n );\n}\n\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function OperationsPage() {\n // 1h default: long enough to show a whole simulation shift's shape,\n // short enough that stale history doesn't drown the current run.\n const [period, setPeriod] = useState<Period>('1h');\n const [selectedRole, setSelectedRole] = useState<string | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n // Push-driven refresh: every escalation event invalidates ['stationMetrics']\n // through the central event system (debounced, transport-agnostic). The\n // header's refresh button covers user-initiated reloads.\n useStationMetricsEvents();\n\n const { data: roleData, isLoading: rolesLoading, refetch: refetchRoles } = useRoleDetails();\n const {\n data: metricsData,\n isLoading: metricsLoading,\n refetch: refetchMetrics,\n } = useStationMetrics(period);\n\n const roles = roleData?.roles ?? [];\n const metrics = metricsData?.stations ?? [];\n\n // Sequence fragments, one per parent_role root. The active one is\n // DEEP-LINKED (?fragment=<origin role>) and each switch is a history entry,\n // so a shared link opens the same sequence and back/forward walks them.\n const fragments = useMemo((): SequenceFragment[] => buildFragments(roles), [roles]);\n const [searchParams, setSearchParams] = useSearchParams();\n const fragmentParam = searchParams.get('fragment');\n const activeFragment =\n fragments.find((f) => f.origin.role === fragmentParam) ?? fragments[0] ?? null;\n const selectFragment = useCallback(\n (origin: string) => {\n setSelectedRole(null);\n setSearchParams((prev) => {\n const p = new URLSearchParams(prev);\n p.set('fragment', origin);\n return p;\n });\n },\n [setSearchParams],\n );\n\n const ordered = activeFragment?.stations ?? [];\n const fragmentRoleSet = useMemo(\n () => new Set(ordered.map(({ role }) => role.role)),\n [ordered],\n );\n const fragmentMetrics = useMemo(\n () => metrics.filter((m) => fragmentRoleSet.has(m.role)),\n [metrics, fragmentRoleSet],\n );\n\n const chartStations = useMemo(\n (): ChartStation[] =>\n ordered.map(({ role: r }) => ({\n role: r.role,\n title: r.title,\n parent_role: r.parent_role,\n target_per_hour: r.target_per_hour ?? null,\n upstream_roles: r.upstream_roles ?? [],\n metric: metrics.find((m) => m.role === r.role),\n })),\n [ordered, metrics],\n );\n\n // Jump to the sequence that feeds this station — the merge glyph's click.\n const handleUpstreamSelect = useCallback(\n (upstreamRole: string) => {\n const target = fragments.find((f) =>\n f.stations.some(({ role }) => role.role === upstreamRole),\n );\n if (target) selectFragment(target.origin.role);\n },\n [fragments, selectFragment],\n );\n\n // Priority-badge click — open the station's queue oldest-first by its facet.\n const navigate = useNavigate();\n const handlePrioritySelect = useCallback(\n (roleName: string) => {\n const detail = roles.find((r) => r.role === roleName);\n if (detail) navigate(priorityQueueLink(detail));\n },\n [roles, navigate],\n );\n\n const selectedRoleDetail =\n ordered.find(({ role }) => role.role === selectedRole)?.role ?? null;\n\n const isLoading = rolesLoading || metricsLoading;\n\n const handleRefresh = async () => {\n setRefreshing(true);\n await Promise.all([refetchRoles(), refetchMetrics()]);\n setRefreshing(false);\n };\n\n const handleSelect = (role: string) =>\n setSelectedRole((prev) => (prev === role ? null : role));\n\n const periodSelector = (\n <div className=\"flex items-center gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n onClick={() => setPeriod(p)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n period === p\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {p}\n </button>\n ))}\n </div>\n );\n\n return (\n <div className=\"flex flex-col flex-1 min-h-0\">\n <PageHeader\n title=\"Pace Board\"\n docsHash=\"#docs:dashboard.md:pace-board\"\n center={periodSelector}\n actions={\n <button\n onClick={handleRefresh}\n disabled={refreshing}\n className=\"text-text-quaternary hover:text-text-secondary transition-colors disabled:opacity-40\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n }\n />\n\n {isLoading ? (\n <div className=\"animate-pulse space-y-6 mt-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded w-full\" />\n <div className=\"space-y-3\">\n {[1, 2, 3].map((i) => (\n <div key={i} className=\"h-8 bg-surface-sunken rounded w-full\" />\n ))}\n </div>\n </div>\n ) : fragments.length === 0 ? (\n <div className=\"mt-8\">\n <p className=\"text-sm text-text-secondary mb-2\">Stations appear here once roles are marked visible in Operations.</p>\n <p className=\"text-xs text-text-tertiary\">\n Go to{' '}\n <Link to=\"/admin/roles\" className=\"text-accent hover:underline\">\n Roles\n </Link>{' '}\n and enable <strong>Visible in Operations</strong> on roles that represent pipeline\n stations.\n </p>\n </div>\n ) : (\n /* Console layout: fixed header (above) → flexible middle → fixed table (30vh) */\n <div className=\"flex flex-col flex-1 min-h-0\">\n\n {/* Sequence picker — one tab per fragment, named by its origin role.\n Only rendered when there is more than one story to tell. */}\n {fragments.length > 1 && (\n <div className=\"flex items-center gap-0.5 px-4 pt-2\">\n {fragments.map((f) => {\n const isActive = f.origin.role === activeFragment?.origin.role;\n return (\n <button\n key={f.origin.role}\n onClick={() => selectFragment(f.origin.role)}\n className={`px-2.5 py-1 text-[10px] font-mono rounded transition-colors ${\n isActive\n ? 'bg-accent/10 text-accent font-semibold'\n : 'text-text-quaternary hover:text-text-secondary'\n }`}\n >\n {f.origin.title ?? f.origin.role}\n <span className={`ml-1.5 tabular-nums ${isActive ? 'text-accent/60' : 'text-text-quaternary/60'}`}>\n {f.stations.length}\n </span>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Middle row: flexible height — SVG fills left, sidebar fixed-width right */}\n <div className=\"flex-1 min-h-0 flex items-stretch overflow-hidden\">\n {/* SVG chart — scales to fill available space */}\n <div className=\"flex-1 min-w-0 min-h-0 flex flex-col justify-center overflow-hidden p-4\">\n <PaceChart\n stations={chartStations}\n selectedRole={selectedRole}\n onSelect={handleSelect}\n onUpstreamSelect={handleUpstreamSelect}\n onPrioritySelect={handlePrioritySelect}\n periodHours={PERIOD_HOURS[period]}\n />\n </div>\n {/* Vertical divider */}\n <div className=\"w-px bg-surface-border shrink-0 self-stretch\" />\n {/* Right sidebar — fixed width, scrolls its own content */}\n <StationDetailPanel\n role={selectedRoleDetail}\n allMetrics={fragmentMetrics}\n orderedRoles={ordered.map((o) => o.role)}\n globalPeriod={period}\n onClose={() => setSelectedRole(null)}\n />\n </div>\n\n {/* Bottom row: sized to its rows up to 45vh — header sticky, rows scroll */}\n <div className=\"max-h-[45vh] flex-none flex flex-col border-t border-surface-border overflow-hidden\">\n <TableHead />\n <div className=\"flex-1 min-h-0 overflow-y-auto divide-y divide-surface-border/30\">\n {ordered.map(({ role }) => (\n <StationRow\n key={role.role}\n role={role}\n metric={metrics.find((m) => m.role === role.role)}\n selected={selectedRole === role.role}\n onClick={() => handleSelect(role.role)}\n />\n ))}\n </div>\n </div>\n\n </div>\n )}\n </div>\n );\n}\n"],"names":["W","H","ML","MR","MT","MB","chartW","chartH","bottom","right","EASE","SOLO_HALF","soloSegment","p","catmullPath","pts","segs","i","p0","p1","p2","p3","cp1x","cp1y","cp2x","cp2y","bandPath","upper","lower","forward","rev","back","backSegs","compact","n","last","a","ACTIVE_COLOR","QUEUED_COLOR","RESOLVED_COLOR","TARGET_COLOR","PRIORITY_COLOR","PRIORITY_TEXT_COLOR","MIN_GAP","spreadLabels","labels","maxY","sorted","b","prev","placed","l","labelY","overflow","PaceChart","stations","selectedRole","onSelect","onUpstreamSelect","onPrioritySelect","periodHours","hoveredIdx","setHoveredIdx","useState","xOf","xMap","rows","target","expected","_a","_b","_c","_d","hasTargets","r","maxVal","yScale","v","withTarget","targetPts","actualPts","activePts","pendingPts","targetLinePath","actualSplinePath","activeSplinePath","pendingSplinePath","lastActual","lastTarget","lastActive","lastPending","areaPath","hasQueue","workedBandPath","queuedBandPath","showActiveLabel","showQueuedLabel","endLabels","px","cx","jsx","tp","ap","ar","hasWaiting","pendingLabelY","row","s","x","cy","isSelected","isHovered","tooltip","tipW","tipX","tipY","jsxs","e","priorityQueueLink","role","base","orderBy","PERIODS","isPeriod","fmt","min","MetricRow","label","value","PeriodSelector","period","onChange","RoleView","globalPeriod","onClose","setPeriod","data","useStationMetrics","metric","slaMinutes","targetPerHour","workerCount","Fragment","X","Link","ExternalLink","OverviewPanel","allMetrics","orderedRoles","totalPending","m","totalResolved","totalPriority","metricByRole","stationsAtRisk","stationsWithLoad","pending","claimed","resolved","priorityCount","hasAlert","hasLoad","StationDetailPanel","TARGET_BAND","PENDING_BAND","ACTIVE_BAND","RESOLVED_BAND","PERIOD_HOURS","buildFragments","roles","opsRoles","roleMap","visited","fragments","root","queue","item","c","fmtMin","loadBar","ratio","pct","color","StationRow","selected","onClick","barWidth","GitMerge","TableHead","cols","col","OperationsPage","setSelectedRole","refreshing","setRefreshing","useStationMetricsEvents","roleData","rolesLoading","refetchRoles","useRoleDetails","metricsData","metricsLoading","refetchMetrics","metrics","useMemo","searchParams","setSearchParams","useSearchParams","fragmentParam","activeFragment","f","selectFragment","useCallback","origin","ordered","fragmentRoleSet","fragmentMetrics","chartStations","handleUpstreamSelect","upstreamRole","navigate","useNavigate","handlePrioritySelect","roleName","detail","selectedRoleDetail","isLoading","handleRefresh","handleSelect","periodSelector","PageHeader","RefreshCw","isActive","o"],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import{j as e,a as m}from"./vendor-query-B2UbickB.js";import{b as Q,f as I,g as X,e as ee,h as te,i as se}from"./roles-lHLgLwOY.js";import{J as U}from"./index-MbEPoyTe.js";import{C as ae}from"./ConfirmDeleteModal-D9_1b4MW.js";import{u as re}from"./users-CAih5Fty.js";import{T as D,B as ne,v as L,V as ie,p as oe,ar as le,N as ce,f as de,g as F}from"./vendor-icons-DOIDKgo6.js";import{e as xe,c as pe,L as me}from"./vendor-react-CXumBFUA.js";import"./Modal-CSrxpXeM.js";function ue({role:s}){const{data:d}=re({role:s,limit:100}),n=(d==null?void 0:d.users)??[];return n.length===0?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Assign users to this role to staff its queue. Members see and resolve escalations here according to their read/write scope; admins manage the role itself."}):e.jsx("div",{className:"divide-y divide-surface-border/40",children:n.map(l=>{const x=l.roles.find(c=>c.role===s);return x?e.jsxs("div",{className:"flex items-center justify-between py-1.5 gap-2",children:[e.jsx("span",{className:"text-xs text-text-secondary truncate",children:l.display_name||l.external_id}),e.jsx("span",{className:"text-[10px] text-text-quaternary font-mono shrink-0",children:he(x)})]},l.id):null})})}function he(s){return s.type==="superadmin"||s.type==="admin"?s.type:`member · read ${s.read_scope} · write ${s.write_scope}`}function B(s){return s==null?"":JSON.stringify(s,null,2)}function P(s){const d=s.trim();if(!d)return{ok:!0,value:void 0};try{const n=JSON.parse(d);return typeof n!="object"||Array.isArray(n)||n===null?{ok:!1}:{ok:!0,value:n}}catch{return{ok:!1}}}function g({icon:s,color:d,label:n,aside:l}){return e.jsxs("div",{className:"flex items-center justify-between mb-3 pb-2 border-b border-surface-border",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(s,{className:`w-4 h-4 ${d}`,strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:n})]}),l]})}function fe({role:s,allRoles:d}){const{data:n}=ee(),l=te(),x=se(),[c,u]=m.useState(""),a=(n==null?void 0:n.chains)??[],t=m.useMemo(()=>a.filter(o=>o.source_role===s.role).map(o=>o.target_role),[a,s.role]),j=m.useMemo(()=>d.map(o=>o.role).filter(o=>o!==s.role&&o!=="superadmin"&&!t.includes(o)),[d,s.role,t]);return s.role==="superadmin"?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Superadmins can escalate to any role implicitly."}):e.jsxs("div",{className:"space-y-3",children:[t.length===0?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Add a target role to route hand-offs."}):e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(o=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary",children:[o,e.jsx("button",{onClick:()=>x.mutate({source_role:s.role,target_role:o}),className:"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5",children:"×"})]},o))}),j.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:c,onChange:o=>u(o.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Add target…"}),j.map(o=>e.jsx("option",{value:o,children:o},o))]}),e.jsx("button",{onClick:()=>{c&&l.mutate({source_role:s.role,target_role:c},{onSuccess:()=>u("")})},disabled:!c||l.isPending,className:"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0",children:l.isPending?"…":"Add"})]})]})}function ge({role:s,allRoles:d}){const n=I(),[l,x]=m.useState(""),c=s.upstream_roles??[],u=m.useMemo(()=>d.map(t=>t.role).filter(t=>t!==s.role&&t!=="superadmin"&&!c.includes(t)),[d,s.role,c]),a=t=>n.mutate({role:s.role,upstream_roles:t},{onSuccess:()=>x("")});return e.jsxs("div",{className:"space-y-3",children:[c.length===0?e.jsx("p",{className:"text-[11px] text-text-tertiary",children:"Add a role from another sequence that this station draws input from. Prior Step sets where this role sits in its own sequence; upstream inputs mark the side-quests that land here."}):e.jsx("div",{className:"flex flex-wrap gap-1.5",children:c.map(t=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary",children:[t,e.jsx("button",{onClick:()=>a(c.filter(j=>j!==t)),className:"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5",children:"×"})]},t))}),u.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:l,onChange:t=>x(t.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Add upstream input…"}),u.map(t=>e.jsx("option",{value:t,children:t},t))]}),e.jsx("button",{onClick:()=>{l&&a([...c,l])},disabled:!l||n.isPending,className:"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0",children:n.isPending?"…":"Add"})]}),n.error&&e.jsx("p",{className:"text-[10px] text-status-error",children:n.error.message})]})}function je(s){return{title:s.title??"",description:s.description??"",ops_visible:s.ops_visible,parent_role:s.parent_role??"",metadata_schema:B(s.metadata_schema),properties:B(s.properties)||"{}",sla_minutes:s.sla_minutes!=null?String(s.sla_minutes):"",target_per_hour:s.target_per_hour!=null?String(s.target_per_hour):"",worker_count:s.worker_count!=null?String(s.worker_count):"",priority_threshold_minutes:s.priority_threshold_minutes!=null?String(s.priority_threshold_minutes):"",priority_facet:s.priority_facet??""}}const ve=/^[a-zA-Z0-9_]+$/;function Pe(){const{role:s}=xe(),d=pe(),{data:n,isLoading:l}=Q(),x=I(),c=X(),u=(n==null?void 0:n.roles)??[],a=u.find(r=>r.role===s),[t,j]=m.useState({title:"",description:"",ops_visible:!1,parent_role:"",metadata_schema:"",properties:"{}",sla_minutes:"",target_per_hour:"",worker_count:"",priority_threshold_minutes:"",priority_facet:""}),[o,q]=m.useState(!1),[z,N]=m.useState(!1),[v,y]=m.useState({}),[V,J]=m.useState(!1),[w,O]=m.useState(new Set),M=r=>O(i=>new Set([...i,r]));m.useEffect(()=>{a&&(j(je(a)),q(!1),N(!1),y({}),O(new Set))},[s,a==null?void 0:a.role]);const h=r=>{j(i=>({...i,...r})),q(!0),N(!1)},W=m.useMemo(()=>u.filter(r=>{if(!a||r.role===a.role)return!1;let i=r;const p=new Set;for(;i!=null&&i.parent_role;){if(i.parent_role===a.role)return!1;if(p.has(i.parent_role))break;p.add(i.parent_role),i=u.find(f=>f.role===i.parent_role)}return!0}),[u,a]),K=()=>{const r=P(t.metadata_schema),i=P(t.properties),p=t.priority_facet.trim(),f={};if(r.ok||(f.metadata_schema="Invalid JSON"),i.ok||(f.properties="Invalid JSON"),p&&!ve.test(p)&&(f.priority_facet="Letters, numbers, underscores only"),y(f),Object.keys(f).length||!a)return;const b=$=>{const _=parseFloat($);return isNaN(_)?null:_},Z=$=>{const _=b($);return _==null?null:Math.round(_)};x.mutate({role:a.role,title:t.title.trim()||null,description:t.description.trim()||null,ops_visible:t.ops_visible,parent_role:t.parent_role||null,metadata_schema:r.value??null,properties:i.value??{},sla_minutes:b(t.sla_minutes),target_per_hour:b(t.target_per_hour),worker_count:Z(t.worker_count),priority_threshold_minutes:b(t.priority_threshold_minutes),priority_facet:p||null},{onSuccess:()=>{q(!1),N(!0),O(new Set),window.setTimeout(()=>N(!1),2500)}})},G=()=>{a&&c.mutate(a.role,{onSuccess:()=>d("/admin/roles")})};if(l)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-4 bg-surface-sunken rounded w-64"}),e.jsx("div",{className:"h-64 bg-surface-sunken rounded"})]});if(!a)return e.jsxs("div",{className:"flex flex-col items-center justify-center py-20 text-center",children:[e.jsx(D,{className:"w-12 h-12 text-text-quaternary mb-4",strokeWidth:1}),e.jsx("h2",{className:"text-lg font-medium text-text-primary mb-2",children:"Role not found"})]});const H=a.user_count>0||a.chain_count>0||a.workflow_count>0,Y=o&&!Object.values(v).some(Boolean),k=parseFloat(t.sla_minutes),S=parseFloat(t.target_per_hour),C=parseFloat(t.worker_count),A=!isNaN(k)&&k>0,E=!isNaN(S)&&S>0,R=!isNaN(C)&&C>0,T=A&&R&&!E?`→ target ≈ ${(C/(k/60)).toFixed(1)}/h`:A&&E&&!R?`→ workers ≈ ${(S*(k/60)).toFixed(1)}`:E&&R&&!A?`→ SLA ≈ ${(C/S*60).toFixed(0)}m`:null;return e.jsxs("div",{children:[e.jsxs("div",{className:"grid grid-cols-3 gap-16 items-center mb-12",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4 min-w-0",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-1",children:[e.jsx(D,{className:"w-5 h-5 text-accent",strokeWidth:1.5}),e.jsx("h1",{className:"text-lg font-mono font-medium text-text-primary",children:a.role}),e.jsx("button",{onClick:()=>{window.location.hash="#docs:dashboard.md:role-detail"},className:"text-text-quaternary hover:text-accent transition-colors",title:"Open docs for this page",children:e.jsx(ne,{className:"w-4 h-4",strokeWidth:1.5})}),a.parent_role&&e.jsxs("span",{className:"flex items-center gap-1 text-[10px] text-text-quaternary font-mono",children:[e.jsx(L,{className:"w-3 h-3"})," ",a.parent_role]})]}),a.title&&e.jsx("p",{className:"text-sm text-text-secondary pl-8",children:a.title})]}),e.jsxs("div",{className:"flex items-center gap-2 shrink-0",title:"Show as a station on the Pace Board",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:"Ops"}),e.jsx("button",{onClick:()=>h({ops_visible:!t.ops_visible}),className:`w-9 h-5 rounded-full transition-colors relative shrink-0 ${t.ops_visible?"bg-accent":"bg-surface-border"}`,children:e.jsx("span",{className:`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${t.ops_visible?"translate-x-[18px]":"translate-x-[3px]"}`})})]})]}),e.jsxs("div",{className:"flex items-end justify-center gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 w-full",title:"throughput = workers / (sla / 60)",children:[[{key:"sla_minutes",label:"SLA",unit:"min",placeholder:"30"},{key:"target_per_hour",label:"Target",unit:"/h",placeholder:"20"},{key:"worker_count",label:"Workers",unit:"",placeholder:"4"}].map(({key:r,label:i,unit:p,placeholder:f})=>e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:[i,p&&e.jsx("span",{className:"normal-case font-normal ml-1",children:p})]}),e.jsx("input",{type:"number",min:"0",step:"any",value:t[r],onChange:b=>h({[r]:b.target.value}),placeholder:f,className:"input text-xs w-16 font-mono"})]},r)),T&&e.jsx("span",{className:"text-[10px] text-accent font-mono whitespace-nowrap pb-2",children:T})]}),e.jsxs("div",{className:"flex items-center justify-between gap-4 min-w-0",children:[e.jsxs("div",{className:"flex items-end gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 shrink-0",title:"Pending unclaimed items older than the threshold count as priority on the Pace Board. Age is measured from the metadata facet (an ISO 8601 UTC timestamp, e.g. authorized_at) or from created_at when the facet is blank; the threshold falls back to SLA when blank.",children:[e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:["Priority",e.jsx("span",{className:"normal-case font-normal ml-1",children:"min"})]}),e.jsx("input",{type:"number",min:"0",step:"any",value:t.priority_threshold_minutes,onChange:r=>h({priority_threshold_minutes:r.target.value}),placeholder:t.sla_minutes||"60",className:"input text-xs w-16 font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1",children:"Facet"}),e.jsx("input",{type:"text",value:t.priority_facet,onChange:r=>h({priority_facet:r.target.value}),placeholder:"created_at",className:"input text-xs w-28 font-mono"}),v.priority_facet&&e.jsx("p",{className:"text-[9px] text-status-error mt-0.5",children:v.priority_facet})]})]}),e.jsxs("div",{className:"flex items-center gap-3 shrink-0",children:[z&&e.jsxs("span",{className:"flex items-center gap-1 text-xs text-status-success animate-page-enter",children:[e.jsx(ie,{className:"w-3 h-3"})," Saved"]}),x.error&&e.jsx("span",{className:"text-xs text-status-error max-w-[180px] truncate",children:x.error.message}),e.jsx("button",{onClick:K,disabled:!Y||x.isPending,className:"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:x.isPending?"Saving…":"Save"}),!H&&e.jsxs("button",{onClick:()=>J(!0),className:"px-3 py-1.5 text-xs rounded-md text-status-error/60 hover:text-status-error hover:bg-status-error/10 transition-colors flex items-center gap-1",children:[e.jsx(oe,{className:"w-3 h-3"})," Delete"]})]})]})]}),e.jsxs("div",{className:"grid grid-cols-3 gap-16 items-start",children:[e.jsxs("div",{className:"space-y-14",children:[e.jsxs("div",{className:"space-y-8",children:[e.jsx(g,{icon:D,color:"text-accent",label:"Identity"}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Display Name"}),e.jsx("input",{type:"text",value:t.title,onChange:r=>h({title:r.target.value}),placeholder:`e.g., ${a.role.charAt(0).toUpperCase()+a.role.slice(1)}`,className:"input text-sm w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5",children:"Description"}),e.jsx("textarea",{value:t.description,onChange:r=>h({description:r.target.value}),placeholder:"A short description shown on role cards and in the operations view.",rows:4,className:"input text-sm w-full resize-none"})]})]}),e.jsxs("div",{className:`space-y-14 overflow-hidden transition-all duration-300 ease-out ${t.ops_visible?"opacity-100 max-h-[900px]":"opacity-0 max-h-0 pointer-events-none"}`,"aria-hidden":!t.ops_visible,children:[e.jsxs("div",{className:"space-y-5",children:[e.jsx(g,{icon:L,color:"text-text-tertiary",label:"Prior Step"}),e.jsxs("select",{value:t.parent_role,onChange:r=>h({parent_role:r.target.value}),className:"select text-sm w-full font-mono",children:[e.jsx("option",{value:"",children:"None — root process"}),W.map(r=>e.jsx("option",{value:r.role,children:r.title?`${r.role} — ${r.title}`:r.role},r.role))]}),e.jsx("p",{className:"text-[10px] text-text-tertiary leading-relaxed",children:"Places this role in one Pace Board sequence. A role with no prior step starts its own sequence."})]}),e.jsxs("div",{className:"space-y-5",children:[e.jsx(g,{icon:le,color:"text-text-tertiary",label:"Upstream Inputs",aside:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-status-success",children:"Live"})]})}),e.jsx(ge,{role:a,allRoles:u})]})]})]}),e.jsxs("div",{className:"space-y-14",children:[e.jsxs("div",{children:[e.jsx(g,{icon:ce,color:"text-text-quaternary",label:"Escalation Targets",aside:e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("span",{className:"w-1.5 h-1.5 rounded-full dot-ring bg-status-success"}),e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-widest text-status-success",children:"Live"})]})}),e.jsx(fe,{role:a,allRoles:u})]}),e.jsxs("div",{className:"pt-3 pb-4 border-t border-surface-border/40",children:[e.jsx(g,{icon:de,color:"text-text-quaternary",label:"Members",aside:e.jsx("span",{className:"text-[9px] font-normal normal-case text-text-quaternary",children:"read = what appears · write = what they can act on"})}),e.jsx(ue,{role:a.role})]})]}),e.jsxs("div",{className:"space-y-14",children:[e.jsxs("div",{children:[e.jsx(g,{icon:F,color:"text-accent",label:"Escalation Schema",aside:a.current_schema_version!=null?e.jsxs("span",{className:"text-[9px] font-mono text-text-quaternary",children:["v",a.current_schema_version," in use"]}):void 0}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["The form a person completes to resolve this role's escalations. Versioned — each save adds one; workflows pin any version via"," ",e.jsx("code",{className:"font-mono",children:"schemaVersion"}),"."]}),e.jsx(me,{to:`/admin/roles/${encodeURIComponent(a.role)}/schema`,className:"text-xs text-accent hover:underline",children:a.form_schema?`Open schema editor — v${a.current_schema_version??1} in use →`:"Define the escalation form →"})]}),e.jsxs("div",{children:[e.jsx(g,{icon:F,color:"text-accent",label:"Metadata Schema",aside:!w.has("metadata_schema")&&a.metadata_schema?e.jsx("button",{onClick:()=>M("metadata_schema"),className:"text-[9px] text-accent hover:underline",children:"Edit"}):void 0}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mb-3 leading-relaxed",children:["Validates ",e.jsx("code",{className:"font-mono",children:"metadata"})," at creation time. Keys appear in faceted search autocomplete."]}),!w.has("metadata_schema")&&a.metadata_schema?e.jsx(U,{data:a.metadata_schema}):e.jsxs(e.Fragment,{children:[e.jsx("textarea",{value:t.metadata_schema,onChange:r=>{const i=r.target.value;h({metadata_schema:i}),y(p=>({...p,metadata_schema:P(i).ok?void 0:"Invalid JSON"}))},rows:10,spellCheck:!1,className:"input text-xs font-mono w-full resize-y",placeholder:`{
2
- "type": "object",
3
- "properties": {
4
- "order_id": { "type": "string" }
5
- },
6
- "required": ["order_id"]
7
- }`}),v.metadata_schema&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:v.metadata_schema})]})]}),e.jsxs("div",{children:[e.jsx(g,{icon:F,color:"text-text-quaternary",label:"Properties",aside:!w.has("properties")&&a.properties&&Object.keys(a.properties).length>0?e.jsx("button",{onClick:()=>M("properties"),className:"text-[9px] text-accent hover:underline",children:"Edit"}):e.jsx("span",{className:"text-[9px] font-normal normal-case text-text-quaternary",children:"custom JSON"})}),!w.has("properties")&&a.properties&&Object.keys(a.properties).length>0?e.jsx(U,{data:a.properties,defaultCollapsed:!0}):e.jsxs(e.Fragment,{children:[e.jsx("textarea",{value:t.properties,onChange:r=>{const i=r.target.value;h({properties:i}),y(p=>({...p,properties:P(i).ok?void 0:"Invalid JSON"}))},rows:5,spellCheck:!1,className:"input text-xs font-mono w-full resize-none",placeholder:`{
8
- "icon": "wrench",
9
- "color": "#6366f1"
10
- }`}),v.properties&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:v.properties})]})]})]})]}),e.jsx(ae,{open:V,onClose:()=>J(!1),onConfirm:G,title:"Delete Role",description:e.jsxs(e.Fragment,{children:["Delete role ",e.jsx("span",{className:"font-medium font-mono text-text-primary",children:a.role}),"? This cannot be undone."]}),isPending:c.isPending,error:c.error})]})}export{Pe as RoleDetailPage};
11
- //# sourceMappingURL=RoleDetailPage-BPsrUqIa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RoleDetailPage-BPsrUqIa.js","sources":["../../src/pages/admin/roles/RoleMembersSection.tsx","../../src/pages/admin/roles/RoleDetailPage.tsx"],"sourcesContent":["import { useUsers } from '../../../api/users';\nimport type { LTUserRole } from '../../../api/types/users';\n\n/**\n * Who can see through this role's window, and how far. Membership is admin or\n * member; a member's reach over the queue is two axes — read (which\n * escalations appear: their own, or the whole queue) and write (which they can\n * claim and resolve: none, their own, or the whole queue).\n */\nexport function RoleMembersSection({ role }: { role: string }) {\n const { data } = useUsers({ role, limit: 100 });\n const users = data?.users ?? [];\n\n if (users.length === 0) {\n return (\n <p className=\"text-[11px] text-text-tertiary\">\n Assign users to this role to staff its queue. Members see and resolve\n escalations here according to their read/write scope; admins manage the\n role itself.\n </p>\n );\n }\n\n return (\n <div className=\"divide-y divide-surface-border/40\">\n {users.map((u) => {\n const membership = u.roles.find((r) => r.role === role);\n if (!membership) return null;\n return (\n <div key={u.id} className=\"flex items-center justify-between py-1.5 gap-2\">\n <span className=\"text-xs text-text-secondary truncate\">\n {u.display_name || u.external_id}\n </span>\n <span className=\"text-[10px] text-text-quaternary font-mono shrink-0\">\n {describeMembership(membership)}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction describeMembership(m: LTUserRole): string {\n if (m.type === 'superadmin' || m.type === 'admin') return m.type;\n return `member · read ${m.read_scope} · write ${m.write_scope}`;\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { useParams, useNavigate, Link } from 'react-router-dom';\nimport {\n Tag, GitBranch, GitMerge, Network, Trash2, Check, Braces, Users, BookOpen,\n} from 'lucide-react';\nimport {\n useRoleDetails,\n useUpdateRole,\n useDeleteRole,\n useEscalationChains,\n useAddEscalationChain,\n useRemoveEscalationChain,\n type RoleDetail,\n} from '../../../api/roles';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { RoleMembersSection } from './RoleMembersSection';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction safePrettyPrint(value: unknown): string {\n if (value == null) return '';\n return JSON.stringify(value, null, 2);\n}\n\nfunction safeParseJson(text: string): { ok: boolean; value?: Record<string, unknown> } {\n const trimmed = text.trim();\n if (!trimmed) return { ok: true, value: undefined };\n try {\n const parsed = JSON.parse(trimmed);\n if (typeof parsed !== 'object' || Array.isArray(parsed) || parsed === null) return { ok: false };\n return { ok: true, value: parsed };\n } catch {\n return { ok: false };\n }\n}\n\n// ── Section header ────────────────────────────────────────────────────────────\n\nfunction SectionHead({\n icon: Icon,\n color,\n label,\n aside,\n}: {\n icon: React.ElementType;\n color: string;\n label: string;\n aside?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-center justify-between mb-3 pb-2 border-b border-surface-border\">\n <div className=\"flex items-center gap-2\">\n <Icon className={`w-4 h-4 ${color}`} strokeWidth={1.5} />\n <h2 className=\"section-h2\">{label}</h2>\n </div>\n {aside}\n </div>\n );\n}\n\n// ── Escalation section (live-save) ────────────────────────────────────────────\n\nfunction EscalationSection({ role, allRoles }: { role: RoleDetail; allRoles: RoleDetail[] }) {\n const { data: chainsData } = useEscalationChains();\n const addChain = useAddEscalationChain();\n const removeChain = useRemoveEscalationChain();\n const [newTarget, setNewTarget] = useState('');\n\n const chains = chainsData?.chains ?? [];\n const targets = useMemo(\n () => chains.filter((c) => c.source_role === role.role).map((c) => c.target_role),\n [chains, role.role],\n );\n const available = useMemo(\n () => allRoles\n .map((r) => r.role)\n .filter((r) => r !== role.role && r !== 'superadmin' && !targets.includes(r)),\n [allRoles, role.role, targets],\n );\n\n if (role.role === 'superadmin') {\n return <p className=\"text-[11px] text-text-tertiary\">Superadmins can escalate to any role implicitly.</p>;\n }\n\n return (\n <div className=\"space-y-3\">\n {targets.length === 0 ? (\n <p className=\"text-[11px] text-text-tertiary\">Add a target role to route hand-offs.</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t) => (\n <span\n key={t}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary\"\n >\n {t}\n <button\n onClick={() => removeChain.mutate({ source_role: role.role, target_role: t })}\n className=\"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newTarget}\n onChange={(e) => setNewTarget(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Add target…</option>\n {available.map((r) => <option key={r} value={r}>{r}</option>)}\n </select>\n <button\n onClick={() => {\n if (!newTarget) return;\n addChain.mutate({ source_role: role.role, target_role: newTarget }, { onSuccess: () => setNewTarget('') });\n }}\n disabled={!newTarget || addChain.isPending}\n className=\"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0\"\n >\n {addChain.isPending ? '…' : 'Add'}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Upstream inputs section (live-save) ───────────────────────────────────────\n\n/**\n * The graph edges that don't fit the line. Prior Step (parent_role) places\n * this role in ONE sequence on the Operations page; upstream inputs declare\n * the roles it also draws from in OTHER sequences — mixin-like, many allowed.\n * The chart shows them as a merge glyph on the station, never as a bend in\n * the sequence.\n */\nfunction UpstreamSection({ role, allRoles }: { role: RoleDetail; allRoles: RoleDetail[] }) {\n const updateRole = useUpdateRole();\n const [newUpstream, setNewUpstream] = useState('');\n\n const upstreams = role.upstream_roles ?? [];\n const available = useMemo(\n () => allRoles\n .map((r) => r.role)\n .filter((r) => r !== role.role && r !== 'superadmin' && !upstreams.includes(r)),\n [allRoles, role.role, upstreams],\n );\n\n const save = (next: string[]) =>\n updateRole.mutate({ role: role.role, upstream_roles: next }, { onSuccess: () => setNewUpstream('') });\n\n return (\n <div className=\"space-y-3\">\n {upstreams.length === 0 ? (\n <p className=\"text-[11px] text-text-tertiary\">\n Add a role from another sequence that this station draws input from.\n Prior Step sets where this role sits in its own sequence; upstream\n inputs mark the side-quests that land here.\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {upstreams.map((u) => (\n <span\n key={u}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] bg-surface-sunken rounded font-mono text-text-secondary\"\n >\n {u}\n <button\n onClick={() => save(upstreams.filter((x) => x !== u))}\n className=\"text-text-quaternary hover:text-status-error transition-colors leading-none ml-0.5\"\n >\n ×\n </button>\n </span>\n ))}\n </div>\n )}\n {available.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <select\n value={newUpstream}\n onChange={(e) => setNewUpstream(e.target.value)}\n className=\"select text-xs font-mono flex-1\"\n >\n <option value=\"\">Add upstream input…</option>\n {available.map((r) => <option key={r} value={r}>{r}</option>)}\n </select>\n <button\n onClick={() => { if (newUpstream) save([...upstreams, newUpstream]); }}\n disabled={!newUpstream || updateRole.isPending}\n className=\"px-2.5 py-1 text-xs rounded bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed shrink-0\"\n >\n {updateRole.isPending ? '…' : 'Add'}\n </button>\n </div>\n )}\n {updateRole.error && (\n <p className=\"text-[10px] text-status-error\">{(updateRole.error as Error).message}</p>\n )}\n </div>\n );\n}\n\n// ── Draft state ───────────────────────────────────────────────────────────────\n\ninterface Draft {\n title: string;\n description: string;\n ops_visible: boolean;\n parent_role: string;\n metadata_schema: string;\n properties: string;\n sla_minutes: string;\n target_per_hour: string;\n worker_count: string;\n priority_threshold_minutes: string;\n priority_facet: string;\n}\n\nfunction draftFrom(role: RoleDetail): Draft {\n return {\n title: role.title ?? '',\n description: role.description ?? '',\n ops_visible: role.ops_visible,\n parent_role: role.parent_role ?? '',\n metadata_schema: safePrettyPrint(role.metadata_schema),\n properties: safePrettyPrint(role.properties) || '{}',\n sla_minutes: role.sla_minutes != null ? String(role.sla_minutes) : '',\n target_per_hour: role.target_per_hour != null ? String(role.target_per_hour) : '',\n worker_count: role.worker_count != null ? String(role.worker_count) : '',\n priority_threshold_minutes: role.priority_threshold_minutes != null ? String(role.priority_threshold_minutes) : '',\n priority_facet: role.priority_facet ?? '',\n };\n}\n\n// Mirrors the server-side facet key rule (metadata keys are interpolated as a\n// JSON path, so they are strictly validated).\nconst FACET_KEY = /^[a-zA-Z0-9_]+$/;\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function RoleDetailPage() {\n const { role: roleKey } = useParams<{ role: string }>();\n const navigate = useNavigate();\n const { data, isLoading } = useRoleDetails();\n const updateRole = useUpdateRole();\n const deleteRole = useDeleteRole();\n\n const roles = data?.roles ?? [];\n const role = roles.find((r) => r.role === roleKey);\n\n const [draft, setDraft] = useState<Draft>({\n title: '', description: '', ops_visible: false, parent_role: '',\n metadata_schema: '', properties: '{}',\n sla_minutes: '', target_per_hour: '', worker_count: '',\n priority_threshold_minutes: '', priority_facet: '',\n });\n const [dirty, setDirty] = useState(false);\n const [savedOk, setSavedOk] = useState(false);\n const [errors, setErrors] = useState<{ metadata_schema?: string; properties?: string; priority_facet?: string }>({});\n const [confirmDelete, setConfirmDelete] = useState(false);\n const [editingJson, setEditingJson] = useState(new Set<string>());\n\n const startEditingJson = (field: string) => setEditingJson((prev) => new Set([...prev, field]));\n\n useEffect(() => {\n if (!role) return;\n setDraft(draftFrom(role));\n setDirty(false);\n setSavedOk(false);\n setErrors({});\n setEditingJson(new Set());\n }, [roleKey, role?.role]);\n\n const update = (changes: Partial<Draft>) => {\n setDraft((d) => ({ ...d, ...changes }));\n setDirty(true);\n setSavedOk(false);\n };\n\n const availableParents = useMemo(\n () => roles.filter((r) => {\n if (!role || r.role === role.role) return false;\n let cur: RoleDetail | undefined = r;\n const seen = new Set<string>();\n while (cur?.parent_role) {\n if (cur.parent_role === role.role) return false;\n if (seen.has(cur.parent_role)) break;\n seen.add(cur.parent_role);\n cur = roles.find((x) => x.role === cur!.parent_role);\n }\n return true;\n }),\n [roles, role],\n );\n\n const handleSave = () => {\n const metaResult = safeParseJson(draft.metadata_schema);\n const propsResult = safeParseJson(draft.properties);\n const facet = draft.priority_facet.trim();\n const newErrors: typeof errors = {};\n if (!metaResult.ok) newErrors.metadata_schema = 'Invalid JSON';\n if (!propsResult.ok) newErrors.properties = 'Invalid JSON';\n if (facet && !FACET_KEY.test(facet)) newErrors.priority_facet = 'Letters, numbers, underscores only';\n setErrors(newErrors);\n if (Object.keys(newErrors).length || !role) return;\n\n const parseNum = (s: string) => { const v = parseFloat(s); return isNaN(v) ? null : v; };\n // Staff counts are whole people/machines — round rather than persist 2.5 workers.\n const parseCount = (s: string) => { const v = parseNum(s); return v == null ? null : Math.round(v); };\n\n updateRole.mutate(\n {\n role: role.role,\n title: draft.title.trim() || null,\n description: draft.description.trim() || null,\n ops_visible: draft.ops_visible,\n parent_role: draft.parent_role || null,\n metadata_schema: metaResult.value ?? null,\n properties: propsResult.value ?? {},\n sla_minutes: parseNum(draft.sla_minutes),\n target_per_hour: parseNum(draft.target_per_hour),\n worker_count: parseCount(draft.worker_count),\n priority_threshold_minutes: parseNum(draft.priority_threshold_minutes),\n priority_facet: facet || null,\n },\n {\n onSuccess: () => {\n setDirty(false);\n setSavedOk(true);\n setEditingJson(new Set());\n window.setTimeout(() => setSavedOk(false), 2500);\n },\n },\n );\n };\n\n const handleDelete = () => {\n if (!role) return;\n deleteRole.mutate(role.role, { onSuccess: () => navigate('/admin/roles') });\n };\n\n // ── Loading / not found ───────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-4 bg-surface-sunken rounded w-64\" />\n <div className=\"h-64 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!role) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <Tag className=\"w-12 h-12 text-text-quaternary mb-4\" strokeWidth={1} />\n <h2 className=\"text-lg font-medium text-text-primary mb-2\">Role not found</h2>\n </div>\n );\n }\n\n const inUse = role.user_count > 0 || role.chain_count > 0 || role.workflow_count > 0;\n const canSave = dirty && !Object.values(errors).some(Boolean);\n\n // Any two capacity settings derive the third — hint the missing one.\n const sla = parseFloat(draft.sla_minutes);\n const tph = parseFloat(draft.target_per_hour);\n const wc = parseFloat(draft.worker_count);\n const slaOk = !isNaN(sla) && sla > 0;\n const tphOk = !isNaN(tph) && tph > 0;\n const wcOk = !isNaN(wc) && wc > 0;\n const derivedCapacityHint =\n slaOk && wcOk && !tphOk ? `→ target ≈ ${(wc / (sla / 60)).toFixed(1)}/h` :\n slaOk && tphOk && !wcOk ? `→ workers ≈ ${(tph * (sla / 60)).toFixed(1)}` :\n tphOk && wcOk && !slaOk ? `→ SLA ≈ ${(wc / tph * 60).toFixed(0)}m` : null;\n\n return (\n <div>\n {/* ── Header: mirrors the three-column body grid so each section sits\n exactly atop its column — identity + ops · capacity · priority + actions ── */}\n <div className=\"grid grid-cols-3 gap-16 items-center mb-12\">\n {/* Col 1: identity, with the Ops toggle at the column's right edge */}\n <div className=\"flex items-center justify-between gap-4 min-w-0\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-3 mb-1\">\n <Tag className=\"w-5 h-5 text-accent\" strokeWidth={1.5} />\n <h1 className=\"text-lg font-mono font-medium text-text-primary\">{role.role}</h1>\n <button\n onClick={() => { window.location.hash = '#docs:dashboard.md:role-detail'; }}\n className=\"text-text-quaternary hover:text-accent transition-colors\"\n title=\"Open docs for this page\"\n >\n <BookOpen className=\"w-4 h-4\" strokeWidth={1.5} />\n </button>\n {role.parent_role && (\n <span className=\"flex items-center gap-1 text-[10px] text-text-quaternary font-mono\">\n <GitBranch className=\"w-3 h-3\" /> {role.parent_role}\n </span>\n )}\n </div>\n {role.title && <p className=\"text-sm text-text-secondary pl-8\">{role.title}</p>}\n </div>\n\n {/* Ops — this role is (or isn't) a station on the Pace Board */}\n <div className=\"flex items-center gap-2 shrink-0\" title=\"Show as a station on the Pace Board\">\n <span className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">Ops</span>\n <button\n onClick={() => update({ ops_visible: !draft.ops_visible })}\n className={`w-9 h-5 rounded-full transition-colors relative shrink-0 ${\n draft.ops_visible ? 'bg-accent' : 'bg-surface-border'\n }`}\n >\n <span\n className={`absolute top-[3px] left-0 w-3.5 h-3.5 rounded-full bg-white transition-transform shadow ${\n draft.ops_visible ? 'translate-x-[18px]' : 'translate-x-[3px]'\n }`}\n />\n </button>\n </div>\n </div>\n\n {/* Col 2: capacity — full column width, settings centered atop the\n column below. Any two settings derive the third. */}\n <div\n className=\"flex items-end justify-center gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 w-full\"\n title=\"throughput = workers / (sla / 60)\"\n >\n {[\n { key: 'sla_minutes' as const, label: 'SLA', unit: 'min', placeholder: '30' },\n { key: 'target_per_hour' as const, label: 'Target', unit: '/h', placeholder: '20' },\n { key: 'worker_count' as const, label: 'Workers', unit: '', placeholder: '4' },\n ].map(({ key, label, unit, placeholder }) => (\n <div key={key}>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n {label}\n {unit && <span className=\"normal-case font-normal ml-1\">{unit}</span>}\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={draft[key]}\n onChange={(e) => update({ [key]: e.target.value })}\n placeholder={placeholder}\n className=\"input text-xs w-16 font-mono\"\n />\n </div>\n ))}\n {derivedCapacityHint && (\n <span className=\"text-[10px] text-accent font-mono whitespace-nowrap pb-2\">\n {derivedCapacityHint}\n </span>\n )}\n </div>\n\n {/* Col 3: priority left-aligned to the column edge, actions at the right.\n Pending unclaimed items older than the threshold appear as the Pace\n Board priority count, ordered by the facet for the pull. */}\n <div className=\"flex items-center justify-between gap-4 min-w-0\">\n <div\n className=\"flex items-end gap-4 bg-surface-sunken rounded-lg px-4 py-2.5 shrink-0\"\n title=\"Pending unclaimed items older than the threshold count as priority on the Pace Board. Age is measured from the metadata facet (an ISO 8601 UTC timestamp, e.g. authorized_at) or from created_at when the facet is blank; the threshold falls back to SLA when blank.\"\n >\n <div>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n Priority\n <span className=\"normal-case font-normal ml-1\">min</span>\n </label>\n <input\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={draft.priority_threshold_minutes}\n onChange={(e) => update({ priority_threshold_minutes: e.target.value })}\n placeholder={draft.sla_minutes || '60'}\n className=\"input text-xs w-16 font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[9px] font-semibold uppercase tracking-widest text-text-quaternary mb-1\">\n Facet\n </label>\n <input\n type=\"text\"\n value={draft.priority_facet}\n onChange={(e) => update({ priority_facet: e.target.value })}\n placeholder=\"created_at\"\n className=\"input text-xs w-28 font-mono\"\n />\n {errors.priority_facet && (\n <p className=\"text-[9px] text-status-error mt-0.5\">{errors.priority_facet}</p>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-3 shrink-0\">\n {savedOk && (\n <span className=\"flex items-center gap-1 text-xs text-status-success animate-page-enter\">\n <Check className=\"w-3 h-3\" /> Saved\n </span>\n )}\n {updateRole.error && (\n <span className=\"text-xs text-status-error max-w-[180px] truncate\">\n {(updateRole.error as Error).message}\n </span>\n )}\n <button\n onClick={handleSave}\n disabled={!canSave || updateRole.isPending}\n className=\"px-3 py-1.5 text-xs rounded-md bg-accent text-text-inverse hover:bg-accent-hover transition-colors disabled:opacity-40 disabled:cursor-not-allowed\"\n >\n {updateRole.isPending ? 'Saving…' : 'Save'}\n </button>\n {!inUse && (\n <button\n onClick={() => setConfirmDelete(true)}\n className=\"px-3 py-1.5 text-xs rounded-md text-status-error/60 hover:text-status-error hover:bg-status-error/10 transition-colors flex items-center gap-1\"\n >\n <Trash2 className=\"w-3 h-3\" /> Delete\n </button>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Three-column body ── */}\n <div className=\"grid grid-cols-3 gap-16 items-start\">\n\n {/* ── Col 1: Identity ── */}\n <div className=\"space-y-14\">\n\n {/* Identity */}\n <div className=\"space-y-8\">\n <SectionHead icon={Tag} color=\"text-accent\" label=\"Identity\" />\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Display Name\n </label>\n <input\n type=\"text\"\n value={draft.title}\n onChange={(e) => update({ title: e.target.value })}\n placeholder={`e.g., ${role.role.charAt(0).toUpperCase() + role.role.slice(1)}`}\n className=\"input text-sm w-full\"\n />\n </div>\n\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1.5\">\n Description\n </label>\n <textarea\n value={draft.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder=\"A short description shown on role cards and in the operations view.\"\n rows={4}\n className=\"input text-sm w-full resize-none\"\n />\n </div>\n </div>\n\n {/* Sequence placement — only meaningful for stations, so these two\n sections follow the Ops toggle, easing in and out with it. */}\n <div\n className={`space-y-14 overflow-hidden transition-all duration-300 ease-out ${\n draft.ops_visible ? 'opacity-100 max-h-[900px]' : 'opacity-0 max-h-0 pointer-events-none'\n }`}\n aria-hidden={!draft.ops_visible}\n >\n {/* Prior Step */}\n <div className=\"space-y-5\">\n <SectionHead icon={GitBranch} color=\"text-text-tertiary\" label=\"Prior Step\" />\n <select\n value={draft.parent_role}\n onChange={(e) => update({ parent_role: e.target.value })}\n className=\"select text-sm w-full font-mono\"\n >\n <option value=\"\">None — root process</option>\n {availableParents.map((r) => (\n <option key={r.role} value={r.role}>\n {r.title ? `${r.role} — ${r.title}` : r.role}\n </option>\n ))}\n </select>\n <p className=\"text-[10px] text-text-tertiary leading-relaxed\">\n Places this role in one Pace Board sequence. A role with no prior\n step starts its own sequence.\n </p>\n </div>\n\n {/* Upstream inputs — cross-sequence graph edges, live-save */}\n <div className=\"space-y-5\">\n <SectionHead\n icon={GitMerge}\n color=\"text-text-tertiary\"\n label=\"Upstream Inputs\"\n aside={\n <div className=\"flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full dot-ring bg-status-success\" />\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-status-success\">Live</span>\n </div>\n }\n />\n <UpstreamSection role={role} allRoles={roles} />\n </div>\n </div>\n\n </div>\n\n {/* ── Col 2: Routing & People ── */}\n <div className=\"space-y-14\">\n\n {/* Escalation targets — live */}\n <div>\n <SectionHead\n icon={Network}\n color=\"text-text-quaternary\"\n label=\"Escalation Targets\"\n aside={\n <div className=\"flex items-center gap-1\">\n <span className=\"w-1.5 h-1.5 rounded-full dot-ring bg-status-success\" />\n <span className=\"text-[9px] font-semibold uppercase tracking-widest text-status-success\">Live</span>\n </div>\n }\n />\n <EscalationSection role={role} allRoles={roles} />\n </div>\n\n {/* Members — who can see through this window, and how far */}\n <div className=\"pt-3 pb-4 border-t border-surface-border/40\">\n <SectionHead\n icon={Users}\n color=\"text-text-quaternary\"\n label=\"Members\"\n aside={\n <span className=\"text-[9px] font-normal normal-case text-text-quaternary\">\n read = what appears · write = what they can act on\n </span>\n }\n />\n <RoleMembersSection role={role.role} />\n </div>\n </div>\n\n {/* ── Col 3: Schemas & Properties ── */}\n <div className=\"space-y-14\">\n {/* Escalation Schema — versioned, edited on its own page */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-accent\"\n label=\"Escalation Schema\"\n aside={\n role.current_schema_version != null ? (\n <span className=\"text-[9px] font-mono text-text-quaternary\">v{role.current_schema_version} in use</span>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n The form a person completes to resolve this role's escalations.\n Versioned — each save adds one; workflows pin any version via{' '}\n <code className=\"font-mono\">schemaVersion</code>.\n </p>\n <Link\n to={`/admin/roles/${encodeURIComponent(role.role)}/schema`}\n className=\"text-xs text-accent hover:underline\"\n >\n {role.form_schema\n ? `Open schema editor — v${role.current_schema_version ?? 1} in use →`\n : 'Define the escalation form →'}\n </Link>\n </div>\n\n {/* Metadata Schema */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-accent\"\n label=\"Metadata Schema\"\n aside={\n !editingJson.has('metadata_schema') && role.metadata_schema ? (\n <button onClick={() => startEditingJson('metadata_schema')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : undefined\n }\n />\n <p className=\"text-[10px] text-text-tertiary mb-3 leading-relaxed\">\n Validates <code className=\"font-mono\">metadata</code> at creation time. Keys appear in faceted search autocomplete.\n </p>\n {!editingJson.has('metadata_schema') && role.metadata_schema ? (\n <JsonViewer data={role.metadata_schema} />\n ) : (\n <>\n <textarea\n value={draft.metadata_schema}\n onChange={(e) => {\n const val = e.target.value;\n update({ metadata_schema: val });\n setErrors((prev) => ({ ...prev, metadata_schema: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={10}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-y\"\n placeholder={'{\\n \"type\": \"object\",\\n \"properties\": {\\n \"order_id\": { \"type\": \"string\" }\\n },\\n \"required\": [\"order_id\"]\\n}'}\n />\n {errors.metadata_schema && <p className=\"text-[10px] text-status-error mt-1\">{errors.metadata_schema}</p>}\n </>\n )}\n </div>\n\n {/* Properties (free bag) */}\n <div>\n <SectionHead\n icon={Braces}\n color=\"text-text-quaternary\"\n label=\"Properties\"\n aside={\n !editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <button onClick={() => startEditingJson('properties')} className=\"text-[9px] text-accent hover:underline\">Edit</button>\n ) : (\n <span className=\"text-[9px] font-normal normal-case text-text-quaternary\">custom JSON</span>\n )\n }\n />\n {!editingJson.has('properties') && role.properties && Object.keys(role.properties).length > 0 ? (\n <JsonViewer data={role.properties} defaultCollapsed />\n ) : (\n <>\n <textarea\n value={draft.properties}\n onChange={(e) => {\n const val = e.target.value;\n update({ properties: val });\n setErrors((prev) => ({ ...prev, properties: safeParseJson(val).ok ? undefined : 'Invalid JSON' }));\n }}\n rows={5}\n spellCheck={false}\n className=\"input text-xs font-mono w-full resize-none\"\n placeholder={'{\\n \"icon\": \"wrench\",\\n \"color\": \"#6366f1\"\\n}'}\n />\n {errors.properties && <p className=\"text-[10px] text-status-error mt-1\">{errors.properties}</p>}\n </>\n )}\n </div>\n </div>\n </div>\n\n {/* ── Delete confirmation ── */}\n <ConfirmDeleteModal\n open={confirmDelete}\n onClose={() => setConfirmDelete(false)}\n onConfirm={handleDelete}\n title=\"Delete Role\"\n description={\n <>\n Delete role <span className=\"font-medium font-mono text-text-primary\">{role.role}</span>? This cannot be undone.\n </>\n }\n isPending={deleteRole.isPending}\n error={deleteRole.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["RoleMembersSection","role","data","useUsers","users","jsx","u","membership","r","jsxs","describeMembership","m","safePrettyPrint","value","safeParseJson","text","trimmed","parsed","SectionHead","Icon","color","label","aside","EscalationSection","allRoles","chainsData","useEscalationChains","addChain","useAddEscalationChain","removeChain","useRemoveEscalationChain","newTarget","setNewTarget","useState","chains","targets","useMemo","c","available","t","e","UpstreamSection","updateRole","useUpdateRole","newUpstream","setNewUpstream","upstreams","save","next","x","draftFrom","FACET_KEY","RoleDetailPage","roleKey","useParams","navigate","useNavigate","isLoading","useRoleDetails","deleteRole","useDeleteRole","roles","draft","setDraft","dirty","setDirty","savedOk","setSavedOk","errors","setErrors","confirmDelete","setConfirmDelete","editingJson","setEditingJson","startEditingJson","field","prev","useEffect","update","changes","d","availableParents","cur","seen","handleSave","metaResult","propsResult","facet","newErrors","parseNum","s","v","parseCount","handleDelete","Tag","inUse","canSave","sla","tph","wc","slaOk","tphOk","wcOk","derivedCapacityHint","BookOpen","GitBranch","key","unit","placeholder","Check","Trash2","GitMerge","Network","Users","Braces","Link","JsonViewer","Fragment","val","ConfirmDeleteModal"],"mappings":"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"}
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme=blue]{--lt-accent: 30 58 138;--lt-accent-hover: 22 42 102;--lt-accent-muted: 148 163 216;--lt-accent-faint: 213 220 240;--lt-surface-hover: 240 243 250;--lt-surface-border: 188 198 228;--lt-text-primary: 10 16 38;--lt-text-secondary: 47 58 94;--lt-text-tertiary: 100 111 150;--lt-text-quaternary: 141 150 184;--lt-heading: 23 42 110}[data-theme=violet]{--lt-accent: 123 59 224;--lt-accent-hover: 98 41 190;--lt-accent-muted: 187 156 239;--lt-accent-faint: 229 217 249;--lt-surface-hover: 246 241 253;--lt-surface-border: 210 191 240;--lt-text-primary: 18 6 41;--lt-text-secondary: 62 44 99;--lt-text-tertiary: 117 101 158;--lt-text-quaternary: 157 143 192;--lt-heading: 98 36 184}[data-theme=red]{--lt-accent: 220 56 45;--lt-accent-hover: 179 42 34;--lt-accent-muted: 236 154 147;--lt-accent-faint: 247 218 214;--lt-surface-hover: 252 241 239;--lt-surface-border: 233 194 188;--lt-text-primary: 41 10 7;--lt-text-secondary: 102 59 52;--lt-text-tertiary: 150 110 102;--lt-text-quaternary: 188 154 147;--lt-heading: 173 33 25}[data-theme=green]{--lt-accent: 5 150 105;--lt-accent-hover: 4 120 87;--lt-accent-muted: 134 209 184;--lt-accent-faint: 205 237 226;--lt-surface-hover: 238 249 245;--lt-surface-border: 175 219 203;--lt-text-primary: 3 28 21;--lt-text-secondary: 34 89 72;--lt-text-tertiary: 91 140 125;--lt-text-quaternary: 136 176 163;--lt-heading: 4 110 79}[data-theme=rose]{--lt-accent: 214 36 110;--lt-accent-hover: 173 25 87;--lt-accent-muted: 235 148 185;--lt-accent-faint: 248 213 228;--lt-surface-hover: 253 240 246;--lt-surface-border: 233 188 207;--lt-text-primary: 40 8 22;--lt-text-secondary: 99 53 72;--lt-text-tertiary: 148 104 122;--lt-text-quaternary: 186 150 165;--lt-heading: 168 20 84}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.btn-primary{border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-hover) / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.625rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-secondary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.btn-ghost{border-radius:.375rem;padding:.625rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.row-hover{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.1s}.\!input{width:100%;border-bottom-width:1px;border-color:rgb(var(--lt-surface-border) / .6);background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\!input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.\!input:focus{border-color:rgb(var(--lt-accent) / .5);outline:2px solid transparent;outline-offset:2px}.input{width:100%;border-bottom-width:1px;border-color:rgb(var(--lt-surface-border) / .6);background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input:focus{border-color:rgb(var(--lt-accent) / .5);outline:2px solid transparent;outline-offset:2px}.input-json{width:100%;resize:vertical;border-radius:.375rem;border-width:1px;border-color:rgb(var(--lt-surface-border) / .4);background-color:transparent;padding:.5rem .75rem;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1.625;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.input-json::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input-json::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.input-json:focus{border-color:rgb(var(--lt-accent) / .5);outline:2px solid transparent;outline-offset:2px}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-bottom-width:1px;border-color:rgb(var(--lt-surface-border) / .6);background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.select:focus{border-color:rgb(var(--lt-accent) / .5);outline:2px solid transparent;outline-offset:2px}.label{margin-bottom:.125rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.hint{margin-top:.25rem;font-size:9px;line-height:1.375;color:rgb(var(--lt-text-tertiary) / .7)}.section-header{margin-bottom:.75rem;display:block;border-bottom-width:1px;border-color:rgb(var(--lt-surface-border) / .3);padding-bottom:.375rem;font-size:1.05rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:rgb(var(--lt-heading))}.section-h2{font-size:1.05rem;font-weight:300;font-variant-caps:small-caps;letter-spacing:.03em;color:rgb(var(--lt-heading))}.dot-ring{mask-image:radial-gradient(circle closest-side,transparent calc(100% - 1.5px),#000 calc(100% - .75px));-webkit-mask-image:radial-gradient(circle closest-side,transparent calc(100% - 1.5px),#000 calc(100% - .75px))}.logo-mark{background-color:rgb(var(--lt-accent));mask-image:var(--logo-url);mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-image:var(--logo-url);-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-y-0{top:0;bottom:0}.-left-\[3px\]{left:-3px}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-16{top:4rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-\[3px\]{top:3px}.top-\[60px\]{top:60px}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[45\]{z-index:45}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.float-right{float:right}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-10{margin-left:-2.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-mr-3{margin-right:-.75rem}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-mt-4{margin-top:-1rem}.-mt-6{margin-top:-1.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[3em\]{margin-top:3em}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-96{height:24rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[30vh\]{max-height:30vh}.max-h-\[400px\]{max-height:400px}.max-h-\[40vh\]{max-height:40vh}.max-h-\[45vh\]{max-height:45vh}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[900px\]{max-height:900px}.max-h-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[28px\]{min-height:28px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[35vh\]{min-height:35vh}.min-h-\[360px\]{min-height:360px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.min-h-\[calc\(100vh-9rem\)\]{min-height:calc(100vh - 9rem)}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[14px\]{width:14px}.w-\[150px\]{width:150px}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[22rem\]{width:22rem}.w-\[25\%\]{width:25%}.w-\[280px\]{width:280px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[40vw\]{width:40vw}.w-\[420px\]{width:420px}.w-\[48rem\]{width:48rem}.w-\[7px\]{width:7px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[14px\]{min-width:14px}.min-w-\[180px\]{min-width:180px}.min-w-\[18px\]{min-width:18px}.min-w-\[800px\]{min-width:800px}.min-w-\[80px\]{min-width:80px}.max-w-0{max-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[120px\]{max-width:120px}.max-w-\[150px\]{max-width:150px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[19rem\]{max-width:19rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[240px\]{max-width:240px}.max-w-\[24rem\]{max-width:24rem}.max-w-\[60\%\]{max-width:60%}.max-w-\[65\%\]{max-width:65%}.max-w-\[85\%\]{max-width:85%}.max-w-\[90vw\]{max-width:90vw}.max-w-dashboard{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[18px\]{--tw-translate-x: 18px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[3px\]{--tw-translate-x: 3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[field-error-in_0\.3s_ease-out\]{animation:field-error-in .3s ease-out}.animate-\[field-shake_0\.4s_ease-in-out\]{animation:field-shake .4s ease-in-out}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-cols-\[minmax\(0\,1fr\)_7rem_13rem_4\.5rem\]{grid-template-columns:minmax(0,1fr) 7rem 13rem 4.5rem}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:1rem}.gap-y-6{row-gap:1.5rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-divide-opacity, 1))}.divide-surface-border\/30>:not([hidden])~:not([hidden]){border-color:rgb(var(--lt-surface-border) / .3)}.divide-surface-border\/40>:not([hidden])~:not([hidden]){border-color:rgb(var(--lt-surface-border) / .4)}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-clip{overflow-x:clip}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[4px\]{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-y{border-top-width:1px;border-bottom-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-accent{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent-faint) / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent-muted) / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:rgb(var(--lt-accent-muted) / .4)}.border-accent\/10{border-color:rgb(var(--lt-accent) / .1)}.border-accent\/20{border-color:rgb(var(--lt-accent) / .2)}.border-accent\/30{border-color:rgb(var(--lt-accent) / .3)}.border-accent\/40{border-color:rgb(var(--lt-accent) / .4)}.border-amber-400\/40{border-color:#fbbf2466}.border-blue-400\/40{border-color:#60a5fa66}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-emerald-400\/40{border-color:#34d39966}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-status-active{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-status-draft{--tw-border-opacity: 1;border-color:rgb(249 115 22 / var(--tw-border-opacity, 1))}.border-status-error{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:#dc262633}.border-status-error\/30{border-color:#dc26264d}.border-status-error\/50{border-color:#dc262680}.border-status-pending\/30{border-color:#f59e0b4d}.border-status-success{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-status-success\/30{border-color:#16a34a4d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#f59e0b33}.border-status-warning\/30{border-color:#f59e0b4d}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.border-surface-border\/15{border-color:rgb(var(--lt-surface-border) / .15)}.border-surface-border\/30{border-color:rgb(var(--lt-surface-border) / .3)}.border-surface-border\/40{border-color:rgb(var(--lt-surface-border) / .4)}.border-surface-border\/50{border-color:rgb(var(--lt-surface-border) / .5)}.border-surface-border\/60{border-color:rgb(var(--lt-surface-border) / .6)}.border-text-quaternary\/40{border-color:rgb(var(--lt-text-quaternary) / .4)}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(var(--lt-text-tertiary) / var(--tw-border-opacity, 1))}.border-violet-400\/40{border-color:#a78bfa66}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/70{border-color:#ffffffb3}.\!border-l-accent{--tw-border-opacity: 1 !important;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))!important}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-r-surface-border{--tw-border-opacity: 1;border-right-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.border-r-transparent{border-right-color:transparent}.\!bg-status-error{--tw-bg-opacity: 1 !important;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))!important}.bg-\[a-z\]{background-color:a-z}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent) / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-faint) / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:rgb(var(--lt-accent-faint) / .5)}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-muted) / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:rgb(var(--lt-accent-muted) / .2)}.bg-accent\/10{background-color:rgb(var(--lt-accent) / .1)}.bg-accent\/15{background-color:rgb(var(--lt-accent) / .15)}.bg-accent\/20{background-color:rgb(var(--lt-accent) / .2)}.bg-accent\/5{background-color:rgb(var(--lt-accent) / .05)}.bg-accent\/60{background-color:rgb(var(--lt-accent) / .6)}.bg-accent\/\[0\.06\]{background-color:rgb(var(--lt-accent) / .06)}.bg-accent\/\[0\.08\]{background-color:rgb(var(--lt-accent) / .08)}.bg-amber-300\/\[0\.08\]{background-color:#fcd34d14}.bg-amber-400\/15{background-color:#fbbf2426}.bg-amber-400\/\[0\.08\]{background-color:#fbbf2414}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-blue-400\/15{background-color:#60a5fa26}.bg-blue-400\/\[0\.08\]{background-color:#60a5fa14}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-cyan-400\/\[0\.08\]{background-color:#22d3ee14}.bg-emerald-400\/15{background-color:#34d39926}.bg-emerald-400\/\[0\.08\]{background-color:#34d39914}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-fuchsia-400\/\[0\.08\]{background-color:#e879f914}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-green-400\/\[0\.08\]{background-color:#4ade8014}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-indigo-400\/\[0\.08\]{background-color:#818cf814}.bg-lime-400\/\[0\.08\]{background-color:#a3e63514}.bg-orange-400\/\[0\.08\]{background-color:#fb923c14}.bg-pink-300\/\[0\.08\]{background-color:#f9a8d414}.bg-pink-400\/\[0\.08\]{background-color:#f472b614}.bg-purple-400\/\[0\.08\]{background-color:#c084fc14}.bg-purple-500\/10{background-color:#a855f71a}.bg-red-400\/\[0\.08\]{background-color:#f8717114}.bg-rose-300\/\[0\.08\]{background-color:#fda4af14}.bg-rose-400\/\[0\.08\]{background-color:#fb718514}.bg-sky-300\/\[0\.08\]{background-color:#7dd3fc14}.bg-sky-400\/\[0\.08\]{background-color:#38bdf814}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-status-active\/10{background-color:#2563eb1a}.bg-status-active\/60{background-color:#2563eb99}.bg-status-active\/70{background-color:#2563ebb3}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-status-draft\/10{background-color:#f973161a}.bg-status-draft\/30{background-color:#f973164d}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:#dc26261a}.bg-status-error\/5{background-color:#dc26260d}.bg-status-error\/70{background-color:#dc2626b3}.bg-status-error\/\[0\.04\]{background-color:#dc26260a}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-pending\/10{background-color:#f59e0b1a}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-status-success\/10{background-color:#16a34a1a}.bg-status-success\/20{background-color:#16a34a33}.bg-status-success\/30{background-color:#16a34a4d}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#f59e0b1a}.bg-status-warning\/15{background-color:#f59e0b26}.bg-status-warning\/5{background-color:#f59e0b0d}.bg-stone-400\/\[0\.08\]{background-color:#a8a29e14}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-border) / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:rgb(var(--lt-surface-border) / .6)}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:rgb(var(--lt-surface-hover) / .3)}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:#ffffff80}.bg-surface-raised\/\[0\.03\]{background-color:#ffffff08}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/15{background-color:#f5f5f726}.bg-surface-sunken\/20{background-color:#f5f5f733}.bg-surface-sunken\/30{background-color:#f5f5f74d}.bg-surface-sunken\/40{background-color:#f5f5f766}.bg-surface-sunken\/50{background-color:#f5f5f780}.bg-surface-sunken\/60{background-color:#f5f5f799}.bg-surface-sunken\/80{background-color:#f5f5f7cc}.bg-surface-sunken\/90{background-color:#f5f5f7e6}.bg-surface\/90{background-color:#ffffffe6}.bg-surface\/95{background-color:#fffffff2}.bg-teal-300\/\[0\.08\]{background-color:#5eead414}.bg-teal-400\/\[0\.08\]{background-color:#2dd4bf14}.bg-text-primary\/30{background-color:rgb(var(--lt-text-primary) / .3)}.bg-text-secondary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-secondary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(var(--lt-text-tertiary) / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:rgb(var(--lt-text-tertiary) / .3)}.bg-transparent{background-color:transparent}.bg-violet-300\/\[0\.08\]{background-color:#c4b5fd14}.bg-violet-400\/15{background-color:#a78bfa26}.bg-violet-400\/\[0\.08\]{background-color:#a78bfa14}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/\[0\.08\]{background-color:#facc1514}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-accent\/\[0\.04\]{--tw-gradient-from: rgb(var(--lt-accent) / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(var(--lt-accent) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.\!py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-\[18px\]{padding-left:18px}.pr-2{padding-right:.5rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.\!text-\[9px\]{font-size:9px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[0\.5em\]{font-size:.5em}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[8\.5px\]{font-size:8.5px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extralight{font-weight:200}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[a-z\]{color:a-z}.text-accent{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(var(--lt-accent-muted) / var(--tw-text-opacity, 1))}.text-accent\/40{color:rgb(var(--lt-accent) / .4)}.text-accent\/50{color:rgb(var(--lt-accent) / .5)}.text-accent\/60{color:rgb(var(--lt-accent) / .6)}.text-accent\/70{color:rgb(var(--lt-accent) / .7)}.text-accent\/75{color:rgb(var(--lt-accent) / .75)}.text-accent\/80{color:rgb(var(--lt-accent) / .8)}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-fuchsia-400{--tw-text-opacity: 1;color:rgb(232 121 249 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-pink-300{--tw-text-opacity: 1;color:rgb(249 168 212 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-status-active\/70{color:#2563ebb3}.text-status-draft{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-error\/50{color:#dc262680}.text-status-error\/60{color:#dc262699}.text-status-error\/70{color:#dc2626b3}.text-status-error\/80{color:#dc2626cc}.text-status-pending{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-status-success\/70{color:#16a34ab3}.text-status-success\/80{color:#16a34acc}.text-status-warning{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-stone-400{--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.text-surface-border{--tw-text-opacity: 1;color:rgb(var(--lt-surface-border) / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-text-inverse{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.text-text-quaternary{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.text-text-quaternary\/40{color:rgb(var(--lt-text-quaternary) / .4)}.text-text-quaternary\/50{color:rgb(var(--lt-text-quaternary) / .5)}.text-text-quaternary\/60{color:rgb(var(--lt-text-quaternary) / .6)}.text-text-quaternary\/70{color:rgb(var(--lt-text-quaternary) / .7)}.text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:rgb(var(--lt-text-tertiary) / .3)}.text-text-tertiary\/40{color:rgb(var(--lt-text-tertiary) / .4)}.text-text-tertiary\/50{color:rgb(var(--lt-text-tertiary) / .5)}.text-text-tertiary\/60{color:rgb(var(--lt-text-tertiary) / .6)}.text-text-tertiary\/70{color:rgb(var(--lt-text-tertiary) / .7)}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:rgb(var(--lt-text-tertiary) / .3)}.accent-accent{accent-color:rgb(var(--lt-accent) / 1)}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/5{--tw-shadow-color: rgb(0 0 0 / .05);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-accent) / var(--tw-ring-opacity, 1))}.ring-accent\/40{--tw-ring-color: rgb(var(--lt-accent) / .4)}.ring-surface-border{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-surface-border) / var(--tw-ring-opacity, 1))}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-surface{--tw-ring-offset-color: #FFFFFF}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-150{--tw-brightness: brightness(1.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px rgb(var(--lt-accent) / .15)}8.3%{box-shadow:0 0 10px 2px rgb(var(--lt-accent) / .4)}16.7%,to{box-shadow:0 0 3px rgb(var(--lt-accent) / .15)}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}@keyframes field-shake{0%,to{transform:translate(0)}15%{transform:translate(-4px)}30%{transform:translate(3px)}45%{transform:translate(-2px)}60%{transform:translate(1px)}75%{transform:translate(0)}}@keyframes field-error-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgba(255,255,255,.15) 3px,rgba(255,255,255,.15) 6px);background-color:var(--color-status-warning, #f59e0b)}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-text-quaternary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-quaternary::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-quaternary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary\/40::-moz-placeholder{color:rgb(var(--lt-text-tertiary) / .4)}.placeholder\:text-text-tertiary\/40::placeholder{color:rgb(var(--lt-text-tertiary) / .4)}.placeholder\:text-text-tertiary\/50::-moz-placeholder{color:rgb(var(--lt-text-tertiary) / .5)}.placeholder\:text-text-tertiary\/50::placeholder{color:rgb(var(--lt-text-tertiary) / .5)}.first\:mt-0:first-child{margin-top:0}.first\:border-t-0:first-child{border-top-width:0px}.first\:pt-1:first-child{padding-top:.25rem}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent\/40:hover{border-color:rgb(var(--lt-accent) / .4)}.hover\:border-accent\/50:hover{border-color:rgb(var(--lt-accent) / .5)}.hover\:border-status-error:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\:border-text-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-text-tertiary) / var(--tw-border-opacity, 1))}.hover\:\!bg-status-error\/90:hover{background-color:#dc2626e6!important}.hover\:bg-accent-hover:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-hover) / var(--tw-bg-opacity, 1))}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-accent-muted) / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/10:hover{background-color:rgb(var(--lt-accent) / .1)}.hover\:bg-accent\/15:hover{background-color:rgb(var(--lt-accent) / .15)}.hover\:bg-accent\/20:hover{background-color:rgb(var(--lt-accent) / .2)}.hover\:bg-accent\/25:hover{background-color:rgb(var(--lt-accent) / .25)}.hover\:bg-accent\/30:hover{background-color:rgb(var(--lt-accent) / .3)}.hover\:bg-accent\/90:hover{background-color:rgb(var(--lt-accent) / .9)}.hover\:bg-accent\/\[0\.04\]:hover{background-color:rgb(var(--lt-accent) / .04)}.hover\:bg-status-error\/10:hover{background-color:#dc26261a}.hover\:bg-status-error\/20:hover{background-color:#dc262633}.hover\:bg-status-error\/5:hover{background-color:#dc26260d}.hover\:bg-status-error\/80:hover{background-color:#dc2626cc}.hover\:bg-status-error\/90:hover{background-color:#dc2626e6}.hover\:bg-status-success\/10:hover{background-color:#16a34a1a}.hover\:bg-status-success\/20:hover{background-color:#16a34a33}.hover\:bg-surface-border\/40:hover{background-color:rgb(var(--lt-surface-border) / .4)}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(var(--lt-surface-hover) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/30:hover{background-color:rgb(var(--lt-surface-hover) / .3)}.hover\:bg-surface-hover\/40:hover{background-color:rgb(var(--lt-surface-hover) / .4)}.hover\:bg-surface-hover\/50:hover{background-color:rgb(var(--lt-surface-hover) / .5)}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-raised\/30:hover{background-color:#ffffff4d}.hover\:bg-surface-raised\/60:hover{background-color:#fff9}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:#f5f5f766}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent-hover) / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:rgb(var(--lt-accent) / .8)}.hover\:text-status-active:hover{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.hover\:text-status-active\/80:hover{color:#2563ebcc}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:text-status-error\/80:hover{color:#dc2626cc}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.hover\:text-status-success\/80:hover{color:#16a34acc}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-status-warning\/80:hover{color:#f59e0bcc}.hover\:text-text-primary:hover{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.focus\:border-accent\/50:focus{border-color:rgb(var(--lt-accent) / .5)}.focus\:border-status-error:focus{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--lt-accent) / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/30:focus{--tw-ring-color: rgb(var(--lt-accent) / .3)}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(var(--lt-accent) / .4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:border-surface-border:hover:disabled{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group:hover .group-hover\:block{display:block}.group\/row:hover .group-hover\/row\:text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.group\/row:hover .group-hover\/row\:text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.group\/srv:hover .group-hover\/srv\:text-accent,.group:hover .group-hover\:text-accent{--tw-text-opacity: 1;color:rgb(var(--lt-accent) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(var(--lt-accent-hover) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(var(--lt-text-primary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-secondary{--tw-text-opacity: 1;color:rgb(var(--lt-text-secondary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/key:hover .group-hover\/key\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100,.group\/sched:hover .group-hover\/sched\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/sub:hover .group-hover\/sub\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:w-72{width:18rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.lg\:grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:grid-cols-\[1fr_400px\]{grid-template-columns:1fr 400px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(var(--lt-surface-border) / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}}