@hotmeshio/long-tail 0.10.2 → 0.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/README.md +1 -0
  2. package/build/api/bot-accounts.d.ts +4 -0
  3. package/build/api/bot-accounts.js +3 -1
  4. package/build/api/escalations/metadata.js +21 -1
  5. package/build/api/escalations/resolve.d.ts +8 -0
  6. package/build/api/escalations/resolve.js +82 -3
  7. package/build/api/roles.d.ts +2 -0
  8. package/build/api/roles.js +4 -0
  9. package/build/bin/ltc.js +10 -1
  10. package/build/index.js +7 -1
  11. package/build/lib/cli/client.d.ts +4 -1
  12. package/build/lib/cli/client.js +4 -2
  13. package/build/lib/db/schemas/023_role_enforce_schema.sql +18 -0
  14. package/build/lib/typed-resolution.d.ts +35 -0
  15. package/build/lib/typed-resolution.js +37 -0
  16. package/build/modules/branding.d.ts +21 -2
  17. package/build/modules/branding.js +22 -1
  18. package/build/modules/config.d.ts +1 -0
  19. package/build/modules/config.js +5 -0
  20. package/build/routes/bot-accounts.js +3 -1
  21. package/build/routes/settings.js +21 -0
  22. package/build/sdk/index.d.ts +4 -0
  23. package/build/sdk/index.js +14 -0
  24. package/build/services/escalation/crud.d.ts +18 -6
  25. package/build/services/escalation/crud.js +18 -2
  26. package/build/services/escalation/index.d.ts +1 -0
  27. package/build/services/escalation/index.js +1 -0
  28. package/build/services/escalation/resolver-validation.d.ts +28 -0
  29. package/build/services/escalation/resolver-validation.js +95 -0
  30. package/build/services/escalation/sql.d.ts +12 -2
  31. package/build/services/escalation/sql.js +22 -2
  32. package/build/services/iam/bots.d.ts +4 -1
  33. package/build/services/iam/bots.js +5 -3
  34. package/build/services/iam/sql.d.ts +2 -2
  35. package/build/services/iam/sql.js +15 -1
  36. package/build/services/role/enforcement-cache.d.ts +21 -0
  37. package/build/services/role/enforcement-cache.js +0 -0
  38. package/build/services/role/index.js +5 -0
  39. package/build/services/role/sql.d.ts +12 -2
  40. package/build/services/role/sql.js +15 -2
  41. package/build/services/role/types.d.ts +9 -0
  42. package/build/shared/form-validation/derive-field-label.d.ts +14 -0
  43. package/build/shared/form-validation/derive-field-label.js +31 -0
  44. package/build/shared/form-validation/field-validator.d.ts +45 -0
  45. package/build/shared/form-validation/field-validator.js +214 -0
  46. package/build/shared/form-validation/index.d.ts +12 -0
  47. package/build/shared/form-validation/index.js +28 -0
  48. package/build/shared/form-validation/validate-resolver-payload.d.ts +41 -0
  49. package/build/shared/form-validation/validate-resolver-payload.js +62 -0
  50. package/build/shared/form-validation/x-lt-bind.d.ts +41 -0
  51. package/build/shared/form-validation/x-lt-bind.js +110 -0
  52. package/build/shared/form-validation/x-lt-help.d.ts +21 -0
  53. package/build/shared/form-validation/x-lt-help.js +91 -0
  54. package/build/shared/form-validation/x-lt-show-if.d.ts +7 -0
  55. package/build/shared/form-validation/x-lt-show-if.js +84 -0
  56. package/build/system/mcp-servers/admin/schemas.d.ts +3 -0
  57. package/build/system/mcp-servers/admin/schemas.js +1 -0
  58. package/build/system/mcp-servers/admin/users.js +3 -1
  59. package/build/system/mcp-servers/human-queue-schemas.d.ts +4 -4
  60. package/build/system/mcp-servers/human-queue-schemas.js +4 -1
  61. package/build/system/mcp-servers/human-queue.js +41 -2
  62. package/build/tsconfig.tsbuildinfo +1 -1
  63. package/build/types/sdk.d.ts +6 -1
  64. package/build/types/startup.d.ts +26 -0
  65. package/build/types/validation.d.ts +43 -0
  66. package/build/types/validation.js +28 -0
  67. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js → AdminDashboard-Cma2NGsF.js} +2 -2
  68. package/dashboard/dist/assets/{AdminDashboard-Dy031e9g.js.map → AdminDashboard-Cma2NGsF.js.map} +1 -1
  69. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js +16 -0
  70. package/dashboard/dist/assets/AgentConfigPage-CbIhM-fa.js.map +1 -0
  71. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js +4 -0
  72. package/dashboard/dist/assets/AgentDetailPage-DuLEKzRT.js.map +1 -0
  73. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js +2 -0
  74. package/dashboard/dist/assets/AgentsPage-DZO9i7Nl.js.map +1 -0
  75. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js +2 -0
  76. package/dashboard/dist/assets/AvailableEscalationsPage-DlVoNd8B.js.map +1 -0
  77. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js → BotPicker-CidlGr6f.js} +2 -2
  78. package/dashboard/dist/assets/{BotPicker-2QEIpc-K.js.map → BotPicker-CidlGr6f.js.map} +1 -1
  79. package/dashboard/dist/assets/CapabilitiesPage-BMNNTa0D.js +2 -0
  80. package/dashboard/dist/assets/{CapabilitiesPage-lQJGZ_-t.js.map → CapabilitiesPage-BMNNTa0D.js.map} +1 -1
  81. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js → CollapsibleSection-W9F9lziT.js} +2 -2
  82. package/dashboard/dist/assets/{CollapsibleSection-CHWP0WI6.js.map → CollapsibleSection-W9F9lziT.js.map} +1 -1
  83. package/dashboard/dist/assets/ConfirmDeleteModal-BUh-Dzba.js +2 -0
  84. package/dashboard/dist/assets/{ConfirmDeleteModal-C0x0HcHX.js.map → ConfirmDeleteModal-BUh-Dzba.js.map} +1 -1
  85. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js → CopyableId-B1mxKfVb.js} +2 -2
  86. package/dashboard/dist/assets/{CopyableId-uot2mE_g.js.map → CopyableId-B1mxKfVb.js.map} +1 -1
  87. package/dashboard/dist/assets/CountdownTimer-lkv_7msa.js +2 -0
  88. package/dashboard/dist/assets/{CountdownTimer-TXsRlTU4.js.map → CountdownTimer-lkv_7msa.js.map} +1 -1
  89. package/dashboard/dist/assets/{CredentialsPage-BKxS-1sA.js → CredentialsPage-DyOgfnPB.js} +2 -2
  90. package/dashboard/dist/assets/CredentialsPage-DyOgfnPB.js.map +1 -0
  91. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js → CronLabel-geum95dj.js} +2 -2
  92. package/dashboard/dist/assets/{CronLabel-Bd2G0Rap.js.map → CronLabel-geum95dj.js.map} +1 -1
  93. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js +2 -0
  94. package/dashboard/dist/assets/CustomDurationPicker-ClufO2ew.js.map +1 -0
  95. package/dashboard/dist/assets/DataTable-BTu2AaEl.js +2 -0
  96. package/dashboard/dist/assets/DataTable-BTu2AaEl.js.map +1 -0
  97. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js → DropZone-C3hOjJtC.js} +2 -2
  98. package/dashboard/dist/assets/{DropZone-DNDEgMpJ.js.map → DropZone-C3hOjJtC.js.map} +1 -1
  99. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js → ElapsedCell-DFOW9T4b.js} +2 -2
  100. package/dashboard/dist/assets/{ElapsedCell-g7GO7f8L.js.map → ElapsedCell-DFOW9T4b.js.map} +1 -1
  101. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js +20 -0
  102. package/dashboard/dist/assets/EscalationListSchemaPage-_IhqXIQu.js.map +1 -0
  103. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js +9 -0
  104. package/dashboard/dist/assets/EscalationSchemaPage-BCC7iscN.js.map +1 -0
  105. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js +2 -0
  106. package/dashboard/dist/assets/EscalationsOverview-CvIdOtoP.js.map +1 -0
  107. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js +2 -0
  108. package/dashboard/dist/assets/EventTable-DJWJ7J0m.js.map +1 -0
  109. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js +2 -0
  110. package/dashboard/dist/assets/FilterBar-BR3ztZ8y.js.map +1 -0
  111. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js +2 -0
  112. package/dashboard/dist/assets/GraphInvokePage-Cwn-8Glr.js.map +1 -0
  113. package/dashboard/dist/assets/HomePage-D8RVntg0.js +2 -0
  114. package/dashboard/dist/assets/HomePage-D8RVntg0.js.map +1 -0
  115. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js +2 -0
  116. package/dashboard/dist/assets/ListToolbar-DuoEdVtK.js.map +1 -0
  117. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js +2 -0
  118. package/dashboard/dist/assets/McpOverview-NXKsGiWU.js.map +1 -0
  119. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js +5 -0
  120. package/dashboard/dist/assets/McpQueryDetailPage-BC-iXfIx.js.map +1 -0
  121. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js → McpQueryPage-BPJmFYOY.js} +2 -2
  122. package/dashboard/dist/assets/{McpQueryPage-CsKNXUhb.js.map → McpQueryPage-BPJmFYOY.js.map} +1 -1
  123. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js +2 -0
  124. package/dashboard/dist/assets/McpRunDetailPage-B49nUXEl.js.map +1 -0
  125. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js +2 -0
  126. package/dashboard/dist/assets/McpRunsPage-Ce_XIYpP.js.map +1 -0
  127. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js +2 -0
  128. package/dashboard/dist/assets/NamespacePill-LWvZXt_g.js.map +1 -0
  129. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js +2 -0
  130. package/dashboard/dist/assets/OperationsPage-DI7AQO9f.js.map +1 -0
  131. package/dashboard/dist/assets/OperatorDashboard-DpXjhs-3.js +2 -0
  132. package/dashboard/dist/assets/{OperatorDashboard-_axS17fp.js.map → OperatorDashboard-DpXjhs-3.js.map} +1 -1
  133. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js +2 -0
  134. package/dashboard/dist/assets/PageHeader-DvEmMMP6.js.map +1 -0
  135. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js +2 -0
  136. package/dashboard/dist/assets/PageHeaderWithStats-X0eAmu-x.js.map +1 -0
  137. package/dashboard/dist/assets/{PriorityBadge-B4ykBH7f.js → PriorityBadge-CCERr9vQ.js} +2 -2
  138. package/dashboard/dist/assets/PriorityBadge-CCERr9vQ.js.map +1 -0
  139. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js +2 -0
  140. package/dashboard/dist/assets/ProcessDetailPage-DpYSMRj1.js.map +1 -0
  141. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js → ProcessesListPage-CQ9tSw7U.js} +2 -2
  142. package/dashboard/dist/assets/{ProcessesListPage-CoQEi_Su.js.map → ProcessesListPage-CQ9tSw7U.js.map} +1 -1
  143. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js +8 -0
  144. package/dashboard/dist/assets/RoleDetailPage-DKeQKDkW.js.map +1 -0
  145. package/dashboard/dist/assets/RolePill-CWhoLwef.js +2 -0
  146. package/dashboard/dist/assets/RolePill-CWhoLwef.js.map +1 -0
  147. package/dashboard/dist/assets/RolesPage-D-6kIact.js +2 -0
  148. package/dashboard/dist/assets/RolesPage-D-6kIact.js.map +1 -0
  149. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js +2 -0
  150. package/dashboard/dist/assets/RunAsSelector-DzYcpQTm.js.map +1 -0
  151. package/dashboard/dist/assets/StatCard-DBANWIss.js +2 -0
  152. package/dashboard/dist/assets/StatCard-DBANWIss.js.map +1 -0
  153. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js +2 -0
  154. package/dashboard/dist/assets/StatusBadge-BbqghFMi.js.map +1 -0
  155. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js → StickyPagination-BTGfmGV3.js} +2 -2
  156. package/dashboard/dist/assets/{StickyPagination-Cd83AHd_.js.map → StickyPagination-BTGfmGV3.js.map} +1 -1
  157. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js +2 -0
  158. package/dashboard/dist/assets/StreamMessageDetail-DqRpzA_6.js.map +1 -0
  159. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js +2 -0
  160. package/dashboard/dist/assets/SwimlaneTimeline-CA106TYo.js.map +1 -0
  161. package/dashboard/dist/assets/TagInput-CoR4MzsW.js +2 -0
  162. package/dashboard/dist/assets/TagInput-CoR4MzsW.js.map +1 -0
  163. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js → TaskDetailPage-BRg-w2Ev.js} +2 -2
  164. package/dashboard/dist/assets/{TaskDetailPage-DnjhW7qv.js.map → TaskDetailPage-BRg-w2Ev.js.map} +1 -1
  165. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js +2 -0
  166. package/dashboard/dist/assets/TaskQueuePill-Dw3YN8M-.js.map +1 -0
  167. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js → TasksListPage-kB_j9G8o.js} +2 -2
  168. package/dashboard/dist/assets/{TasksListPage-DySfZFgs.js.map → TasksListPage-kB_j9G8o.js.map} +1 -1
  169. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js → TimeAgo-D7dSIY7-.js} +2 -2
  170. package/dashboard/dist/assets/{TimeAgo-BKOl-7Tt.js.map → TimeAgo-D7dSIY7-.js.map} +1 -1
  171. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js +2 -0
  172. package/dashboard/dist/assets/TimestampCell-BZe6bx18.js.map +1 -0
  173. package/dashboard/dist/assets/ToolPill-xX-buQtY.js +2 -0
  174. package/dashboard/dist/assets/ToolPill-xX-buQtY.js.map +1 -0
  175. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js +2 -0
  176. package/dashboard/dist/assets/ToolTestPanel-U3NaF_T_.js.map +1 -0
  177. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js +9 -0
  178. package/dashboard/dist/assets/TopicDetailPage-BpALvXP1.js.map +1 -0
  179. package/dashboard/dist/assets/TopicsPage-Cy3chaca.js +2 -0
  180. package/dashboard/dist/assets/{TopicsPage-5yW63ELl.js.map → TopicsPage-Cy3chaca.js.map} +1 -1
  181. package/dashboard/dist/assets/{UserName-DcXhOSVm.js → UserName-VXM1oHMC.js} +2 -2
  182. package/dashboard/dist/assets/{UserName-DcXhOSVm.js.map → UserName-VXM1oHMC.js.map} +1 -1
  183. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js +2 -0
  184. package/dashboard/dist/assets/WorkflowExecutionPage-BCq2cR1V.js.map +1 -0
  185. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js +2 -0
  186. package/dashboard/dist/assets/WorkflowPill-CQ1AmhlC.js.map +1 -0
  187. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js → WorkflowsDashboard-BbM69MnB.js} +2 -2
  188. package/dashboard/dist/assets/{WorkflowsDashboard-C0Bbrd5M.js.map → WorkflowsDashboard-BbM69MnB.js.map} +1 -1
  189. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js +2 -0
  190. package/dashboard/dist/assets/WorkflowsOverview-D5HthpAW.js.map +1 -0
  191. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js → YamlWorkflowDetailPage-CDDVMYWi.js} +10 -10
  192. package/dashboard/dist/assets/{YamlWorkflowDetailPage-BcbrYhDI.js.map → YamlWorkflowDetailPage-CDDVMYWi.js.map} +1 -1
  193. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js +2 -0
  194. package/dashboard/dist/assets/YamlWorkflowsPage-FFjWwydj.js.map +1 -0
  195. package/dashboard/dist/assets/{agents-CopQ3t5o.js → agents-BwiSNu73.js} +2 -2
  196. package/dashboard/dist/assets/{agents-CopQ3t5o.js.map → agents-BwiSNu73.js.map} +1 -1
  197. package/dashboard/dist/assets/bots-ClgSrxel.js +2 -0
  198. package/dashboard/dist/assets/bots-ClgSrxel.js.map +1 -0
  199. package/dashboard/dist/assets/{capabilities-5JRieYUy.js → capabilities-JUaKsby4.js} +2 -2
  200. package/dashboard/dist/assets/{capabilities-5JRieYUy.js.map → capabilities-JUaKsby4.js.map} +1 -1
  201. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js → controlplane-CuTQ7eUE.js} +2 -2
  202. package/dashboard/dist/assets/{controlplane-B4rT6tIw.js.map → controlplane-CuTQ7eUE.js.map} +1 -1
  203. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js +2 -0
  204. package/dashboard/dist/assets/escalation-columns-CS0c7cAr.js.map +1 -0
  205. package/dashboard/dist/assets/index-BBA4AxmL.js +2 -0
  206. package/dashboard/dist/assets/index-BBA4AxmL.js.map +1 -0
  207. package/dashboard/dist/assets/index-C-8xXyvr.js +63 -0
  208. package/dashboard/dist/assets/index-C-8xXyvr.js.map +1 -0
  209. package/dashboard/dist/assets/index-C1t0YIXC.js +5 -0
  210. package/dashboard/dist/assets/index-C1t0YIXC.js.map +1 -0
  211. package/dashboard/dist/assets/index-C9o2UNhC.js +2 -0
  212. package/dashboard/dist/assets/index-C9o2UNhC.js.map +1 -0
  213. package/dashboard/dist/assets/index-CBj-vstO.js +2 -0
  214. package/dashboard/dist/assets/{index-Dd1RxGNw.js.map → index-CBj-vstO.js.map} +1 -1
  215. package/dashboard/dist/assets/index-CUguKMXZ.js +2 -0
  216. package/dashboard/dist/assets/index-CUguKMXZ.js.map +1 -0
  217. package/dashboard/dist/assets/index-Cavwd8UU.js +6 -0
  218. package/dashboard/dist/assets/index-Cavwd8UU.js.map +1 -0
  219. package/dashboard/dist/assets/index-CnsPBTXL.js +2 -0
  220. package/dashboard/dist/assets/index-CnsPBTXL.js.map +1 -0
  221. package/dashboard/dist/assets/index-CoPWHo_H.js +2 -0
  222. package/dashboard/dist/assets/index-CoPWHo_H.js.map +1 -0
  223. package/dashboard/dist/assets/index-CwQVaa7x.js +2 -0
  224. package/dashboard/dist/assets/index-CwQVaa7x.js.map +1 -0
  225. package/dashboard/dist/assets/index-DSa-6Ux8.js +2 -0
  226. package/dashboard/dist/assets/index-DSa-6Ux8.js.map +1 -0
  227. package/dashboard/dist/assets/index-DeMs_aBT.css +1 -0
  228. package/dashboard/dist/assets/index-Ikj_NTuy.js +5 -0
  229. package/dashboard/dist/assets/index-Ikj_NTuy.js.map +1 -0
  230. package/dashboard/dist/assets/index-Xd1jcHe7.js +2 -0
  231. package/dashboard/dist/assets/index-Xd1jcHe7.js.map +1 -0
  232. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js → knowledge-BHBt-6kW.js} +2 -2
  233. package/dashboard/dist/assets/{knowledge-B9bmoXOe.js.map → knowledge-BHBt-6kW.js.map} +1 -1
  234. package/dashboard/dist/assets/{mcp-DYMFBOFz.js → mcp-CBcz4BCS.js} +2 -2
  235. package/dashboard/dist/assets/{mcp-DYMFBOFz.js.map → mcp-CBcz4BCS.js.map} +1 -1
  236. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js → mcp-query-C4fKTOYo.js} +2 -2
  237. package/dashboard/dist/assets/{mcp-query-wloSpyPM.js.map → mcp-query-C4fKTOYo.js.map} +1 -1
  238. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js → pipelines-CmAAH3B6.js} +2 -2
  239. package/dashboard/dist/assets/{pipelines-DBXX6TEi.js.map → pipelines-CmAAH3B6.js.map} +1 -1
  240. package/dashboard/dist/assets/role-display-Dvo2lDpU.js +2 -0
  241. package/dashboard/dist/assets/role-display-Dvo2lDpU.js.map +1 -0
  242. package/dashboard/dist/assets/task-queues-7-sHKPsN.js +2 -0
  243. package/dashboard/dist/assets/task-queues-7-sHKPsN.js.map +1 -0
  244. package/dashboard/dist/assets/{tasks-CD3-C7tP.js → tasks-BAEsqcz2.js} +2 -2
  245. package/dashboard/dist/assets/{tasks-CD3-C7tP.js.map → tasks-BAEsqcz2.js.map} +1 -1
  246. package/dashboard/dist/assets/{topics-D8pKi6zA.js → topics-CY0pJ6_o.js} +2 -2
  247. package/dashboard/dist/assets/{topics-D8pKi6zA.js.map → topics-CY0pJ6_o.js.map} +1 -1
  248. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js → useEventHooks-BlpwRvHO.js} +2 -2
  249. package/dashboard/dist/assets/{useEventHooks-DV9pLDOW.js.map → useEventHooks-BlpwRvHO.js.map} +1 -1
  250. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js → useNamespace-CoNUlZ6Z.js} +2 -2
  251. package/dashboard/dist/assets/{useNamespace-DykYhZY9.js.map → useNamespace-CoNUlZ6Z.js.map} +1 -1
  252. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js → useYamlActivityEvents-8GUn5Wie.js} +2 -2
  253. package/dashboard/dist/assets/{useYamlActivityEvents-By044UAv.js.map → useYamlActivityEvents-8GUn5Wie.js.map} +1 -1
  254. package/dashboard/dist/assets/{users-mI9goDjj.js → users-uGtDRGxR.js} +2 -2
  255. package/dashboard/dist/assets/{users-mI9goDjj.js.map → users-uGtDRGxR.js.map} +1 -1
  256. package/dashboard/dist/assets/{vendor-icons-ihWGa7_d.js → vendor-icons-DKCAtTJ9.js} +135 -130
  257. package/dashboard/dist/assets/vendor-icons-DKCAtTJ9.js.map +1 -0
  258. package/dashboard/dist/assets/{workflows-DCUilz68.js → workflows-DoX-AtHN.js} +2 -2
  259. package/dashboard/dist/assets/{workflows-DCUilz68.js.map → workflows-DoX-AtHN.js.map} +1 -1
  260. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js → yaml-workflows-DM3jVem2.js} +2 -2
  261. package/dashboard/dist/assets/{yaml-workflows-DWNMP1PT.js.map → yaml-workflows-DM3jVem2.js.map} +1 -1
  262. package/dashboard/dist/index.html +3 -3
  263. package/docs/api/http/escalations.md +15 -1
  264. package/docs/api/http/roles.md +2 -0
  265. package/docs/design-principles.md +234 -0
  266. package/docs/hitl/design.md +228 -0
  267. package/docs/hitl/form.md +21 -1
  268. package/docs/hitl/iframe.md +1 -1
  269. package/docs/hitl/x-lt-display.md +56 -0
  270. package/docs/hitl/x-lt-layout.md +20 -1
  271. package/docs/hitl/x-lt-list-schema.md +8 -1
  272. package/docs/hitl/x-lt-widget.md +23 -0
  273. package/docs/hitl-guide.md +4 -2
  274. package/docs/schema-enforcement.md +149 -0
  275. package/package.json +1 -1
  276. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js +0 -16
  277. package/dashboard/dist/assets/AgentConfigPage-CqmtYBbC.js.map +0 -1
  278. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js +0 -4
  279. package/dashboard/dist/assets/AgentDetailPage-oYLBrN74.js.map +0 -1
  280. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js +0 -2
  281. package/dashboard/dist/assets/AgentsPage-CHczRx5N.js.map +0 -1
  282. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js +0 -2
  283. package/dashboard/dist/assets/AvailableEscalationsPage-DDVuivEE.js.map +0 -1
  284. package/dashboard/dist/assets/CapabilitiesPage-lQJGZ_-t.js +0 -2
  285. package/dashboard/dist/assets/ConfirmDeleteModal-C0x0HcHX.js +0 -2
  286. package/dashboard/dist/assets/CountdownTimer-TXsRlTU4.js +0 -2
  287. package/dashboard/dist/assets/CredentialsPage-BKxS-1sA.js.map +0 -1
  288. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js +0 -2
  289. package/dashboard/dist/assets/CustomDurationPicker-j4bBrDJ6.js.map +0 -1
  290. package/dashboard/dist/assets/DataTable-Byn3oyT9.js +0 -2
  291. package/dashboard/dist/assets/DataTable-Byn3oyT9.js.map +0 -1
  292. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js +0 -20
  293. package/dashboard/dist/assets/EscalationListSchemaPage-CIJ-OgVC.js.map +0 -1
  294. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js +0 -9
  295. package/dashboard/dist/assets/EscalationSchemaPage-C7dHgG8e.js.map +0 -1
  296. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js +0 -2
  297. package/dashboard/dist/assets/EscalationsOverview-D8NrATg2.js.map +0 -1
  298. package/dashboard/dist/assets/EventTable-DBV1P2ME.js +0 -2
  299. package/dashboard/dist/assets/EventTable-DBV1P2ME.js.map +0 -1
  300. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js +0 -2
  301. package/dashboard/dist/assets/FilterBar-B5Vk5tBF.js.map +0 -1
  302. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js +0 -2
  303. package/dashboard/dist/assets/GraphInvokePage-DbHvggQ_.js.map +0 -1
  304. package/dashboard/dist/assets/HomePage-BpexnDO_.js +0 -2
  305. package/dashboard/dist/assets/HomePage-BpexnDO_.js.map +0 -1
  306. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js +0 -2
  307. package/dashboard/dist/assets/ListToolbar-KC6LGtKP.js.map +0 -1
  308. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js +0 -2
  309. package/dashboard/dist/assets/McpOverview-BDZC9Hvl.js.map +0 -1
  310. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js +0 -5
  311. package/dashboard/dist/assets/McpQueryDetailPage-CXhgX1pS.js.map +0 -1
  312. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js +0 -2
  313. package/dashboard/dist/assets/McpRunDetailPage-BM3mUSlH.js.map +0 -1
  314. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js +0 -2
  315. package/dashboard/dist/assets/McpRunsPage-f5hDbpLo.js.map +0 -1
  316. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js +0 -2
  317. package/dashboard/dist/assets/NamespacePill-C4u6Go1W.js.map +0 -1
  318. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js +0 -2
  319. package/dashboard/dist/assets/OperationsPage-D37cZ8Qh.js.map +0 -1
  320. package/dashboard/dist/assets/OperatorDashboard-_axS17fp.js +0 -2
  321. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js +0 -2
  322. package/dashboard/dist/assets/PageHeader-Bxa1XFz0.js.map +0 -1
  323. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js +0 -2
  324. package/dashboard/dist/assets/PageHeaderWithStats-D_sO0MqJ.js.map +0 -1
  325. package/dashboard/dist/assets/PriorityBadge-B4ykBH7f.js.map +0 -1
  326. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js +0 -2
  327. package/dashboard/dist/assets/ProcessDetailPage-D8pAWUXx.js.map +0 -1
  328. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js +0 -8
  329. package/dashboard/dist/assets/RoleDetailPage-ufbypNNR.js.map +0 -1
  330. package/dashboard/dist/assets/RolePill-DLwmVMam.js +0 -2
  331. package/dashboard/dist/assets/RolePill-DLwmVMam.js.map +0 -1
  332. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js +0 -2
  333. package/dashboard/dist/assets/RolesPage-CxpXm4Sw.js.map +0 -1
  334. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js +0 -2
  335. package/dashboard/dist/assets/RunAsSelector-BebF8Lib.js.map +0 -1
  336. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js +0 -2
  337. package/dashboard/dist/assets/SlidePanel-BDVDuwIf.js.map +0 -1
  338. package/dashboard/dist/assets/StatCard-DrdlUeQz.js +0 -2
  339. package/dashboard/dist/assets/StatCard-DrdlUeQz.js.map +0 -1
  340. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js +0 -2
  341. package/dashboard/dist/assets/StatusBadge-CEQMRmSQ.js.map +0 -1
  342. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js +0 -2
  343. package/dashboard/dist/assets/StreamMessageDetail-BIXbrZM0.js.map +0 -1
  344. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js +0 -2
  345. package/dashboard/dist/assets/SwimlaneTimeline-CC5qZjYo.js.map +0 -1
  346. package/dashboard/dist/assets/TagInput-C2gi47M8.js +0 -2
  347. package/dashboard/dist/assets/TagInput-C2gi47M8.js.map +0 -1
  348. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js +0 -2
  349. package/dashboard/dist/assets/TaskQueuePill-BPP0Almh.js.map +0 -1
  350. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js +0 -2
  351. package/dashboard/dist/assets/TimestampCell-DGOsba-A.js.map +0 -1
  352. package/dashboard/dist/assets/ToolPill-D74TkYB-.js +0 -2
  353. package/dashboard/dist/assets/ToolPill-D74TkYB-.js.map +0 -1
  354. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js +0 -2
  355. package/dashboard/dist/assets/ToolTestPanel-Bez6OyRL.js.map +0 -1
  356. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js +0 -9
  357. package/dashboard/dist/assets/TopicDetailPage-BHccgkU_.js.map +0 -1
  358. package/dashboard/dist/assets/TopicsPage-5yW63ELl.js +0 -2
  359. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js +0 -2
  360. package/dashboard/dist/assets/WorkflowExecutionPage-CDDLled5.js.map +0 -1
  361. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js +0 -2
  362. package/dashboard/dist/assets/WorkflowPill-Fjc2q9U9.js.map +0 -1
  363. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js +0 -2
  364. package/dashboard/dist/assets/WorkflowsOverview-D8MkSMex.js.map +0 -1
  365. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js +0 -2
  366. package/dashboard/dist/assets/YamlWorkflowsPage-9Ki54d-9.js.map +0 -1
  367. package/dashboard/dist/assets/bots-CAYJYL9E.js +0 -2
  368. package/dashboard/dist/assets/bots-CAYJYL9E.js.map +0 -1
  369. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js +0 -2
  370. package/dashboard/dist/assets/escalation-columns-BbS5X61l.js.map +0 -1
  371. package/dashboard/dist/assets/index-B68A3v-S.js +0 -2
  372. package/dashboard/dist/assets/index-B68A3v-S.js.map +0 -1
  373. package/dashboard/dist/assets/index-BAi89Xpm.js +0 -2
  374. package/dashboard/dist/assets/index-BAi89Xpm.js.map +0 -1
  375. package/dashboard/dist/assets/index-BJ0jjFsI.js +0 -5
  376. package/dashboard/dist/assets/index-BJ0jjFsI.js.map +0 -1
  377. package/dashboard/dist/assets/index-BOJMUk4F.js +0 -2
  378. package/dashboard/dist/assets/index-BOJMUk4F.js.map +0 -1
  379. package/dashboard/dist/assets/index-BrgYykPV.js +0 -2
  380. package/dashboard/dist/assets/index-BrgYykPV.js.map +0 -1
  381. package/dashboard/dist/assets/index-BxgtIqvl.js +0 -2
  382. package/dashboard/dist/assets/index-BxgtIqvl.js.map +0 -1
  383. package/dashboard/dist/assets/index-C0cHXaX-.css +0 -1
  384. package/dashboard/dist/assets/index-CDHDoHYz.js +0 -6
  385. package/dashboard/dist/assets/index-CDHDoHYz.js.map +0 -1
  386. package/dashboard/dist/assets/index-CUZJHXew.js +0 -2
  387. package/dashboard/dist/assets/index-CUZJHXew.js.map +0 -1
  388. package/dashboard/dist/assets/index-D5n_e59T.js +0 -2
  389. package/dashboard/dist/assets/index-D5n_e59T.js.map +0 -1
  390. package/dashboard/dist/assets/index-DIgiIoou.js +0 -63
  391. package/dashboard/dist/assets/index-DIgiIoou.js.map +0 -1
  392. package/dashboard/dist/assets/index-Dd1RxGNw.js +0 -2
  393. package/dashboard/dist/assets/index-iOb3sGsC.js +0 -5
  394. package/dashboard/dist/assets/index-iOb3sGsC.js.map +0 -1
  395. package/dashboard/dist/assets/index-mcAkQblr.js +0 -2
  396. package/dashboard/dist/assets/index-mcAkQblr.js.map +0 -1
  397. package/dashboard/dist/assets/vendor-icons-ihWGa7_d.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BxgtIqvl.js","sources":["../../src/pages/admin/controlplane/helpers.ts","../../src/pages/admin/controlplane/useMeshSelection.ts","../../src/pages/admin/controlplane/ThrottleModal.tsx","../../src/pages/admin/controlplane/EmergencyControls.tsx","../../src/pages/admin/controlplane/StreamVolumeChart.tsx","../../src/pages/admin/controlplane/QueueCard.tsx","../../src/pages/admin/controlplane/QuorumFeed.tsx","../../src/pages/admin/controlplane/EngineCluster.tsx","../../src/pages/admin/controlplane/ControlPlaneContent.tsx","../../src/pages/admin/controlplane/ControlPlanePage.tsx"],"sourcesContent":["import type { QuorumProfile } from '../../../api/controlplane';\n\nexport const DURATIONS = [\n { label: '15m', value: '15m' },\n { label: '30m', value: '30m' },\n { label: '1h', value: '1h' },\n { label: '1d', value: '1d' },\n { label: '7d', value: '7d' },\n] as const;\n\nexport type Duration = (typeof DURATIONS)[number]['value'];\n\nexport interface QuorumEvent {\n id: number;\n type: string;\n timestamp: string;\n data: Record<string, unknown>;\n}\n\nexport const EVENT_TYPE_COLORS: Record<string, string> = {\n pong: 'text-status-success',\n ping: 'text-accent',\n throttle: 'text-status-warning',\n job: 'text-purple-400',\n work: 'text-text-secondary',\n activate: 'text-status-error',\n cron: 'text-text-tertiary',\n user: 'text-text-secondary',\n};\n\n/** Human-friendly labels for quorum event types. */\nexport const EVENT_TYPE_LABELS: Record<string, string> = {\n pong: 'roll call',\n ping: 'ping',\n throttle: 'throttle',\n job: 'job',\n work: 'work',\n activate: 'activate',\n cron: 'cron',\n user: 'user',\n};\n\nexport const MAX_EVENTS = 250;\n\nexport function isWorker(p: QuorumProfile): boolean {\n return !!p.worker_topic;\n}\n\nexport function isThrottled(p: QuorumProfile): boolean {\n return typeof p.throttle === 'number' && p.throttle !== 0;\n}\n\nexport function formatThrottleHuman(ms?: number): string {\n if (ms === undefined || ms === 0) return 'Normal';\n if (ms === -1) return 'Paused';\n if (ms >= 86_400_000) return `${(ms / 86_400_000).toFixed(0)}d`;\n if (ms >= 3_600_000) return `${(ms / 3_600_000).toFixed(1)}h`;\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`;\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`;\n return `${ms}ms`;\n}\n\nexport function parseTimestamp(ts?: string): Date | null {\n if (!ts) return null;\n // Handle YYYYMMDDHHMMSS.mmm format (quorum timestamps)\n const match = ts.match(/^(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, y, mo, d, h, mi, s, ms] = match;\n return new Date(`${y}-${mo}-${d}T${h}:${mi}:${s}.${ms}Z`);\n }\n // Fallback to standard Date parsing\n const date = new Date(ts);\n return isNaN(date.getTime()) ? null : date;\n}\n\nexport function formatUptime(inited?: string): string {\n const date = parseTimestamp(inited);\n if (!date) return '--';\n const ms = Date.now() - date.getTime();\n if (ms < 0 || isNaN(ms)) return '--';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ${m % 60}m`;\n const d = Math.floor(h / 24);\n return `${d}d ${h % 24}h`;\n}\n\nexport function formatMemory(total?: string, free?: string): string {\n if (!total || !free) return '—';\n const t = parseFloat(total);\n const f = parseFloat(free);\n if (isNaN(t) || isNaN(f)) return '—';\n return `${(t - f).toFixed(1)} / ${t.toFixed(1)} GB`;\n}\n\nexport function stripStreamPrefix(name: string): string {\n return name.replace(/^hmsh:[^:]+:x:/, '') || '(engine)';\n}\n\n/** Engine streams have no suffix after hmsh:{app}:x: */\nexport function isEngineStream(streamName: string): boolean {\n return stripStreamPrefix(streamName) === '(engine)';\n}\n\n/** Extract a human-friendly label from engine_id like \"controlplane::durable-Hxyz...\" → \"durable\" */\nexport function engineLabel(engineId: string): string {\n // Format: {source}::{name}-{guid}\n const match = engineId.match(/^([^:]+)::(.+?)-[A-Za-z0-9_]{10,}$/);\n if (match) return match[2];\n // Fallback: just truncate\n return engineId.length > 20 ? engineId.slice(0, 20) + '...' : engineId;\n}\n\n/** Extract the source/app prefix from engine_id like \"controlplane::durable-Hxyz...\" → \"controlplane\" */\nexport function engineSource(engineId: string): string {\n const match = engineId.match(/^([^:]+)::/);\n return match?.[1] || '';\n}\n\nexport type NodeFilter = 'all' | 'workers' | 'engines';\n\n/** Known quorum message types published via the bridge. */\nexport const QUORUM_CHANNELS = [\n { key: 'pong', label: 'Roll Call', description: 'Node health check responses' },\n { key: 'ping', label: 'Ping', description: 'Health check broadcasts' },\n { key: 'throttle', label: 'Throttle', description: 'Throttle commands' },\n { key: 'job', label: 'Job', description: 'Job lifecycle events' },\n { key: 'work', label: 'Work', description: 'Worker dispatch events' },\n { key: 'activate', label: 'Activate', description: 'Worker activation' },\n { key: 'cron', label: 'Cron', description: 'Cron schedule triggers' },\n { key: 'user', label: 'User', description: 'User-defined messages' },\n] as const;\n\n/** Typed throttle target with display label and API params. */\nexport interface ThrottleTarget {\n label: string;\n /** API param: topic-based throttle (queues, all engines) */\n topic?: string;\n /** API param: guid-based throttle (single engine/worker) */\n guid?: string;\n /** API param: scope — target engines only, workers only, or both */\n scope?: 'engines' | 'workers' | 'all';\n}\n\nexport const NODE_FILTER_OPTIONS = [\n { value: 'all', label: 'All Nodes' },\n { value: 'workers', label: 'Workers' },\n { value: 'engines', label: 'Engines' },\n] as const;\n\nexport function rowKey(p: QuorumProfile): string {\n return `${p.engine_id}-${p.worker_topic || 'engine'}`;\n}\n\n// ── Queue-level helpers ────────────────────────────────────────────────\n\n/** Group worker profiles by `worker_topic` (engines excluded). */\nexport function groupByQueue(profiles: QuorumProfile[]): Map<string, QuorumProfile[]> {\n const map = new Map<string, QuorumProfile[]>();\n for (const p of profiles) {\n if (!p.worker_topic) continue;\n const q = p.worker_topic;\n if (!map.has(q)) map.set(q, []);\n map.get(q)!.push(p);\n }\n return map;\n}\n\n/** Aggregate `counts` across profiles: 200 = success, 500 = error, all = total. */\nexport function sumCounts(profiles: QuorumProfile[]): { total: number; success: number; errors: number } {\n let total = 0;\n let success = 0;\n let errors = 0;\n for (const p of profiles) {\n if (!p.counts) continue;\n for (const [code, n] of Object.entries(p.counts)) {\n total += n;\n if (code === '200') success += n;\n else if (code === '500') errors += n;\n }\n }\n return { total, success, errors };\n}\n\n/** Sum `stream_depth` across profiles. */\nexport function totalPending(profiles: QuorumProfile[]): number {\n let sum = 0;\n for (const p of profiles) {\n if (typeof p.stream_depth === 'number') sum += p.stream_depth;\n }\n return sum;\n}\n\n/** Derive queue health from member profiles. */\nexport function queueHealth(profiles: QuorumProfile[]): 'healthy' | 'degraded' | 'paused' {\n if (profiles.length === 0) return 'healthy';\n const allPaused = profiles.every((p) => p.throttle === -1);\n if (allPaused) return 'paused';\n const { errors } = sumCounts(profiles);\n if (errors > 0 || profiles.some(isThrottled)) return 'degraded';\n return 'healthy';\n}\n","import { useState, useCallback, useEffect, useMemo } from 'react';\n\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { useThrottle } from '../../../api/controlplane';\nimport { isWorker, rowKey, type ThrottleTarget } from './helpers';\n\ninterface UseMeshSelectionOptions {\n activeAppId: string;\n allProfiles: QuorumProfile[];\n profiles: QuorumProfile[];\n}\n\nexport function useMeshSelection({\n activeAppId,\n allProfiles,\n profiles,\n}: UseMeshSelectionOptions) {\n const throttleMutation = useThrottle();\n\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [throttleModalOpen, setThrottleModalOpen] = useState(false);\n const [throttleTargets, setThrottleTargets] = useState<ThrottleTarget[]>([]);\n\n useEffect(() => { setSelectedIds(new Set()); }, [activeAppId]);\n\n const toggleCheckbox = useCallback((profile: QuorumProfile) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n const key = rowKey(profile);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n\n const toggleAll = useCallback(() => {\n if (selectedIds.size === profiles.length) {\n setSelectedIds(new Set());\n } else {\n setSelectedIds(new Set(profiles.map(rowKey)));\n }\n }, [profiles, selectedIds.size]);\n\n /**\n * Build throttle targets from checkbox selection.\n *\n * Smart grouping:\n * - All nodes selected -> no topic/guid (entire mesh)\n * - All engines selected -> topic = engine stream (all engines)\n * - All workers on a queue selected -> topic = queue (all workers on queue)\n * - Subset of a group -> individual guid targets\n */\n const selectedThrottleTargets = useMemo((): ThrottleTarget[] => {\n const selected = profiles.filter((p) => selectedIds.has(rowKey(p)));\n if (selected.length === 0) return [];\n\n // All nodes -> entire mesh\n if (selected.length === allProfiles.length) {\n return [{ label: 'Entire Mesh' }];\n }\n\n const engines = selected.filter((p) => !isWorker(p));\n const workers = selected.filter(isWorker);\n const targets: ThrottleTarget[] = [];\n\n // Engines — always guid-per-engine, scoped to engines only\n for (const e of engines) {\n targets.push({ label: `Engine ${e.engine_id}`, guid: e.engine_id, scope: 'engines' });\n }\n\n // Workers — topic targets the queue; guid targets a single instance\n const queues = new Map<string, QuorumProfile[]>();\n for (const w of workers) {\n const q = w.worker_topic!;\n if (!queues.has(q)) queues.set(q, []);\n queues.get(q)!.push(w);\n }\n for (const [queue, members] of queues) {\n const allOnQueue = allProfiles.filter((p) => p.worker_topic === queue);\n if (members.length === allOnQueue.length) {\n targets.push({ label: queue, topic: queue });\n } else {\n for (const w of members) {\n targets.push({ label: `${queue} ${w.engine_id}`, guid: w.engine_id });\n }\n }\n }\n\n return targets;\n }, [profiles, allProfiles, selectedIds]);\n\n // ── Throttle handlers ─────────────────────────────────────────\n const handleBulkThrottle = (ms: number) => {\n const targets = throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets;\n for (const t of targets) {\n throttleMutation.mutate({\n appId: activeAppId,\n throttle: ms,\n ...(t.topic ? { topic: t.topic } : {}),\n ...(t.guid ? { guid: t.guid } : {}),\n ...(t.scope ? { scope: t.scope } : {}),\n });\n }\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n const handleRowClick = (profile: QuorumProfile, scope?: 'engines' | 'workers') => {\n const label = isWorker(profile)\n ? `${profile.worker_topic} ${profile.engine_id}`\n : `Engine ${profile.engine_id}`;\n setThrottleTargets([{\n label,\n guid: profile.engine_id,\n scope: scope || (isWorker(profile) ? 'workers' : 'engines'),\n }]);\n setThrottleModalOpen(true);\n };\n\n const handleBulkThrottleOpen = () => {\n setThrottleTargets(selectedThrottleTargets);\n setThrottleModalOpen(true);\n };\n\n const handleResumeThrottle = (profile: QuorumProfile, scope?: 'engines' | 'workers') => {\n const resolvedScope = scope || (isWorker(profile) ? 'workers' : 'engines');\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, guid: profile.engine_id, scope: resolvedScope });\n };\n\n const handleResumeQueue = (queueName: string) => {\n throttleMutation.mutate({ appId: activeAppId, throttle: 0, topic: queueName });\n };\n\n const handleQueueThrottle = (queueName: string) => {\n setThrottleTargets([{ label: queueName, topic: queueName }]);\n setThrottleModalOpen(true);\n };\n\n const closeThrottleModal = () => {\n setThrottleModalOpen(false);\n setThrottleTargets([]);\n };\n\n return {\n selectedIds,\n setSelectedIds,\n toggleCheckbox,\n toggleAll,\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleBulkThrottleOpen,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n };\n}\n","import { useState } from 'react';\nimport { Modal } from '../../../components/common/modal/Modal';\nimport type { ThrottleTarget } from './helpers';\n\ninterface ThrottleModalProps {\n open: boolean;\n onClose: () => void;\n targets: ThrottleTarget[];\n onApply: (ms: number) => void;\n isPending: boolean;\n}\n\nconst PRESETS = [\n { label: 'Resume', ms: 0 },\n { label: '0.5s', ms: 500 },\n { label: '1s', ms: 1000 },\n { label: '5s', ms: 5000 },\n { label: '30s', ms: 30000 },\n { label: 'Pause', ms: -1 },\n];\n\nfunction TargetPill({ target }: { target: ThrottleTarget }) {\n const isMesh = target.label === 'Entire Mesh';\n const isEngine = target.label === 'All Engines' || target.label.startsWith('Engine ');\n const color = isMesh\n ? 'bg-status-error/10 text-status-error'\n : isEngine\n ? 'bg-status-active/10 text-status-active'\n : 'bg-accent/[0.06] text-text-secondary';\n const scopeLabel = target.scope === 'engines' ? 'engine only'\n : target.scope === 'workers' ? 'worker only'\n : target.guid ? 'guid' : target.topic ? 'topic' : 'mesh';\n\n return (\n <span className={`inline-flex items-center gap-1.5 px-2 py-0.5 text-[10px] font-medium rounded-lg ${color}`}>\n {target.label}\n <span className=\"text-[8px] opacity-50\">{scopeLabel}</span>\n </span>\n );\n}\n\nexport function ThrottleModal({ open, onClose, targets, onApply, isPending }: ThrottleModalProps) {\n const [seconds, setSeconds] = useState('');\n\n return (\n <Modal open={open} onClose={onClose} title=\"Adjust Throttle\">\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Targets</p>\n <div className=\"flex flex-wrap gap-1.5\">\n {targets.map((t, i) => (\n <TargetPill key={t.guid || t.topic || i} target={t} />\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">Presets</p>\n <div className=\"flex flex-wrap gap-2\">\n {PRESETS.map((p) => (\n <button\n key={p.label}\n onClick={() => onApply(p.ms)}\n disabled={isPending}\n className={`px-3 py-1.5 text-xs rounded transition-colors ${\n p.ms === -1\n ? 'bg-status-error/10 text-status-error hover:bg-status-error/20'\n : p.ms === 0\n ? 'bg-status-success/10 text-status-success hover:bg-status-success/20'\n : 'bg-surface-sunken text-text-secondary hover:bg-surface-hover'\n } disabled:opacity-50`}\n >\n {p.label}\n </button>\n ))}\n </div>\n </div>\n\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-2\">\n Custom delay (seconds)\n </p>\n <div className=\"flex items-center gap-3\">\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={seconds}\n onChange={(e) => setSeconds(e.target.value)}\n placeholder=\"e.g. 2.5\"\n className=\"input text-xs py-1.5 px-3 w-28\"\n />\n <button\n onClick={() => {\n const s = parseFloat(seconds);\n if (isNaN(s) || s < 0) return;\n onApply(Math.round(s * 1000));\n }}\n disabled={isPending}\n className=\"btn-primary text-xs py-1.5 px-4 disabled:opacity-50\"\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n </Modal>\n );\n}\n","import { useState, useCallback } from 'react';\nimport { CirclePause, Play, Loader2 } from 'lucide-react';\nimport { useControlPlaneApps, useThrottle } from '../../../api/controlplane';\n\ntype Scope = 'engines' | 'workers' | 'all';\n\nexport function EmergencyControls() {\n const { data: appsData } = useControlPlaneApps();\n const throttle = useThrottle();\n const [confirming, setConfirming] = useState<{ ms: number; scope: Scope } | null>(null);\n const [inflight, setInflight] = useState(false);\n\n const apps = appsData?.apps ?? [];\n\n const applyAll = useCallback(async (ms: number, scope: Scope = 'all') => {\n if (apps.length === 0) return;\n setInflight(true);\n\n const results = await Promise.allSettled(\n apps.map((app) => throttle.mutateAsync({\n appId: app.appId,\n throttle: ms,\n ...(scope !== 'all' ? { scope } : {}),\n })),\n );\n\n const failed = results.filter((r) => r.status === 'rejected').length;\n if (failed > 0) {\n console.error(`Emergency throttle: ${failed}/${results.length} apps failed`);\n }\n\n setInflight(false);\n setConfirming(null);\n }, [apps, throttle]);\n\n const scopeLabel = (scope: Scope) =>\n scope === 'engines' ? 'engines' : scope === 'workers' ? 'workers' : 'everything';\n\n if (confirming) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-status-error\">\n Pause {scopeLabel(confirming.scope)}?\n </span>\n <button\n onClick={() => applyAll(confirming.ms, confirming.scope)}\n disabled={inflight}\n className=\"px-2.5 py-1 text-xs rounded-md bg-status-error text-white hover:bg-status-error/90 transition-colors disabled:opacity-50\"\n >\n {inflight ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : 'Confirm'}\n </button>\n <button\n onClick={() => setConfirming(null)}\n disabled={inflight}\n className=\"px-2.5 py-1 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n Cancel\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setConfirming({ ms: -1, scope: 'all' })}\n disabled={inflight}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-error/80 hover:text-status-error hover:bg-status-error/10 transition-colors disabled:opacity-50\"\n title=\"Pause all engines and workers\"\n >\n <CirclePause className=\"w-3.5 h-3.5\" />\n Pause All\n </button>\n <button\n onClick={() => applyAll(0)}\n disabled={inflight}\n className=\"flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md text-status-success/80 hover:text-status-success hover:bg-status-success/10 transition-colors disabled:opacity-50\"\n title=\"Resume all engines and workers\"\n >\n {inflight ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Play className=\"w-3.5 h-3.5\" />}\n Resume All\n </button>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { stripStreamPrefix, type NodeFilter } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface StreamVolumeChartProps {\n byStream: StreamEntry[];\n onNodeFilter?: (filter: NodeFilter) => void;\n onQueueFilter?: (queue: string) => void;\n}\n\nexport function StreamVolumeChart({ byStream, onNodeFilter }: StreamVolumeChartProps) {\n const [animated, setAnimated] = useState(false);\n\n useEffect(() => {\n setAnimated(false);\n const raf = requestAnimationFrame(() => setAnimated(true));\n return () => cancelAnimationFrame(raf);\n }, [byStream]);\n\n if (byStream.length === 0) {\n return <p className=\"text-xs text-text-tertiary py-4 text-center\">No activity in this period</p>;\n }\n\n const engineStreams = byStream.filter((s) => s.stream_type === 'engine');\n const workerStreams = byStream.filter((s) => s.stream_type === 'worker');\n const maxCount = Math.max(...byStream.map((s) => s.count));\n\n const renderBar = (s: StreamEntry) => {\n const pct = maxCount > 0 ? (s.count / maxCount) * 100 : 0;\n const isEngine = s.stream_type === 'engine';\n const label = isEngine ? '(all engines)' : stripStreamPrefix(s.stream_name);\n const barColor = isEngine ? 'bg-status-active/70' : 'bg-accent/60';\n const labelColor = isEngine ? 'text-status-active' : 'text-text-tertiary';\n return (\n <div key={`${s.stream_type}-${s.stream_name}`} className=\"flex items-center gap-3\">\n <span\n className={`text-[9px] font-mono ${labelColor} w-36 truncate text-right shrink-0`}\n title={s.stream_name}\n >\n {label}\n </span>\n <div className=\"flex-1 h-4 bg-surface-sunken rounded overflow-hidden\">\n <div\n className={`h-full ${barColor} rounded transition-all duration-500 ease-out`}\n style={{ width: animated ? `${pct}%` : '0%' }}\n />\n </div>\n <span className=\"text-[10px] font-mono tabular-nums text-text-secondary w-12 text-right shrink-0\">\n {s.count.toLocaleString()}\n </span>\n </div>\n );\n };\n\n const labelCls = 'text-[9px] uppercase tracking-widest font-semibold mb-1 cursor-pointer hover:underline';\n\n return (\n <div className=\"space-y-1.5\">\n {engineStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-status-active/70 hover:text-status-active`}\n onClick={() => onNodeFilter?.('engines')}\n >\n Engine Stream\n </p>\n {engineStreams.map(renderBar)}\n {workerStreams.length > 0 && <div className=\"h-2\" />}\n </>\n )}\n {workerStreams.length > 0 && (\n <>\n <p\n className={`${labelCls} text-accent/70 hover:text-accent`}\n onClick={() => onNodeFilter?.('workers')}\n >\n Worker Streams\n </p>\n {workerStreams.map(renderBar)}\n </>\n )}\n </div>\n );\n}\n","import { useMemo } from 'react';\nimport { ChevronRight, Gauge, CirclePlay, Activity, Clock, Inbox } from 'lucide-react';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { DataTable } from '../../../components/common/data/DataTable';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { isThrottled, formatThrottleHuman, rowKey, stripStreamPrefix, queueHealth, totalPending, sumCounts } from './helpers';\nimport type { Column } from '../../../components/common/data/DataTable';\nimport type { Duration } from './helpers';\n\ninterface StreamEntry {\n stream_type: 'engine' | 'worker';\n stream_name: string;\n count: number;\n}\n\ninterface QueueCardProps {\n queue: string;\n workers: QuorumProfile[];\n expanded: boolean;\n onToggle: (queue: string) => void;\n onWorkerClick: (p: QuorumProfile) => void;\n onResumeThrottle: (p: QuorumProfile) => void;\n onQueueThrottle: (queue: string) => void;\n onResumeQueue: (queue: string) => void;\n byStream: StreamEntry[];\n activeDuration: Duration;\n}\n\nexport function QueueCard({\n queue,\n workers,\n expanded,\n onToggle,\n onWorkerClick,\n onResumeThrottle,\n onQueueThrottle,\n onResumeQueue,\n byStream,\n activeDuration,\n}: QueueCardProps) {\n const streamCount = useMemo(() => {\n const match = byStream.find(\n (s) => s.stream_type === 'worker' && stripStreamPrefix(s.stream_name) === queue,\n );\n return match?.count ?? 0;\n }, [byStream, queue]);\n\n const health = useMemo(() => queueHealth(workers), [workers]);\n const pending = useMemo(() => totalPending(workers), [workers]);\n const { errors } = useMemo(() => sumCounts(workers), [workers]);\n\n const healthDot = health === 'paused'\n ? 'bg-status-error'\n : health === 'degraded'\n ? 'bg-status-warning'\n : 'bg-status-success';\n\n const sortedWorkers = useMemo(() =>\n [...workers].sort((a, b) => sumCounts([b]).total - sumCounts([a]).total),\n [workers],\n );\n\n const columns = useMemo((): Column<QuorumProfile>[] => [\n {\n key: 'engine_id',\n label: 'Router',\n render: (row) => {\n const label = row.engine_id.replace(/^[^:]+::/, '').replace(/-[A-Za-z0-9_]{10,}$/, '') || row.engine_id;\n const source = row.engine_id.match(/^([^:]+)::/)?.[1] || '';\n return (\n <div className=\"flex items-center gap-2\" title={row.engine_id}>\n <span className=\"text-xs text-text-secondary truncate max-w-[180px]\">{label}</span>\n {source && <span className=\"text-[9px] text-text-tertiary/50\">{source}</span>}\n </div>\n );\n },\n },\n {\n key: 'processed',\n label: 'Processed',\n render: (row) => {\n const c = sumCounts([row]);\n return <span className=\"text-xs font-mono tabular-nums text-text-tertiary\">{c.total > 0 ? c.total.toLocaleString() : '--'}</span>;\n },\n className: 'w-24',\n },\n {\n key: 'throttle',\n label: 'Throttle',\n render: (row) => {\n const t = row.throttle;\n if (t === -1) return <span className=\"text-xs text-status-error font-medium\">Paused</span>;\n if (t && t > 0) return <span className=\"text-xs text-status-warning font-medium\">{formatThrottleHuman(t)}</span>;\n return <span className=\"text-xs text-text-tertiary\">0</span>;\n },\n className: 'w-24',\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {isThrottled(row) && (\n <RowAction\n icon={CirclePlay}\n title=\"Resume (remove throttle)\"\n onClick={() => onResumeThrottle(row)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n <RowAction\n icon={Gauge}\n title=\"Adjust throttle\"\n onClick={() => onWorkerClick(row)}\n />\n </RowActionGroup>\n ),\n className: 'w-16',\n },\n ], [onWorkerClick, onResumeThrottle]);\n\n return (\n <div>\n <button\n onClick={() => onToggle(queue)}\n className=\"group/row relative flex items-center gap-3 w-full py-2 hover:bg-surface-hover transition-colors text-left rounded\"\n >\n <span className={`w-2 h-2 rounded-full dot-ring shrink-0 ${healthDot}`} title={health} />\n <ChevronRight\n className={`w-3.5 h-3.5 text-text-tertiary/50 transition-transform duration-200 ${expanded ? 'rotate-90' : ''}`}\n strokeWidth={2}\n />\n <TaskQueuePill queue={queue} size=\"sm\" />\n\n <span className=\"flex-1\" />\n\n {errors > 0 && (\n <span className=\"text-[10px] text-status-error font-medium mr-2\">\n {errors} errors\n </span>\n )}\n\n {pending > 0 && (\n <span className=\"flex items-center gap-1 text-[10px] text-status-warning w-20\">\n <Inbox className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n <span className=\"font-mono tabular-nums\">{pending.toLocaleString()}</span>\n </span>\n )}\n\n <span className={`flex items-center gap-1 text-xs w-24 ${workers.some(isThrottled) ? 'text-status-warning' : 'text-text-tertiary'}`}>\n <Activity className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n <span className=\"font-mono tabular-nums\">{workers.length}</span>\n <span>workers</span>\n </span>\n\n <span className=\"flex items-center gap-1 text-xs font-mono text-text-tertiary w-28 justify-end mr-16\">\n {streamCount > 0 ? (\n <>\n <Clock className=\"w-3 h-3 shrink-0\" strokeWidth={1.5} />\n {streamCount.toLocaleString()} in {activeDuration}\n </>\n ) : (\n <span className=\"text-text-tertiary/40\">—</span>\n )}\n </span>\n\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 opacity-0 group-hover/row:opacity-100 transition-opacity flex items-center gap-2\">\n {workers.some(isThrottled) && (\n <CirclePlay\n className=\"w-4 h-4 text-text-tertiary hover:text-status-success\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onResumeQueue(queue);\n }}\n />\n )}\n <Gauge\n className=\"w-4 h-4 text-text-tertiary hover:text-accent\"\n strokeWidth={1.5}\n onClick={(e) => {\n e.stopPropagation();\n onQueueThrottle(queue);\n }}\n />\n </span>\n </button>\n\n <Collapsible open={expanded}>\n <div className=\"ml-6\">\n <DataTable\n columns={columns}\n data={sortedWorkers}\n keyFn={rowKey}\n onRowClick={onWorkerClick}\n emptyMessage=\"No workers\"\n inline\n />\n </div>\n </Collapsible>\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { Radio, Settings, Eraser, Code } from 'lucide-react';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport { useEventSubscription } from '../../../hooks/useEventContext';\nimport {\n EVENT_TYPE_COLORS,\n EVENT_TYPE_LABELS,\n QUORUM_CHANNELS,\n MAX_EVENTS,\n formatThrottleHuman,\n type QuorumEvent,\n} from './helpers';\n\nlet eventCounter = 0;\n\n// ── Human-readable event summaries ─────────────────────────────────────────\n\nfunction humanizeEvent(event: QuorumEvent): string {\n const d = event.data || {};\n const topic = d.topic ? String(d.topic) : '';\n const guid = d.guid ? String(d.guid).slice(0, 8) : '';\n\n switch (event.type) {\n case 'pong':\n return topic\n ? `Worker ${guid}... on \"${topic}\" responded`\n : `Engine ${guid}... responded`;\n case 'ping':\n return 'Roll call broadcast';\n case 'throttle': {\n const ms = d.throttle as number;\n const target = topic ? `queue \"${topic}\"` : guid ? `node ${guid}...` : 'all nodes';\n return `${formatThrottleHuman(ms)} applied to ${target}`;\n }\n case 'job':\n return `Job ${guid ? guid + '...' : ''} ${d.status || 'updated'}`;\n case 'work':\n return `Dispatched to \"${topic || 'worker'}\" ${guid ? '(' + guid + '...)' : ''}`;\n case 'activate':\n return `Worker \"${topic || 'unknown'}\" activated`;\n case 'cron':\n return `Cron triggered ${topic ? '\"' + topic + '\"' : ''}`;\n default:\n return topic || guid || event.type;\n }\n}\n\n// ── Aggregate display items ───────────────────────────────────────────────\n\ninterface DisplayItem {\n kind: 'single';\n event: QuorumEvent;\n}\n\ninterface DisplayGroup {\n kind: 'group';\n type: string;\n count: number;\n firstTimestamp: string;\n lastTimestamp: string;\n events: QuorumEvent[];\n}\n\ntype FeedItem = DisplayItem | DisplayGroup;\n\n/** Collapse consecutive pong events into a summary row. */\nfunction collapseEvents(events: QuorumEvent[]): FeedItem[] {\n const items: FeedItem[] = [];\n let i = 0;\n while (i < events.length) {\n const evt = events[i];\n // Group consecutive pong events\n if (evt.type === 'pong') {\n let j = i + 1;\n while (j < events.length && events[j].type === 'pong') j++;\n const batch = events.slice(i, j);\n if (batch.length >= 3) {\n items.push({\n kind: 'group',\n type: 'pong',\n count: batch.length,\n firstTimestamp: batch[batch.length - 1].timestamp,\n lastTimestamp: batch[0].timestamp,\n events: batch,\n });\n } else {\n for (const e of batch) items.push({ kind: 'single', event: e });\n }\n i = j;\n } else {\n items.push({ kind: 'single', event: evt });\n i++;\n }\n }\n return items;\n}\n\n// ── Event row ───────────────────────────────────────────────────────────────\n\nfunction QuorumEventRow({ event }: { event: QuorumEvent }) {\n const [expanded, setExpanded] = useState(false);\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(event.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS[event.type] || 'text-text-tertiary'} bg-surface-sunken whitespace-nowrap shrink-0`}>\n {EVENT_TYPE_LABELS[event.type] || event.type}\n </span>\n <span className=\"text-[9px] text-text-secondary flex-1 min-w-0 truncate\">\n {humanizeEvent(event)}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"pb-2\">\n <JsonViewer data={event.data} />\n </div>\n </Collapsible>\n </div>\n );\n}\n\n/** Collapsed group row for consecutive pong events. */\nfunction QuorumGroupRow({ group }: { group: DisplayGroup }) {\n const [expanded, setExpanded] = useState(false);\n const engines = group.events.filter((e) => !e.data?.topic).length;\n const workers = group.count - engines;\n\n return (\n <div className=\"border-b border-surface-border/50 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 py-1.5 w-full text-left hover:bg-surface-hover/50 transition-colors\"\n >\n <span className=\"text-[9px] font-mono text-text-tertiary whitespace-nowrap tabular-nums shrink-0\">\n {new Date(group.lastTimestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })}\n </span>\n <span className={`text-[9px] font-medium px-1 py-0.5 rounded ${EVENT_TYPE_COLORS.pong} bg-surface-sunken whitespace-nowrap shrink-0`}>\n roll call\n </span>\n <span className=\"text-[9px] text-text-secondary flex-1 min-w-0 truncate\">\n {group.count} nodes responded\n {engines > 0 && workers > 0\n ? ` (${engines} engine${engines !== 1 ? 's' : ''}, ${workers} worker${workers !== 1 ? 's' : ''})`\n : engines > 0\n ? ` (${engines} engine${engines !== 1 ? 's' : ''})`\n : ` (${workers} worker${workers !== 1 ? 's' : ''})`}\n </span>\n <svg\n className={`w-2.5 h-2.5 text-text-tertiary shrink-0 transition-transform duration-150 ${expanded ? 'rotate-180' : ''}`}\n fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n <Collapsible open={expanded}>\n <div className=\"ml-4\">\n {group.events.map((evt) => (\n <QuorumEventRow key={evt.id} event={evt} />\n ))}\n </div>\n </Collapsible>\n </div>\n );\n}\n\n// ── Config panel ────────────────────────────────────────────────────────────\n\ninterface ConfigPanelProps {\n channels: Set<string>;\n onToggle: (key: string) => void;\n customFilter: string;\n onCustomFilterChange: (v: string) => void;\n}\n\nfunction ConfigPanel({ channels, onToggle, customFilter, onCustomFilterChange }: ConfigPanelProps) {\n return (\n <div className=\"space-y-3 pb-3 border-b border-surface-border mb-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Channels\n </p>\n <p className=\"text-[9px] text-text-tertiary\">\n Unchecked channels are dropped before buffering\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {QUORUM_CHANNELS.map((ch) => (\n <label key={ch.key} className=\"flex items-center gap-2 cursor-pointer py-0.5\">\n <input\n type=\"checkbox\"\n checked={channels.has(ch.key)}\n onChange={() => onToggle(ch.key)}\n className=\"w-3 h-3 rounded border-border accent-accent\"\n />\n <span className=\"text-[10px] text-text-secondary\" title={ch.description}>\n {ch.label}\n </span>\n </label>\n ))}\n </div>\n <div>\n <p className=\"text-[9px] font-semibold uppercase tracking-widest text-text-tertiary mb-1\">\n Text Filter\n </p>\n <input\n type=\"text\"\n value={customFilter}\n onChange={(e) => onCustomFilterChange(e.target.value)}\n placeholder=\"pong\"\n className=\"input text-[10px] font-mono py-1 px-2 w-full\"\n />\n <p className=\"text-[9px] text-text-tertiary mt-1\">\n Filter by event type, e.g. <span className=\"font-mono\">pong</span>, <span className=\"font-mono\">throttle</span>, or any text in the event data.\n </p>\n </div>\n </div>\n );\n}\n\n// ── Feed panel ──────────────────────────────────────────────────────────────\n\ninterface QuorumFeedProps {\n bridgeActive: boolean;\n}\n\nexport function QuorumFeed({ bridgeActive }: QuorumFeedProps) {\n const [showConfig, setShowConfig] = useState(false);\n const [showRaw, setShowRaw] = useState(false);\n const [events, setEvents] = useState<QuorumEvent[]>([]);\n const [channels, setChannels] = useState<Set<string>>(\n () => new Set(QUORUM_CHANNELS.map((c) => c.key)),\n );\n const [customFilter, setCustomFilter] = useState('');\n\n // Keep a ref to channels so the event callback reads the latest without re-subscribing\n const channelsRef = useRef(channels);\n useEffect(() => { channelsRef.current = channels; }, [channels]);\n const customFilterRef = useRef(customFilter);\n useEffect(() => { customFilterRef.current = customFilter; }, [customFilter]);\n\n const toggleChannel = (key: string) => {\n setChannels((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n // Subscribe to NATS and filter on intake (before buffer)\n useEventSubscription('lt.events.mesh.>', useCallback((raw: any) => {\n const type = raw.type?.replace('mesh.', '') || 'unknown';\n\n // Channel filter: drop events for unchecked channels at intake\n if (!channelsRef.current.has(type)) return;\n\n // Text filter: if set, match against type or stringified data\n const cf = customFilterRef.current;\n if (cf) {\n const haystack = `${type} ${JSON.stringify(raw.data || raw)}`.toLowerCase();\n if (!haystack.includes(cf.toLowerCase())) return;\n }\n\n setEvents((prev) => {\n const next = [{\n id: ++eventCounter,\n type,\n timestamp: raw.timestamp || new Date().toISOString(),\n data: raw.data || raw,\n }, ...prev];\n return next.slice(0, MAX_EVENTS);\n });\n }, []));\n\n const handleClear = () => setEvents([]);\n\n return (\n <div className=\"border-l border-surface-border pl-6 pt-4 min-h-[300px] sticky top-14 self-start max-h-[calc(100vh-8rem)] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Event Stream\n </p>\n <Radio className={`w-3 h-3 ${bridgeActive ? 'text-status-success animate-pulse' : 'text-text-tertiary'}`} />\n <span className=\"text-[9px] text-text-tertiary\">\n {bridgeActive ? 'Live' : '...'}\n </span>\n\n <span className=\"ml-auto flex items-center gap-1\">\n <button\n onClick={() => { setShowConfig((v) => !v); setShowRaw(false); }}\n className={`p-1 rounded transition-colors ${showConfig ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"Configure channels\"\n >\n <Settings className=\"w-3.5 h-3.5\" />\n </button>\n <button\n onClick={() => { setShowRaw((v) => !v); setShowConfig(false); }}\n className={`p-1 rounded transition-colors ${showRaw ? 'text-accent bg-accent/10' : 'text-text-tertiary hover:text-text-primary'}`}\n title=\"View raw JSON\"\n >\n <Code className=\"w-3.5 h-3.5\" />\n </button>\n {events.length > 0 && (\n <button\n onClick={handleClear}\n className=\"p-1 rounded text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Clear events\"\n >\n <Eraser className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </span>\n </div>\n\n {/* Config panel (animated) */}\n <Collapsible open={showConfig}>\n <ConfigPanel\n channels={channels}\n onToggle={toggleChannel}\n customFilter={customFilter}\n onCustomFilterChange={setCustomFilter}\n />\n </Collapsible>\n\n {/* Raw JSON view */}\n <Collapsible open={showRaw}>\n <div className=\"pb-3 border-b border-surface-border mb-3\">\n <pre className=\"text-[9px] font-mono text-text-tertiary bg-surface-sunken rounded-lg p-3 max-h-[50vh] overflow-auto whitespace-pre-wrap\">\n {JSON.stringify(events.slice(0, 50), null, 2)}\n </pre>\n </div>\n </Collapsible>\n\n {/* Event count */}\n {events.length > 0 && (\n <p className=\"text-[9px] text-text-tertiary mb-2\">\n {events.length} events\n </p>\n )}\n\n {/* Event list */}\n <div className=\"flex-1 overflow-y-auto\">\n {events.length === 0 ? (\n <p className=\"text-xs text-text-tertiary py-6 text-center\">\n {bridgeActive ? 'Waiting for events...' : 'Subscribing...'}\n </p>\n ) : (\n collapseEvents(events).map((item, idx) =>\n item.kind === 'group' ? (\n <QuorumGroupRow key={`grp-${idx}`} group={item} />\n ) : (\n <QuorumEventRow key={item.event.id} event={item.event} />\n ),\n )\n )}\n </div>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { Zap, CirclePause, ChevronRight, Gauge } from 'lucide-react';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { QuorumProfile } from '../../../api/controlplane';\nimport { sumCounts, formatUptime, engineLabel, engineSource, isThrottled, formatThrottleHuman } from './helpers';\n\ninterface EngineClusterProps {\n engines: QuorumProfile[];\n onThrottle: (profile: QuorumProfile) => void;\n isLoading: boolean;\n}\n\nfunction categorize(engines: QuorumProfile[]) {\n const active: QuorumProfile[] = [];\n const idle: QuorumProfile[] = [];\n const paused: QuorumProfile[] = [];\n\n for (const e of engines) {\n if (isThrottled(e)) {\n paused.push(e);\n } else if (e.is_scout || sumCounts([e]).total > 0) {\n active.push(e);\n } else {\n idle.push(e);\n }\n }\n\n // Sort active by processed descending; scout first if tied\n active.sort((a, b) => {\n if (a.is_scout && !b.is_scout) return -1;\n if (!a.is_scout && b.is_scout) return 1;\n return sumCounts([b]).total - sumCounts([a]).total;\n });\n\n idle.sort((a, b) => engineLabel(a.engine_id).localeCompare(engineLabel(b.engine_id)));\n paused.sort((a, b) => engineLabel(a.engine_id).localeCompare(engineLabel(b.engine_id)));\n\n return { active, idle, paused };\n}\n\nfunction EngineRow({ engine, isFirst, onThrottle }: {\n engine: QuorumProfile;\n isFirst?: boolean;\n onThrottle: (p: QuorumProfile) => void;\n}) {\n const label = engineLabel(engine.engine_id);\n const source = engineSource(engine.engine_id);\n const counts = sumCounts([engine]);\n const pending = engine.stream_depth ?? 0;\n const paused = isThrottled(engine);\n\n return (\n <div className=\"group/row flex items-center gap-3 py-2 hover:bg-surface-hover/50 transition-colors rounded px-1\">\n {paused ? (\n <CirclePause className=\"w-3.5 h-3.5 text-status-warning shrink-0\" strokeWidth={1.5} />\n ) : (\n <Zap className={`w-3.5 h-3.5 shrink-0 ${counts.total > 0 || engine.is_scout ? 'text-status-success' : 'text-text-tertiary/30'}`} strokeWidth={1.5} />\n )}\n\n <span className={`${isFirst ? 'text-base font-medium' : 'text-xs'} text-text-primary truncate max-w-[180px]`} title={engine.engine_id}>\n {label}\n </span>\n {source && <span className=\"text-[10px] text-text-tertiary/50\">{source}</span>}\n\n {engine.is_scout && (\n <span className=\"text-[9px] text-status-warning uppercase tracking-widest\">scout</span>\n )}\n\n <span className=\"flex-1\" />\n\n {paused && (\n <span className=\"text-[10px] text-status-warning\">{engine.throttle === -1 ? 'Paused' : formatThrottleHuman(engine.throttle)}</span>\n )}\n\n {counts.total > 0 && (\n <span className=\"text-[10px] font-mono tabular-nums text-text-tertiary w-16 text-right\">{counts.total.toLocaleString()}</span>\n )}\n\n {pending > 0 && (\n <span className={`text-[10px] font-mono tabular-nums w-14 text-right ${pending > 100 ? 'text-status-warning' : 'text-text-tertiary/50'}`}>{pending.toLocaleString()} q</span>\n )}\n\n <span className=\"text-[10px] font-mono text-text-tertiary/40 w-12 text-right\">{formatUptime(engine.inited)}</span>\n\n <span className=\"opacity-0 group-hover/row:opacity-100 transition-opacity\">\n <button\n onClick={(e) => { e.stopPropagation(); onThrottle(engine); }}\n className=\"text-text-tertiary hover:text-accent transition-colors\"\n title={paused ? 'Resume / adjust throttle' : 'Pause / throttle'}\n >\n <Gauge className=\"w-3.5 h-3.5\" strokeWidth={1.5} />\n </button>\n </span>\n </div>\n );\n}\n\nfunction CollapsibleGroup({ label, engines, onThrottle }: {\n label: string;\n engines: QuorumProfile[];\n onThrottle: (p: QuorumProfile) => void;\n}) {\n const [open, setOpen] = useState(false);\n if (engines.length === 0) return null;\n\n return (\n <div className=\"mt-1\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 text-[10px] text-text-tertiary hover:text-text-secondary transition-colors py-1\"\n >\n <ChevronRight className={`w-3 h-3 transition-transform duration-200 ${open ? 'rotate-90' : ''}`} strokeWidth={2} />\n {engines.length} {label}\n </button>\n <Collapsible open={open}>\n <div className=\"ml-1\">\n {engines.map((e) => (\n <EngineRow key={e.engine_id} engine={e} onThrottle={onThrottle} />\n ))}\n </div>\n </Collapsible>\n </div>\n );\n}\n\nexport function EngineCluster({ engines, onThrottle, isLoading }: EngineClusterProps) {\n const { active, idle, paused } = useMemo(() => categorize(engines), [engines]);\n\n if (isLoading) {\n return <p className=\"text-xs text-text-tertiary\">Discovering engines...</p>;\n }\n\n if (engines.length === 0) {\n return <p className=\"text-xs text-text-tertiary\">No engines found.</p>;\n }\n\n // All paused — no active processor\n if (active.length === 0 && idle.length === 0) {\n return (\n <div>\n <div className=\"flex items-center gap-3 py-2\">\n <CirclePause className=\"w-4 h-4 text-status-error shrink-0\" strokeWidth={1.5} />\n <span className=\"text-base text-status-error font-medium\">All {engines.length} engines paused</span>\n </div>\n <p className=\"text-[10px] text-text-tertiary ml-7\">Messages are accumulating. Resume at least one engine to restore processing.</p>\n <div className=\"ml-1 mt-2\">\n {paused.map((e) => (\n <EngineRow key={e.engine_id} engine={e} onThrottle={onThrottle} />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div>\n {/* Active engines — shown individually */}\n {active.map((e, i) => (\n <EngineRow key={e.engine_id} engine={e} isFirst={i === 0} onThrottle={onThrottle} />\n ))}\n\n {/* Idle — collapsed */}\n <CollapsibleGroup label=\"idle\" engines={idle} onThrottle={onThrottle} />\n\n {/* Paused — collapsed */}\n <CollapsibleGroup label=\"paused\" engines={paused} onThrottle={onThrottle} />\n </div>\n );\n}\n","import { CollapsibleSection } from '../../../components/common/layout/CollapsibleSection';\nimport { StreamVolumeChart } from './StreamVolumeChart';\nimport { QueueCard } from './QueueCard';\nimport { QuorumFeed } from './QuorumFeed';\nimport { EngineCluster } from './EngineCluster';\nimport type { Duration } from './helpers';\n\ninterface ControlPlaneContentProps {\n collapsed: Record<string, boolean>;\n toggleSection: (key: string) => void;\n activeDuration: Duration;\n streamStats: { byStream: Array<any> } | undefined;\n isLoading: boolean;\n queueMap: Map<string, Array<any>>;\n expandedQueues: Set<string>;\n toggleQueue: (queue: string) => void;\n allQueuesExpanded: boolean;\n toggleAllQueues: () => void;\n handleRowClick: (profile: any) => void;\n handleResumeThrottle: (profile: any) => void;\n handleQueueThrottle: (queue: string) => void;\n handleResumeQueue: (queue: string) => void;\n engines: Array<any>;\n bridgeActive: boolean;\n}\n\nexport function ControlPlaneContent({\n collapsed,\n toggleSection,\n activeDuration,\n streamStats,\n isLoading,\n queueMap,\n expandedQueues,\n toggleQueue,\n allQueuesExpanded,\n toggleAllQueues,\n handleRowClick,\n handleResumeThrottle,\n handleQueueThrottle,\n handleResumeQueue,\n engines,\n bridgeActive,\n}: ControlPlaneContentProps) {\n return (\n <div className=\"grid grid-cols-1 lg:grid-cols-[1fr_340px] gap-6\">\n <div className=\"flex flex-col gap-12 mt-10\">\n {/* Stream Volume */}\n <CollapsibleSection\n title={`Message Volume (${activeDuration})`}\n sectionKey=\"volume\"\n isCollapsed={!!collapsed.volume}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <StreamVolumeChart\n byStream={streamStats?.byStream ?? []}\n onNodeFilter={() => {}}\n onQueueFilter={() => {}}\n />\n </CollapsibleSection>\n\n {/* Engine Routers — nervous system, shown first */}\n <CollapsibleSection\n title={`Engine Routers (${engines.length})`}\n sectionKey=\"engines\"\n isCollapsed={!!collapsed.engines}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7\"\n >\n <EngineCluster\n engines={engines}\n onThrottle={handleRowClick}\n isLoading={isLoading}\n />\n </CollapsibleSection>\n\n {/* Worker Routers */}\n <CollapsibleSection\n title=\"Worker Routers\"\n sectionKey=\"queues\"\n isCollapsed={!!collapsed.queues}\n onToggle={toggleSection}\n contentClassName=\"mt-4 ml-7 flex flex-col gap-0\"\n >\n {isLoading ? (\n <p className=\"text-xs text-text-tertiary\">Discovering mesh nodes...</p>\n ) : queueMap.size === 0 ? (\n <p className=\"text-xs text-text-tertiary\">No worker routers found. Click \"Roll Call\" to discover.</p>\n ) : (\n <>\n <div className=\"flex justify-end mb-2\">\n <button onClick={toggleAllQueues} className=\"text-[10px] text-accent hover:underline\">\n {allQueuesExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n </div>\n {[...queueMap.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([queue, qWorkers]) => (\n <QueueCard\n key={queue}\n queue={queue}\n workers={qWorkers}\n expanded={expandedQueues.has(queue)}\n onToggle={toggleQueue}\n onWorkerClick={handleRowClick}\n onResumeThrottle={handleResumeThrottle}\n onQueueThrottle={handleQueueThrottle}\n onResumeQueue={handleResumeQueue}\n byStream={streamStats?.byStream ?? []}\n activeDuration={activeDuration}\n />\n ))}\n </>\n )}\n </CollapsibleSection>\n </div>\n\n <QuorumFeed bridgeActive={bridgeActive} />\n </div>\n );\n}\n","import { useMemo, useState, useCallback, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { RefreshCw } from 'lucide-react';\nimport { PageHeaderWithStats, type InlineStat } from '../../../components/common/layout/PageHeaderWithStats';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { useNamespace } from '../../../hooks/useNamespace';\nimport {\n useRollCall,\n useStreamStats,\n useSubscribeMesh,\n} from '../../../api/controlplane';\nimport {\n DURATIONS,\n isWorker,\n isThrottled,\n groupByQueue,\n type Duration,\n} from './helpers';\nimport { useMeshSelection } from './useMeshSelection';\nimport { ThrottleModal } from './ThrottleModal';\nimport { EmergencyControls } from './EmergencyControls';\nimport { ControlPlaneContent } from './ControlPlaneContent';\n\nexport function ControlPlanePage() {\n const { namespace, available } = useNamespace();\n\n const { filters, setFilter } = useFilterParams({\n filters: { app_id: '', duration: '1h' },\n });\n\n const activeAppId = filters.app_id || namespace;\n const activeDuration = (filters.duration || '1h') as Duration;\n\n const subscribeMesh = useSubscribeMesh();\n\n const REFRESH_INTERVAL = 60_000;\n\n const { data: rollCallData, isLoading, error: rollCallError, refetch, isFetching } = useRollCall(activeAppId, REFRESH_INTERVAL);\n const { data: streamStats } = useStreamStats(activeAppId, activeDuration, undefined, REFRESH_INTERVAL);\n\n // ── All profiles (sorted) ───────────────────────────────────\n const allProfiles = useMemo(() => {\n const raw = rollCallData?.profiles ?? [];\n return [...raw].sort((a, b) => {\n const ta = a.worker_topic || a.stream || '';\n const tb = b.worker_topic || b.stream || '';\n if (!a.worker_topic && b.worker_topic) return -1;\n if (a.worker_topic && !b.worker_topic) return 1;\n return ta.localeCompare(tb);\n });\n }, [rollCallData?.profiles]);\n\n // ── Derived data ──────────────────────────────────────────────\n const engines = useMemo(() => allProfiles.filter((p) => !isWorker(p)), [allProfiles]);\n const workers = useMemo(() => allProfiles.filter(isWorker), [allProfiles]);\n const queueMap = useMemo(() => groupByQueue(allProfiles), [allProfiles]);\n const throttledCount = allProfiles.filter(isThrottled).length;\n\n const appOptions = useMemo(() => {\n const ids = new Set(available);\n if (activeAppId) ids.add(activeAppId);\n return [...ids].sort().map((id) => ({ value: id, label: id }));\n }, [available, activeAppId]);\n\n // ── Deep-link: auto-expand a queue from ?queue= param ──────────\n const [searchParams] = useSearchParams();\n const deepLinkQueue = searchParams.get('queue');\n\n // ── Queue card expand/collapse state ───────────────────────────\n const [expandedQueues, setExpandedQueues] = useState<Set<string>>(\n () => deepLinkQueue ? new Set([deepLinkQueue]) : new Set(),\n );\n const toggleQueue = useCallback((queue: string) => {\n setExpandedQueues((prev) => {\n const closing = prev.has(queue);\n const next = closing ? new Set<string>() : new Set([queue]);\n // Sync URL — add or remove ?queue= param\n const params = new URLSearchParams(window.location.search);\n if (closing) {\n params.delete('queue');\n } else {\n params.set('queue', queue);\n }\n const qs = params.toString();\n window.history.pushState(null, '', `${window.location.pathname}${qs ? `?${qs}` : ''}`);\n return next;\n });\n }, []);\n const allQueuesExpanded = queueMap.size > 0 && [...queueMap.keys()].every((q) => expandedQueues.has(q));\n const toggleAllQueues = useCallback(() => {\n if (allQueuesExpanded) setExpandedQueues(new Set());\n else setExpandedQueues(new Set(queueMap.keys()));\n }, [allQueuesExpanded, queueMap]);\n\n // ── Section collapse state (persisted) ─────────────────────────\n const STORAGE_KEY = 'lt:controlplane:collapsed';\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>(() => {\n try {\n const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');\n // When deep-linking to a queue, ensure Worker Routers section is open\n if (deepLinkQueue) saved.queues = false;\n return saved;\n } catch { return {}; }\n });\n const toggleSection = useCallback((key: string) => {\n setCollapsed((prev) => {\n const next = { ...prev, [key]: !prev[key] };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n return next;\n });\n }, []);\n\n // ── Selection + throttle logic ─────────────────────────────\n const {\n throttleModalOpen,\n throttleTargets,\n selectedThrottleTargets,\n throttleMutation,\n handleBulkThrottle,\n handleRowClick,\n handleResumeThrottle,\n handleResumeQueue,\n handleQueueThrottle,\n closeThrottleModal,\n } = useMeshSelection({ activeAppId, allProfiles, profiles: allProfiles });\n\n // ── Header stats ──────────────────────────────────────────────\n const headerStats = useMemo((): InlineStat[] => {\n const stats: InlineStat[] = [\n { label: 'Engines', value: engines.length, dotClass: 'bg-status-active' },\n { label: 'Workers', value: workers.length, dotClass: 'bg-text-secondary' },\n { label: 'Topics', value: queueMap.size },\n ];\n if (throttledCount > 0) {\n stats.push({ label: 'Throttled', value: throttledCount, dotClass: 'bg-status-warning' });\n }\n return stats;\n }, [engines.length, workers.length, queueMap.size, throttledCount]);\n\n // ── Quorum bridge ────────────────────────────────────────────\n const [bridgeActive, setBridgeActive] = useState(false);\n\n const handleStartBridge = useCallback(() => {\n subscribeMesh.mutate({ appId: activeAppId }, {\n onSuccess: () => setBridgeActive(true),\n });\n }, [activeAppId, subscribeMesh]);\n\n useEffect(() => {\n if (!bridgeActive && activeAppId) {\n handleStartBridge();\n }\n }, [activeAppId]); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <div>\n <PageHeaderWithStats\n title=\"Routers\"\n docsHash=\"#docs:dashboard.md:task-queues\"\n stats={headerStats}\n actions={<EmergencyControls />}\n />\n\n <FilterBar\n actions={\n <div className=\"flex items-center gap-1\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setFilter('duration', d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n activeDuration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n }\n >\n <FilterSelect\n label=\"Application\"\n value={filters.app_id}\n onChange={(v) => setFilter('app_id', v)}\n options={appOptions}\n />\n <button\n onClick={() => refetch()}\n disabled={isFetching}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-tertiary hover:text-text-primary transition-colors disabled:opacity-50\"\n >\n <RefreshCw className={`w-3.5 h-3.5 ${isFetching ? 'animate-spin' : ''}`} />\n Roll Call\n </button>\n </FilterBar>\n\n {/* Error banner */}\n {rollCallError && (\n <div className=\"mb-6 px-4 py-3 rounded bg-status-error/10 border border-status-error/20\">\n <p className=\"text-xs text-status-error font-medium\">\n {rollCallError.message === 'Session expired'\n ? 'Session expired — please log in again.'\n : `Failed to load mesh data: ${rollCallError.message}`}\n </p>\n </div>\n )}\n\n <ControlPlaneContent\n collapsed={collapsed}\n toggleSection={toggleSection}\n activeDuration={activeDuration}\n streamStats={streamStats}\n isLoading={isLoading}\n queueMap={queueMap}\n expandedQueues={expandedQueues}\n toggleQueue={toggleQueue}\n allQueuesExpanded={allQueuesExpanded}\n toggleAllQueues={toggleAllQueues}\n handleRowClick={handleRowClick}\n handleResumeThrottle={handleResumeThrottle}\n handleQueueThrottle={handleQueueThrottle}\n handleResumeQueue={handleResumeQueue}\n engines={engines}\n bridgeActive={bridgeActive}\n />\n\n <ThrottleModal\n open={throttleModalOpen}\n onClose={closeThrottleModal}\n targets={throttleTargets.length > 0 ? throttleTargets : selectedThrottleTargets}\n onApply={handleBulkThrottle}\n isPending={throttleMutation.isPending}\n />\n </div>\n );\n}\n"],"names":["DURATIONS","EVENT_TYPE_COLORS","EVENT_TYPE_LABELS","MAX_EVENTS","isWorker","p","isThrottled","formatThrottleHuman","ms","parseTimestamp","ts","match","y","mo","d","h","mi","s","date","formatUptime","inited","m","stripStreamPrefix","name","engineLabel","engineId","engineSource","QUORUM_CHANNELS","rowKey","groupByQueue","profiles","map","q","sumCounts","total","success","errors","code","n","totalPending","sum","queueHealth","useMeshSelection","activeAppId","allProfiles","throttleMutation","useThrottle","selectedIds","setSelectedIds","useState","throttleModalOpen","setThrottleModalOpen","throttleTargets","setThrottleTargets","useEffect","toggleCheckbox","useCallback","profile","prev","next","key","toggleAll","selectedThrottleTargets","useMemo","selected","engines","workers","targets","e","queues","w","queue","members","allOnQueue","t","scope","label","resolvedScope","queueName","PRESETS","TargetPill","target","isMesh","isEngine","color","scopeLabel","jsxs","jsx","ThrottleModal","open","onClose","onApply","isPending","seconds","setSeconds","Modal","i","EmergencyControls","appsData","useControlPlaneApps","throttle","confirming","setConfirming","inflight","setInflight","apps","applyAll","results","app","failed","r","Loader2","CirclePause","Play","StreamVolumeChart","byStream","onNodeFilter","animated","setAnimated","raf","engineStreams","workerStreams","maxCount","renderBar","pct","barColor","labelColor","labelCls","Fragment","QueueCard","expanded","onToggle","onWorkerClick","onResumeThrottle","onQueueThrottle","onResumeQueue","activeDuration","streamCount","health","pending","healthDot","sortedWorkers","a","b","columns","row","source","_a","c","RowActionGroup","RowAction","CirclePlay","Gauge","ChevronRight","TaskQueuePill","Inbox","Activity","Clock","Collapsible","DataTable","eventCounter","humanizeEvent","event","topic","guid","collapseEvents","events","items","evt","j","batch","QuorumEventRow","setExpanded","JsonViewer","QuorumGroupRow","group","ConfigPanel","channels","customFilter","onCustomFilterChange","ch","QuorumFeed","bridgeActive","showConfig","setShowConfig","showRaw","setShowRaw","setEvents","setChannels","setCustomFilter","channelsRef","useRef","customFilterRef","toggleChannel","useEventSubscription","raw","type","cf","handleClear","Radio","v","Settings","Code","Eraser","item","idx","categorize","active","idle","paused","EngineRow","engine","isFirst","onThrottle","counts","Zap","CollapsibleGroup","setOpen","EngineCluster","isLoading","ControlPlaneContent","collapsed","toggleSection","streamStats","queueMap","expandedQueues","toggleQueue","allQueuesExpanded","toggleAllQueues","handleRowClick","handleResumeThrottle","handleQueueThrottle","handleResumeQueue","CollapsibleSection","qWorkers","ControlPlanePage","namespace","available","useNamespace","filters","setFilter","useFilterParams","subscribeMesh","useSubscribeMesh","REFRESH_INTERVAL","rollCallData","rollCallError","refetch","isFetching","useRollCall","useStreamStats","ta","tb","throttledCount","appOptions","ids","id","searchParams","useSearchParams","deepLinkQueue","setExpandedQueues","closing","params","qs","STORAGE_KEY","setCollapsed","saved","handleBulkThrottle","closeThrottleModal","headerStats","stats","setBridgeActive","handleStartBridge","PageHeaderWithStats","FilterBar","FilterSelect","RefreshCw"],"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: 37 99 235;--lt-accent-hover: 29 78 216;--lt-accent-muted: 147 197 253;--lt-accent-faint: 219 234 254;--lt-surface-hover: 239 246 255;--lt-surface-sunken: 235 243 255;--lt-field: 248 251 255;--lt-field-focus: 236 243 254;--lt-surface-border: 166 196 245;--lt-text-primary: 10 16 38;--lt-text-secondary: 28 64 176;--lt-text-tertiary: 58 102 214;--lt-text-quaternary: 110 147 230;--lt-heading: 29 78 216}[data-theme=blue]{--lt-logo: 24 116 240}[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-sunken: 242 237 250;--lt-field: 250 248 254;--lt-field-focus: 244 238 252;--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-sunken: 249 236 233;--lt-field: 254 250 249;--lt-field-focus: 252 242 240;--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: 22 163 74;--lt-accent-hover: 15 118 55;--lt-accent-muted: 74 222 128;--lt-accent-faint: 187 247 208;--lt-surface-hover: 240 253 244;--lt-surface-sunken: 220 252 231;--lt-field: 249 254 251;--lt-field-focus: 240 253 244;--lt-surface-border: 110 206 148;--lt-text-primary: 2 44 26;--lt-text-secondary: 20 83 45;--lt-text-tertiary: 22 163 74;--lt-text-quaternary: 74 173 104;--lt-heading: 20 83 45}[data-theme=rose]{--lt-accent: 236 72 153;--lt-accent-hover: 219 39 119;--lt-accent-muted: 249 168 212;--lt-accent-faint: 252 231 243;--lt-surface-hover: 253 242 248;--lt-surface-sunken: 251 228 241;--lt-field: 255 250 253;--lt-field-focus: 253 242 248;--lt-surface-border: 244 173 214;--lt-text-primary: 60 8 37;--lt-text-secondary: 131 24 67;--lt-text-tertiary: 190 24 93;--lt-text-quaternary: 216 90 143;--lt-heading: 157 23 77}[data-theme=orange]{--lt-accent: 249 115 22;--lt-accent-hover: 234 88 12;--lt-accent-muted: 254 215 170;--lt-accent-faint: 255 247 237;--lt-surface-hover: 255 251 247;--lt-surface-sunken: 255 248 240;--lt-field: 255 252 249;--lt-field-focus: 255 247 237;--lt-surface-border: 254 215 170;--lt-text-primary: 12 8 3;--lt-text-secondary: 124 45 18;--lt-text-tertiary: 154 80 35;--lt-text-quaternary: 200 135 85;--lt-heading: 234 88 12}:root{--lt-radius-field: .125rem}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}.field,.input,.select,.textarea{border-bottom-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(var(--lt-field) / var(--tw-bg-opacity, 1));padding:.375rem .625rem;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}.field::-moz-placeholder,.input::-moz-placeholder,.select::-moz-placeholder,.textarea::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.field::placeholder,.input::placeholder,.select::placeholder,.textarea::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.field:focus,.input:focus,.select:focus,.textarea:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.\!input{border-bottom-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(var(--lt-field) / var(--tw-bg-opacity, 1));padding:.375rem .625rem;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{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.field,.input,.select,.textarea{border-radius:var(--lt-radius-field)}.\!input{border-radius:var(--lt-radius-field)!important}.field,.input,.textarea,.\!input{width:100%}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;padding-right:1.75rem;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center;background-size:1rem}.textarea{resize:vertical;line-height:1.625}.input-json{width:100%;resize:vertical;border-bottom-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(var(--lt-field) / var(--tw-bg-opacity, 1));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{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.input-json{border-radius:var(--lt-radius-field)}.textarea-quiet{width:100%;resize:none;overflow:hidden;border-bottom-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(var(--lt-field) / var(--tw-bg-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;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}.textarea-quiet::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.textarea-quiet::placeholder{--tw-text-opacity: 1;color:rgb(var(--lt-text-tertiary) / var(--tw-text-opacity, 1))}.textarea-quiet:focus{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--lt-field-focus) / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px}.textarea-quiet{border-radius:var(--lt-radius-field)}.\!label,.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-logo, 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-1\/2{left:50%}.left-2\.5{left:.625rem}.left-4{left:1rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.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-\[100\]{z-index:100}.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-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-2{margin-left:-.5rem;margin-right:-.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-0\.5{margin-top:.125rem;margin-bottom:.125rem}.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}.-mb-16{margin-bottom:-4rem}.-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-0\.5{margin-right:-.125rem}.-mr-10{margin-right:-2.5rem}.-mt-1{margin-top:-.25rem}.-mt-10{margin-top:-2.5rem}.-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-2\.5{margin-bottom:.625rem}.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}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.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-7{margin-top:1.75rem}.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-0\.5{height:.125rem}.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-\[calc\(100vh-5\.25rem\)\]{height:calc(100vh - 5.25rem)}.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-\[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-\[90vh\]{max-height:90vh}.max-h-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-3\.5rem\)\]{max-height:calc(100vh - 3.5rem)}.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-\[40vh\]{min-height:40vh}.min-h-\[48px\]{min-height:48px}.min-h-\[55vh\]{min-height:55vh}.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-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-\[280px\]{width:280px}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[40vw\]{width:40vw}.w-\[420px\]{width:420px}.w-\[440px\]{width:440px}.w-\[48rem\]{width:48rem}.w-\[60px\]{width:60px}.w-\[7px\]{width:7px}.w-\[80\%\]{width:80%}.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-\[16rem\]{min-width:16rem}.min-w-\[180px\]{min-width:180px}.min-w-\[18px\]{min-width:18px}.min-w-\[20rem\]{min-width:20rem}.min-w-\[260px\]{min-width:260px}.min-w-\[6rem\]{min-width:6rem}.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-\[24rem\]{max-width:24rem}.max-w-\[460px\]{max-width:460px}.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-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}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-fixed{table-layout:fixed}.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-x-px{--tw-translate-x: -1px;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-4{--tw-translate-x: 1rem;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-enter_0\.2s_ease-out\]{animation:field-enter .2s ease-out}.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-\[section-enter_0\.25s_ease-out\]{animation:section-enter .25s ease-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}.cursor-zoom-out{cursor:zoom-out}.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}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.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-\[1fr_auto_auto\]{grid-template-columns:1fr auto auto}.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-cols-\[repeat\(auto-fill\,minmax\(15rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(15rem,1fr))}.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-px{gap:1px}.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\.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-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * 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-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * 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))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px * 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-\[0\.125em\]{border-radius:.125em}.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\/15{border-color:rgb(var(--lt-accent) / .15)}.border-accent\/20{border-color:rgb(var(--lt-accent) / .2)}.border-accent\/25{border-color:rgb(var(--lt-accent) / .25)}.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-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200\/60{border-color:#e2e8f099}.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-status-warning\/70{border-color:#f59e0bb3}.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{--tw-border-opacity: 1;border-color:rgb(255 255 255 / 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-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200\/70{background-color:#e2e8f0b3}.bg-slate-200\/80{background-color:#e2e8f0cc}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.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-status-warning\/\[0\.06\]{background-color:#f59e0b0f}.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(var(--lt-surface-sunken) / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/15{background-color:rgb(var(--lt-surface-sunken) / .15)}.bg-surface-sunken\/20{background-color:rgb(var(--lt-surface-sunken) / .2)}.bg-surface-sunken\/30{background-color:rgb(var(--lt-surface-sunken) / .3)}.bg-surface-sunken\/40{background-color:rgb(var(--lt-surface-sunken) / .4)}.bg-surface-sunken\/50{background-color:rgb(var(--lt-surface-sunken) / .5)}.bg-surface-sunken\/60{background-color:rgb(var(--lt-surface-sunken) / .6)}.bg-surface-sunken\/75{background-color:rgb(var(--lt-surface-sunken) / .75)}.bg-surface-sunken\/80{background-color:rgb(var(--lt-surface-sunken) / .8)}.bg-surface-sunken\/90{background-color:rgb(var(--lt-surface-sunken) / .9)}.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-primary\/60{background-color:rgb(var(--lt-text-primary) / .6)}.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-contain{-o-object-fit:contain;object-fit:contain}.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}.p-8{padding:2rem}.\!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-12{padding-left:3rem;padding-right:3rem}.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-3\.5{padding-left:.875rem;padding-right:.875rem}.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-3\.5{padding-top:.875rem;padding-bottom:.875rem}.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-\[2px\]{padding-top:2px;padding-bottom:2px}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-24{padding-bottom:6rem}.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-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.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-1{padding-right:.25rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-5{padding-right:1.25rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pr-8{padding-right:2rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.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-9{padding-top:2.25rem}.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-\[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\.12em\]{letter-spacing:.12em}.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-accent\/90{color:rgb(var(--lt-accent) / .9)}.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-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / 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-white\/70{color:#ffffffb3}.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)}.accent-status-error{accent-color:#DC2626}.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}.opacity-90{opacity:.9}.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)}.invert{--tw-invert: invert(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-enter{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}@keyframes section-enter{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@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\:scale-\[1\.05\]:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;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\:scale-\[1\.5\]:hover{--tw-scale-x: 1.5;--tw-scale-y: 1.5;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:hover{--tw-border-opacity: 1;border-color:rgb(var(--lt-accent) / var(--tw-border-opacity, 1))}.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-slate-300\/60:hover{border-color:#cbd5e199}.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-status-warning\/\[0\.1\]:hover{background-color:#f59e0b1a}.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(var(--lt-surface-sunken) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:rgb(var(--lt-surface-sunken) / .4)}.hover\:bg-surface-sunken\/70:hover{background-color:rgb(var(--lt-surface-sunken) / .7)}.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-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\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / 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\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.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)}.focus-visible\:ring-1:focus-visible{--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-visible\:ring-accent\/40:focus-visible{--tw-ring-color: rgb(var(--lt-accent) / .4)}.focus-visible\:ring-status-warning\/40:focus-visible{--tw-ring-color: rgb(245 158 11 / .4)}.disabled\:cursor-default:disabled{cursor:default}.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:hover .group-hover\:border-accent\/60{border-color:rgb(var(--lt-accent) / .6)}.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-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / 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\/mrow:hover .group-hover\/mrow\: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\/tip:hover .group-hover\/tip\: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-2{grid-template-columns:repeat(2,minmax(0,1fr))}.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\:col-span-3{grid-column:span 3 / span 3}.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-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 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}}
@@ -1,6 +0,0 @@
1
- import{a as c,j as e}from"./vendor-query-B2UbickB.js";import{c as q,u as A,d as D,e as Q}from"./workflows-DCUilz68.js";import{P as B}from"./PageHeader-Bxa1XFz0.js";import{F as z,b as $,a as H}from"./FilterBar-B5Vk5tBF.js";import{W as V}from"./WorkflowPill-Fjc2q9U9.js";import{N as K}from"./NamespacePill-C4u6Go1W.js";import{y as U,ax as G,b as I,ak as X,ay as Y,az as Z,f as ee}from"./vendor-icons-ihWGa7_d.js";import{o as T}from"./index-DIgiIoou.js";import{B as te}from"./BotPicker-2QEIpc-K.js";import{L as se,c as ae,f as re}from"./vendor-react-CXumBFUA.js";import"./bots-CAYJYL9E.js";function ne({configs:t,selectedType:r,onSelect:p,tierMap:w,activeTypes:n}){const[f,j]=c.useState(""),[i,h]=c.useState(null),y=c.useMemo(()=>[...new Set(t.map(s=>s.task_queue).filter(Boolean))].sort(),[t]),a=c.useMemo(()=>{const s=f.toLowerCase().trim(),o=x=>{var u;return!s||x.workflow_type.toLowerCase().includes(s)||((u=x.description)==null?void 0:u.toLowerCase().includes(s))},k=(i?[i]:y).map(x=>({queue:x,workflows:t.filter(u=>u.task_queue===x&&o(u))})).filter(x=>x.workflows.length>0);if(!i){const x=t.filter(u=>!u.task_queue&&o(u));x.length>0&&k.push({queue:"",workflows:x})}return k},[t,y,f,i]);return e.jsxs("div",{children:[e.jsxs(z,{children:[y.length>1&&e.jsx($,{label:"Queue",value:i??"",onChange:s=>h(s||null),options:y.map(s=>({value:s,label:s}))}),e.jsx(H,{label:"Search",value:f,onChange:j,placeholder:`${t.length} workflows…`})]}),a.length===0?e.jsx("p",{className:"text-sm text-text-tertiary py-8 text-center",children:"No workflows match your filter."}):e.jsx("div",{className:"space-y-10",children:a.map(({queue:s,workflows:o})=>e.jsxs("div",{children:[e.jsxs("div",{className:"sticky top-[60px] z-10 bg-surface flex items-center gap-2 py-2 mb-2 border-b border-surface-border",children:[s?e.jsx(U,{className:"w-3 h-3 text-accent",strokeWidth:1.5}):e.jsx(G,{className:"w-3 h-3 text-text-quaternary",strokeWidth:1.5}),e.jsx("h2",{className:"section-h2",children:s||"No Queue"}),e.jsx("span",{className:"text-xs text-text-quaternary",children:o.length})]}),e.jsx("div",{className:"divide-y divide-surface-border/30",children:o.map(d=>e.jsx(oe,{config:d,isSelected:r===d.workflow_type,tier:w.get(d.workflow_type)??"durable",cronActive:(n==null?void 0:n.has(d.workflow_type))??!1,onSelect:p},d.workflow_type))})]},s||"__none__"))})]})}function oe({config:t,isSelected:r,tier:p,cronActive:w,onSelect:n}){const f=p==="certified"?"certified":p==="registered"?"registered":"durable";return e.jsxs("button",{onClick:()=>n(t),className:"group relative w-full text-left py-2 px-3 -mx-3 rounded-md transition-colors duration-150",children:[r&&e.jsx("span",{className:"absolute left-0 top-1 bottom-1 w-0.5 bg-accent rounded-full"}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(V,{type:t.workflow_type,size:"md",variant:f}),t.description&&e.jsx("p",{className:"flex-1 min-w-0 truncate text-[10px] text-text-tertiary group-hover:text-text-secondary transition-colors",children:t.description}),e.jsxs("span",{className:"ml-auto flex items-center gap-2 shrink-0",children:[t.execute_as&&e.jsxs("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 text-[9px] bg-accent/10 text-accent rounded",children:[e.jsx(I,{className:"w-2.5 h-2.5"}),t.execute_as]}),w&&e.jsx("span",{title:"Cron schedule active",children:e.jsx(X,{className:"w-3 h-3 text-status-success/70 shrink-0"})}),e.jsx(K,{namespace:"durable"})]})]})]})}const O=`{
2
- "data": {},
3
- "metadata": {}
4
- }`;function le(t){return typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":t!==null&&typeof t=="object"?"object":"string"}function W(t){if(!t)return[];const r=t.data;return!r||typeof r!="object"?[]:Object.entries(r).map(([p,w])=>({key:p,type:le(w),defaultValue:w}))}function M(t){return{...t}}function J(t,r){return JSON.stringify({data:t,metadata:r},null,2)}function ce({config:t,overrideBot:r,onOverrideChange:p,showOverride:w}){const{user:n}=T(),f=r||t.execute_as;return e.jsxs("div",{className:"bg-surface-sunken rounded-lg px-4 py-3 space-y-3",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium",children:"Running as"}),f&&!r&&e.jsx("span",{className:"text-[9px] text-text-tertiary",children:"configured default"}),r&&e.jsx("span",{className:"text-[9px] text-accent",children:"admin override"})]}),e.jsx("div",{className:"field flex items-center gap-1.5",children:f?e.jsxs(e.Fragment,{children:[e.jsx(I,{className:"w-3.5 h-3.5 text-accent/70 shrink-0"}),e.jsx("span",{className:"text-xs text-text-primary font-mono",children:f})]}):e.jsxs(e.Fragment,{children:[e.jsx(Y,{className:"w-3.5 h-3.5 text-text-tertiary shrink-0"}),e.jsx("span",{className:"text-xs text-text-primary",children:(n==null?void 0:n.displayName)||(n==null?void 0:n.username)||"you"})]})})]}),w&&p&&e.jsxs("div",{children:[e.jsx("label",{className:"text-[10px] text-text-tertiary uppercase tracking-wider font-medium mb-1 block",children:"Override identity"}),e.jsx(te,{selected:r??"",onChange:p,placeholder:t.execute_as?`Default: ${t.execute_as}`:"Invoking user (default)"})]})]})}function ie({selectedConfig:t,isJsonMode:r,hasFormView:p,jsonInput:w,formFields:n,dataFields:f,onJsonChange:j,onToggleMode:i,onUpdateFormField:h,onSetFormFields:y}){return e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[e.jsx("label",{className:"block text-xs text-text-secondary",children:"Envelope"}),e.jsxs("div",{className:"flex items-center gap-3",children:[p&&e.jsx("button",{type:"button",onClick:i,className:"text-[10px] text-accent hover:underline",children:r?"Form view":"JSON view"}),t.envelope_schema?e.jsx("span",{className:"text-[10px] text-accent",children:"Pre-filled from workflow config"}):e.jsx("span",{className:"text-[10px] text-status-warning",children:"No template"})]})]}),!t.envelope_schema&&e.jsx("div",{className:"bg-surface-sunken border border-surface-border rounded px-4 py-3 mb-3",children:e.jsxs("p",{className:"text-xs text-text-secondary leading-relaxed",children:["This workflow has no input template. Edit the JSON directly below, or ",e.jsx(se,{to:"/workflows/registry/new",className:"text-status-success hover:underline",children:"register it"})," in the Workflow Registry with an envelope schema for pre-filled fields and form-based input."]})}),r||!p?e.jsx("textarea",{value:w,onChange:a=>j(a.target.value),className:"input-json",rows:12,spellCheck:!1}):e.jsx("div",{className:"space-y-3",children:f.map(({key:a,type:s})=>{var x,u;const o=n[a],d=typeof o=="string"?o:JSON.stringify(o??(s==="array"?[]:{}),null,2),k=Math.min(20,Math.max(4,((u=(x=d==null?void 0:d.split)==null?void 0:x.call(d,`
5
- `))==null?void 0:u.length)??4));return e.jsxs("div",{children:[e.jsxs("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:[a,e.jsx("span",{className:"ml-2 font-normal normal-case",children:s})]}),s==="boolean"?e.jsxs("select",{value:String(o??!1),onChange:v=>h(a,v.target.value,s),className:"select text-xs w-full",children:[e.jsx("option",{value:"true",children:"true"}),e.jsx("option",{value:"false",children:"false"})]}):s==="object"||s==="array"?e.jsx("textarea",{value:d,onChange:v=>{try{h(a,JSON.parse(v.target.value),s)}catch{y({...n,[a]:v.target.value})}},className:"input-json w-full",rows:k,spellCheck:!1}):e.jsx("input",{type:s==="number"?"number":"text",value:String(o??""),onChange:v=>h(a,v.target.value,s),className:"input text-xs w-full"})]},a)})}),e.jsxs("p",{className:"text-[10px] text-text-tertiary mt-1.5",children:["The envelope wraps your workflow input. ",e.jsx("code",{className:"text-accent/80",children:"data"})," holds workflow-specific fields; ",e.jsx("code",{className:"text-accent/80",children:"metadata"})," is optional context."]})]})}function de({selected:t,executionsPath:r}){const p=ae(),{isSuperAdmin:w,hasRoleType:n}=T(),f=w||n("admin"),j=q(),[i,h]=c.useState(O),[y,a]=c.useState(""),[s,o]=c.useState({}),[d,k]=c.useState(!1),[x,u]=c.useState(""),v=t.certified,[P,m]=c.useState(v),_=c.useMemo(()=>W(t.envelope_schema??null),[t.envelope_schema]),F=_.length>0,E=c.useMemo(()=>{if(!t.envelope_schema)return{};const l=t.envelope_schema.metadata;return l&&typeof l=="object"?l:{}},[t.envelope_schema]);c.useEffect(()=>{var S;a(""),j.reset();const l=sessionStorage.getItem("lt:invoke:prefill");if(l){sessionStorage.removeItem("lt:invoke:prefill"),h(l);try{const N=JSON.parse(l),C=(N==null?void 0:N.data)??N;C&&typeof C=="object"&&o(M(C))}catch{}k(!0),u("");return}const g=t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):O;h(g),(S=t.envelope_schema)!=null&&S.data&&typeof t.envelope_schema.data=="object"?o(M(t.envelope_schema.data)):o({}),k(!W(t.envelope_schema??null).length),u(""),m(v)},[t.workflow_type]);const b=()=>{if(d)try{const l=JSON.parse(i);l.data&&typeof l.data=="object"&&o(M(l.data))}catch{}else h(J(s,E));k(!d)},L=(l,g,S)=>{let N=g;S==="number"?N=g===""?0:Number(g):S==="boolean"&&(N=g==="true"||g===!0);const C={...s,[l]:N};o(C),h(J(C,E))},R=async()=>{a("");let l;try{l=JSON.parse(i)}catch{a("Invalid JSON");return}const{data:g,metadata:S}=l;if(!g||typeof g!="object"){a('Envelope must include a "data" object');return}try{const N={...S??{}};P&&(N.certified=!0),await j.mutateAsync({workflowType:t.workflow_type,data:g,metadata:N,...x?{execute_as:x}:{}}),p(r)}catch{}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-mono font-medium text-text-primary",children:t.workflow_type}),t.description&&e.jsx("p",{className:"text-xs text-text-quaternary mt-1 leading-relaxed",children:t.description})]}),e.jsx(ce,{config:t,overrideBot:x,onOverrideChange:u,showOverride:f}),v&&e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:P,onChange:l=>m(l.target.checked),className:"rounded border-surface-border text-accent focus:ring-accent/30"}),e.jsx(Z,{className:"w-3.5 h-3.5 text-text-tertiary"}),e.jsx("span",{className:"text-xs text-text-secondary",children:"Enable task tracking and escalation routing"})]}),e.jsx(ie,{selectedConfig:t,isJsonMode:d,hasFormView:F,jsonInput:i,formFields:s,dataFields:_,onJsonChange:l=>{h(l),a("")},onToggleMode:b,onUpdateFormField:L,onSetFormFields:o}),y&&e.jsx("p",{className:"text-xs text-status-error",children:y}),j.error&&e.jsx("p",{className:"text-xs text-status-error",children:j.error.message}),j.isSuccess&&e.jsx("p",{className:"text-xs text-status-success",children:"Workflow started"}),e.jsx("button",{onClick:R,disabled:j.isPending,className:"btn-primary",children:j.isPending?"Starting...":"Start Workflow"})]})}function xe(){const[t,r]=re(),{data:p,isLoading:w}=A(),{data:n,isLoading:f}=D(),{data:j}=Q(),i=t.get("type")??"",h=p??[],y=c.useMemo(()=>{const m=new Map;for(const _ of n??[])m.set(_.workflow_type,_.tier??"durable");return m},[n]),a=c.useMemo(()=>{const m=h.filter(b=>b.invocable),_=new Set(h.map(b=>b.workflow_type)),E=(n??[]).filter(b=>b.active&&!_.has(b.workflow_type)).map(b=>({workflow_type:b.workflow_type,task_queue:b.task_queue??"",invocable:!0,certified:!1,description:null,default_role:"reviewer",roles:[],invocation_roles:[],consumes:[],envelope_schema:null,resolver_schema:null,cron_schedule:null,execute_as:null}));return[...m,...E]},[h,n]),s=a.find(m=>m.workflow_type===i),o=new Set((j??[]).filter(m=>m.active).map(m=>m.workflow_type)),d="/workflows/executions",k=c.useRef(null),[x,u]=c.useState(!0),v=c.useRef(i);c.useEffect(()=>{if(v.current!==i){u(!1);const m=setTimeout(()=>{v.current=i,u(!0)},120);return()=>clearTimeout(m)}},[i]),c.useEffect(()=>{a.length===1&&!t.get("type")&&r({type:a[0].workflow_type},{replace:!0})},[a.length]);const P=m=>{r({type:m.workflow_type},{replace:!0})};return w||f?e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-40 bg-surface-sunken rounded"})]}):e.jsxs("div",{children:[e.jsx(B,{title:"Invoke",docsHash:"#docs:dashboard.md:invoke-workflow"}),a.length===0?e.jsxs("div",{className:"py-16 text-center",children:[e.jsx("p",{className:"text-sm text-text-primary mb-1",children:"No invocable workflows"}),e.jsx("p",{className:"text-xs text-text-tertiary",children:"Mark workflows as invocable in the registry, or start the server with examples enabled."})]}):e.jsxs("div",{className:"grid grid-cols-3 gap-8 items-start",children:[e.jsx("div",{className:"col-span-2",children:e.jsx(ne,{configs:a,selectedType:i,onSelect:P,tierMap:y,activeTypes:o})}),e.jsx("div",{ref:k,className:`sticky top-4 transition-all duration-200 ease-out ${x?"opacity-100 translate-y-0":"opacity-0 translate-y-1"}`,children:i&&s?e.jsx("div",{className:"border-l border-surface-border pl-6",children:e.jsx(de,{selected:s,executionsPath:d})}):e.jsxs("div",{className:"flex flex-col items-center justify-center py-24 text-center",children:[e.jsx(ee,{className:"w-6 h-6 text-text-quaternary mb-3",strokeWidth:1}),e.jsx("p",{className:"text-sm text-text-tertiary",children:"Select a workflow"}),e.jsx("p",{className:"text-xs text-text-quaternary mt-1",children:"Choose one from the list to configure and invoke it."})]})})]})]})}function Ne(){return e.jsx(xe,{})}export{Ne as DurableInvokePage,xe as StartWorkflowPage};
6
- //# sourceMappingURL=index-CDHDoHYz.js.map