@hotmeshio/long-tail 0.4.12 → 0.4.14

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 (265) hide show
  1. package/README.md +76 -100
  2. package/build/api/escalations/helpers.d.ts +14 -0
  3. package/build/api/escalations/helpers.js +14 -0
  4. package/build/api/escalations/index.d.ts +1 -0
  5. package/build/api/escalations/index.js +5 -1
  6. package/build/api/escalations/metadata.d.ts +56 -0
  7. package/build/api/escalations/metadata.js +178 -0
  8. package/build/api/index.d.ts +2 -1
  9. package/build/api/index.js +3 -2
  10. package/build/api/{mcp-runs.d.ts → pipelines.d.ts} +18 -0
  11. package/build/api/{mcp-runs.js → pipelines.js} +36 -4
  12. package/build/api/workflows/discovery.js +1 -1
  13. package/build/bin/ltc.js +17 -0
  14. package/build/lib/cli/commands/escalations.d.ts +9 -0
  15. package/build/lib/cli/commands/escalations.js +36 -0
  16. package/build/lib/db/schemas/010_metadata_gin.sql +5 -0
  17. package/build/routes/escalations/index.js +3 -0
  18. package/build/routes/escalations/metadata.d.ts +6 -0
  19. package/build/routes/escalations/metadata.js +86 -0
  20. package/build/routes/index.js +3 -2
  21. package/build/routes/{mcp-runs.js → pipelines.js} +17 -4
  22. package/build/sdk/index.d.ts +30 -4
  23. package/build/sdk/index.js +15 -5
  24. package/build/services/escalation/crud.d.ts +5 -0
  25. package/build/services/escalation/crud.js +27 -0
  26. package/build/services/escalation/sql.d.ts +5 -0
  27. package/build/services/escalation/sql.js +39 -1
  28. package/build/services/interceptor/activities/escalation.js +11 -0
  29. package/build/services/{mcp-runs → pipelines}/sql.js +1 -1
  30. package/build/start/adapters.js +3 -6
  31. package/build/start/server.js +7 -3
  32. package/build/tsconfig.tsbuildinfo +1 -1
  33. package/build/types/startup.d.ts +3 -3
  34. package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js → AdminDashboard-BuqyRY2r.js} +2 -2
  35. package/dashboard/dist/assets/{AdminDashboard-B7AFFt4L.js.map → AdminDashboard-BuqyRY2r.js.map} +1 -1
  36. package/dashboard/dist/assets/AgentConfigPage-Bum1dUIi.js +16 -0
  37. package/dashboard/dist/assets/AgentConfigPage-Bum1dUIi.js.map +1 -0
  38. package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js → AgentDetailPage-0Kq-tBF2.js} +3 -3
  39. package/dashboard/dist/assets/{AgentDetailPage-DnHaUCS5.js.map → AgentDetailPage-0Kq-tBF2.js.map} +1 -1
  40. package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js → AgentsPage-B5gYDSOX.js} +2 -2
  41. package/dashboard/dist/assets/{AgentsPage-BR2-PdTq.js.map → AgentsPage-B5gYDSOX.js.map} +1 -1
  42. package/dashboard/dist/assets/AvailableEscalationsPage-BWHThQDC.js +2 -0
  43. package/dashboard/dist/assets/AvailableEscalationsPage-BWHThQDC.js.map +1 -0
  44. package/dashboard/dist/assets/BotPicker-BQ336piW.js +2 -0
  45. package/dashboard/dist/assets/{BotPicker-CAowL3ib.js.map → BotPicker-BQ336piW.js.map} +1 -1
  46. package/dashboard/dist/assets/CapabilitiesPage-CkiJROX-.js +2 -0
  47. package/dashboard/dist/assets/{CapabilitiesPage-CSUKBvEN.js.map → CapabilitiesPage-CkiJROX-.js.map} +1 -1
  48. package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js → CollapsibleSection-SM8_UjNe.js} +2 -2
  49. package/dashboard/dist/assets/{CollapsibleSection-Bv6ixURp.js.map → CollapsibleSection-SM8_UjNe.js.map} +1 -1
  50. package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js → CredentialsPage-f6niro9_.js} +2 -2
  51. package/dashboard/dist/assets/{CredentialsPage-CdPKxRBj.js.map → CredentialsPage-f6niro9_.js.map} +1 -1
  52. package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js → CronLabel-DINmdqoe.js} +2 -2
  53. package/dashboard/dist/assets/{CronLabel-BtdXRDqs.js.map → CronLabel-DINmdqoe.js.map} +1 -1
  54. package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js → CustomDurationPicker-BCUcYxfB.js} +2 -2
  55. package/dashboard/dist/assets/{CustomDurationPicker-Mq3SLUuv.js.map → CustomDurationPicker-BCUcYxfB.js.map} +1 -1
  56. package/dashboard/dist/assets/{DropZone-lw2wmqty.js → DropZone-BkfRoUcm.js} +2 -2
  57. package/dashboard/dist/assets/{DropZone-lw2wmqty.js.map → DropZone-BkfRoUcm.js.map} +1 -1
  58. package/dashboard/dist/assets/{ElapsedCell-DOTqB4ZX.js → ElapsedCell-DPYZnXsX.js} +2 -2
  59. package/dashboard/dist/assets/{ElapsedCell-DOTqB4ZX.js.map → ElapsedCell-DPYZnXsX.js.map} +1 -1
  60. package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js → EscalationsOverview-CTB8AEBd.js} +2 -2
  61. package/dashboard/dist/assets/{EscalationsOverview-DSM8Mnb-.js.map → EscalationsOverview-CTB8AEBd.js.map} +1 -1
  62. package/dashboard/dist/assets/{EventTable-C-HagWbs.js → EventTable-8_r3Tg09.js} +2 -2
  63. package/dashboard/dist/assets/{EventTable-C-HagWbs.js.map → EventTable-8_r3Tg09.js.map} +1 -1
  64. package/dashboard/dist/assets/{EventTopicPill-RaASGdZz.js → EventTopicPill-CCWCs07y.js} +2 -2
  65. package/dashboard/dist/assets/{EventTopicPill-RaASGdZz.js.map → EventTopicPill-CCWCs07y.js.map} +1 -1
  66. package/dashboard/dist/assets/HomePage-Bjxnjv6p.js +2 -0
  67. package/dashboard/dist/assets/HomePage-Bjxnjv6p.js.map +1 -0
  68. package/dashboard/dist/assets/ListToolbar-B60JrvJ9.js +2 -0
  69. package/dashboard/dist/assets/{ListToolbar-o8xSCSVv.js.map → ListToolbar-B60JrvJ9.js.map} +1 -1
  70. package/dashboard/dist/assets/McpOverview-whVRP_Nj.js +2 -0
  71. package/dashboard/dist/assets/McpOverview-whVRP_Nj.js.map +1 -0
  72. package/dashboard/dist/assets/{McpQueryDetailPage-UR0bySPJ.js → McpQueryDetailPage-DPuujJkH.js} +2 -2
  73. package/dashboard/dist/assets/McpQueryDetailPage-DPuujJkH.js.map +1 -0
  74. package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js → McpQueryPage-DciK6r7r.js} +2 -2
  75. package/dashboard/dist/assets/{McpQueryPage-C-mzOcGH.js.map → McpQueryPage-DciK6r7r.js.map} +1 -1
  76. package/dashboard/dist/assets/McpRunDetailPage-QEz8BCTu.js +2 -0
  77. package/dashboard/dist/assets/McpRunDetailPage-QEz8BCTu.js.map +1 -0
  78. package/dashboard/dist/assets/McpRunsPage-BA6AVpi_.js +2 -0
  79. package/dashboard/dist/assets/McpRunsPage-BA6AVpi_.js.map +1 -0
  80. package/dashboard/dist/assets/OperatorDashboard-DrUMzwnl.js +2 -0
  81. package/dashboard/dist/assets/OperatorDashboard-DrUMzwnl.js.map +1 -0
  82. package/dashboard/dist/assets/{PageHeader-B4w-LDUF.js → PageHeader-CR6TpJG_.js} +2 -2
  83. package/dashboard/dist/assets/{PageHeader-B4w-LDUF.js.map → PageHeader-CR6TpJG_.js.map} +1 -1
  84. package/dashboard/dist/assets/{PageHeaderWithStats-DQmNXYcG.js → PageHeaderWithStats-CRcQEAO1.js} +2 -2
  85. package/dashboard/dist/assets/{PageHeaderWithStats-DQmNXYcG.js.map → PageHeaderWithStats-CRcQEAO1.js.map} +1 -1
  86. package/dashboard/dist/assets/{ProcessDetailPage-8cJEBC_E.js → ProcessDetailPage-Dc5ASJpQ.js} +2 -2
  87. package/dashboard/dist/assets/{ProcessDetailPage-8cJEBC_E.js.map → ProcessDetailPage-Dc5ASJpQ.js.map} +1 -1
  88. package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js → ProcessesListPage-Sa-bjC-g.js} +2 -2
  89. package/dashboard/dist/assets/{ProcessesListPage-CiprI5Wj.js.map → ProcessesListPage-Sa-bjC-g.js.map} +1 -1
  90. package/dashboard/dist/assets/{RolePill-Dk-YUxCm.js → RolePill-BC54Vn-U.js} +2 -2
  91. package/dashboard/dist/assets/{RolePill-Dk-YUxCm.js.map → RolePill-BC54Vn-U.js.map} +1 -1
  92. package/dashboard/dist/assets/{RolesPage-xo6AgPym.js → RolesPage-DmO8Jlbw.js} +2 -2
  93. package/dashboard/dist/assets/{RolesPage-xo6AgPym.js.map → RolesPage-DmO8Jlbw.js.map} +1 -1
  94. package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js → RunAsSelector-yWEwIZRe.js} +2 -2
  95. package/dashboard/dist/assets/{RunAsSelector-DPXWgduq.js.map → RunAsSelector-yWEwIZRe.js.map} +1 -1
  96. package/dashboard/dist/assets/{ServerName-A6Wlv3vZ.js → ServerName-Q6okiv4f.js} +2 -2
  97. package/dashboard/dist/assets/{ServerName-A6Wlv3vZ.js.map → ServerName-Q6okiv4f.js.map} +1 -1
  98. package/dashboard/dist/assets/{SwimlaneTimeline-BzG8QxYs.js → SwimlaneTimeline-CmzfFQ09.js} +2 -2
  99. package/dashboard/dist/assets/{SwimlaneTimeline-BzG8QxYs.js.map → SwimlaneTimeline-CmzfFQ09.js.map} +1 -1
  100. package/dashboard/dist/assets/{TagInput-CYh3PFNq.js → TagInput-D6l1SPWd.js} +2 -2
  101. package/dashboard/dist/assets/{TagInput-CYh3PFNq.js.map → TagInput-D6l1SPWd.js.map} +1 -1
  102. package/dashboard/dist/assets/{TaskDetailPage-Ck_0-iO2.js → TaskDetailPage-CI4JTC62.js} +2 -2
  103. package/dashboard/dist/assets/{TaskDetailPage-Ck_0-iO2.js.map → TaskDetailPage-CI4JTC62.js.map} +1 -1
  104. package/dashboard/dist/assets/{TaskQueuePill-BSFLiBcf.js → TaskQueuePill-iDBVCEQQ.js} +2 -2
  105. package/dashboard/dist/assets/{TaskQueuePill-BSFLiBcf.js.map → TaskQueuePill-iDBVCEQQ.js.map} +1 -1
  106. package/dashboard/dist/assets/{TasksListPage-DtR4F0ho.js → TasksListPage-xdNmQsNE.js} +2 -2
  107. package/dashboard/dist/assets/{TasksListPage-DtR4F0ho.js.map → TasksListPage-xdNmQsNE.js.map} +1 -1
  108. package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js → TimeAgo-B_um9BWR.js} +2 -2
  109. package/dashboard/dist/assets/{TimeAgo-BLNstYO1.js.map → TimeAgo-B_um9BWR.js.map} +1 -1
  110. package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js → TimestampCell-BJ6trAqW.js} +2 -2
  111. package/dashboard/dist/assets/{TimestampCell-DxIz3l1J.js.map → TimestampCell-BJ6trAqW.js.map} +1 -1
  112. package/dashboard/dist/assets/{ToolPill-CcKNnnrK.js → ToolPill-HcRTggHo.js} +2 -2
  113. package/dashboard/dist/assets/{ToolPill-CcKNnnrK.js.map → ToolPill-HcRTggHo.js.map} +1 -1
  114. package/dashboard/dist/assets/{ToolTestPanel-AVDlqGQI.js → ToolTestPanel-DMQhLDES.js} +2 -2
  115. package/dashboard/dist/assets/{ToolTestPanel-AVDlqGQI.js.map → ToolTestPanel-DMQhLDES.js.map} +1 -1
  116. package/dashboard/dist/assets/TopicDetailPage-YeGQA0vD.js +9 -0
  117. package/dashboard/dist/assets/TopicDetailPage-YeGQA0vD.js.map +1 -0
  118. package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js → TopicsPage-B3QZNlWz.js} +2 -2
  119. package/dashboard/dist/assets/{TopicsPage-BdnJ7E_S.js.map → TopicsPage-B3QZNlWz.js.map} +1 -1
  120. package/dashboard/dist/assets/{UserName-Bk-pzKYb.js → UserName-MpSZ2_EH.js} +2 -2
  121. package/dashboard/dist/assets/{UserName-Bk-pzKYb.js.map → UserName-MpSZ2_EH.js.map} +1 -1
  122. package/dashboard/dist/assets/WorkflowExecutionPage-DqMqDb1h.js +2 -0
  123. package/dashboard/dist/assets/WorkflowExecutionPage-DqMqDb1h.js.map +1 -0
  124. package/dashboard/dist/assets/WorkflowPill-54px0YiY.js +2 -0
  125. package/dashboard/dist/assets/WorkflowPill-54px0YiY.js.map +1 -0
  126. package/dashboard/dist/assets/{WorkflowsDashboard-nXLTR0OO.js → WorkflowsDashboard-BF7FpMmk.js} +2 -2
  127. package/dashboard/dist/assets/WorkflowsDashboard-BF7FpMmk.js.map +1 -0
  128. package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js → WorkflowsOverview-YFc_KBMS.js} +2 -2
  129. package/dashboard/dist/assets/{WorkflowsOverview-BdSHBzzd.js.map → WorkflowsOverview-YFc_KBMS.js.map} +1 -1
  130. package/dashboard/dist/assets/YamlWorkflowsPage-BOLs5KTB.js +2 -0
  131. package/dashboard/dist/assets/{YamlWorkflowsPage-BsO4L_SW.js.map → YamlWorkflowsPage-BOLs5KTB.js.map} +1 -1
  132. package/dashboard/dist/assets/{agents-CtF0uBav.js → agents-CPYVSCQ3.js} +2 -2
  133. package/dashboard/dist/assets/{agents-CtF0uBav.js.map → agents-CPYVSCQ3.js.map} +1 -1
  134. package/dashboard/dist/assets/{bots-DOP_eck8.js → bots-DCXjHjID.js} +2 -2
  135. package/dashboard/dist/assets/{bots-DOP_eck8.js.map → bots-DCXjHjID.js.map} +1 -1
  136. package/dashboard/dist/assets/{capabilities-DvxG02aF.js → capabilities-CreogBYU.js} +2 -2
  137. package/dashboard/dist/assets/{capabilities-DvxG02aF.js.map → capabilities-CreogBYU.js.map} +1 -1
  138. package/dashboard/dist/assets/{controlplane-Dmq81vAY.js → controlplane-Cm_-Gb1x.js} +2 -2
  139. package/dashboard/dist/assets/{controlplane-Dmq81vAY.js.map → controlplane-Cm_-Gb1x.js.map} +1 -1
  140. package/dashboard/dist/assets/escalation-columns-CLqe28Ba.js +2 -0
  141. package/dashboard/dist/assets/escalation-columns-CLqe28Ba.js.map +1 -0
  142. package/dashboard/dist/assets/{escalation-BP3UWfIe.js → escalation-ulsBFHVb.js} +2 -2
  143. package/dashboard/dist/assets/{escalation-BP3UWfIe.js.map → escalation-ulsBFHVb.js.map} +1 -1
  144. package/dashboard/dist/assets/{helpers-B_PYr0pL.js → helpers-etjHeZEI.js} +2 -2
  145. package/dashboard/dist/assets/{helpers-B_PYr0pL.js.map → helpers-etjHeZEI.js.map} +1 -1
  146. package/dashboard/dist/assets/index-7Fbktqcl.js +2 -0
  147. package/dashboard/dist/assets/index-7Fbktqcl.js.map +1 -0
  148. package/dashboard/dist/assets/{index-DQs-LMoa.js → index-BkCkBW_D.js} +2 -2
  149. package/dashboard/dist/assets/{index-DQs-LMoa.js.map → index-BkCkBW_D.js.map} +1 -1
  150. package/dashboard/dist/assets/index-BkOv2dQA.js +2 -0
  151. package/dashboard/dist/assets/{index-Bb1ycul8.js.map → index-BkOv2dQA.js.map} +1 -1
  152. package/dashboard/dist/assets/index-C37LMzJa.css +1 -0
  153. package/dashboard/dist/assets/{index-CkcPZdQm.js → index-CKDOaej4.js} +6 -6
  154. package/dashboard/dist/assets/index-CKDOaej4.js.map +1 -0
  155. package/dashboard/dist/assets/{index-Do1x4kN0.js → index-CcvHiZW-.js} +2 -2
  156. package/dashboard/dist/assets/{index-Do1x4kN0.js.map → index-CcvHiZW-.js.map} +1 -1
  157. package/dashboard/dist/assets/{index-B80zLZVl.js → index-CihScSLF.js} +2 -2
  158. package/dashboard/dist/assets/{index-B80zLZVl.js.map → index-CihScSLF.js.map} +1 -1
  159. package/dashboard/dist/assets/{index-B3wGNZN2.js → index-Cnpo94XG.js} +2 -2
  160. package/dashboard/dist/assets/{index-B3wGNZN2.js.map → index-Cnpo94XG.js.map} +1 -1
  161. package/dashboard/dist/assets/index-DFuHrLll.js +15 -0
  162. package/dashboard/dist/assets/index-DFuHrLll.js.map +1 -0
  163. package/dashboard/dist/assets/{index-DzQBDt3K.js → index-DGpIF_Td.js} +2 -2
  164. package/dashboard/dist/assets/{index-DzQBDt3K.js.map → index-DGpIF_Td.js.map} +1 -1
  165. package/dashboard/dist/assets/index-DT0JeuiL.js +2 -0
  166. package/dashboard/dist/assets/index-DT0JeuiL.js.map +1 -0
  167. package/dashboard/dist/assets/index-DT68ewTC.js +2 -0
  168. package/dashboard/dist/assets/{index-EqKHsaVz.js.map → index-DT68ewTC.js.map} +1 -1
  169. package/dashboard/dist/assets/{index-Bv0eLXZq.js → index-DVqtJBno.js} +4 -4
  170. package/dashboard/dist/assets/{index-Bv0eLXZq.js.map → index-DVqtJBno.js.map} +1 -1
  171. package/dashboard/dist/assets/{index-BnB7G5bA.js → index-DYmrNJ_H.js} +23 -23
  172. package/dashboard/dist/assets/index-DYmrNJ_H.js.map +1 -0
  173. package/dashboard/dist/assets/{knowledge--SApApck.js → knowledge-CXA2DJwY.js} +2 -2
  174. package/dashboard/dist/assets/{knowledge--SApApck.js.map → knowledge-CXA2DJwY.js.map} +1 -1
  175. package/dashboard/dist/assets/{mcp-dn9iPrzm.js → mcp-DeC-PpeL.js} +2 -2
  176. package/dashboard/dist/assets/{mcp-dn9iPrzm.js.map → mcp-DeC-PpeL.js.map} +1 -1
  177. package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js → mcp-query-DldD_RPZ.js} +2 -2
  178. package/dashboard/dist/assets/{mcp-query-CgiU2UR6.js.map → mcp-query-DldD_RPZ.js.map} +1 -1
  179. package/dashboard/dist/assets/{namespaces-D93H3wFO.js → namespaces-BIGZ6exX.js} +2 -2
  180. package/dashboard/dist/assets/{namespaces-D93H3wFO.js.map → namespaces-BIGZ6exX.js.map} +1 -1
  181. package/dashboard/dist/assets/pipelines-BtihifKT.js +2 -0
  182. package/dashboard/dist/assets/pipelines-BtihifKT.js.map +1 -0
  183. package/dashboard/dist/assets/{roles-DuOWZTpx.js → roles-4DocbpKy.js} +2 -2
  184. package/dashboard/dist/assets/{roles-DuOWZTpx.js.map → roles-4DocbpKy.js.map} +1 -1
  185. package/dashboard/dist/assets/{tasks-DoCbLKz4.js → tasks-B9P_7SR_.js} +2 -2
  186. package/dashboard/dist/assets/{tasks-DoCbLKz4.js.map → tasks-B9P_7SR_.js.map} +1 -1
  187. package/dashboard/dist/assets/{topics-CS7Sxf_-.js → topics-CcLT-IrY.js} +2 -2
  188. package/dashboard/dist/assets/{topics-CS7Sxf_-.js.map → topics-CcLT-IrY.js.map} +1 -1
  189. package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js → useEventHooks-B9UOxef_.js} +2 -2
  190. package/dashboard/dist/assets/{useEventHooks-CrIe_Ulh.js.map → useEventHooks-B9UOxef_.js.map} +1 -1
  191. package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js → useYamlActivityEvents-V_MENSI5.js} +2 -2
  192. package/dashboard/dist/assets/{useYamlActivityEvents-JzvzGsUR.js.map → useYamlActivityEvents-V_MENSI5.js.map} +1 -1
  193. package/dashboard/dist/assets/{users-DnxSh2dX.js → users-BHF3YOU1.js} +2 -2
  194. package/dashboard/dist/assets/{users-DnxSh2dX.js.map → users-BHF3YOU1.js.map} +1 -1
  195. package/dashboard/dist/assets/{vendor-icons-5gSix3t2.js → vendor-icons-CrrAvF2g.js} +131 -111
  196. package/dashboard/dist/assets/vendor-icons-CrrAvF2g.js.map +1 -0
  197. package/dashboard/dist/assets/{workflows-zFmmxc08.js → workflows-DorgmYSk.js} +2 -2
  198. package/dashboard/dist/assets/{workflows-zFmmxc08.js.map → workflows-DorgmYSk.js.map} +1 -1
  199. package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js → yaml-workflows-DTGpqnEG.js} +2 -2
  200. package/dashboard/dist/assets/{yaml-workflows-VSax0tKa.js.map → yaml-workflows-DTGpqnEG.js.map} +1 -1
  201. package/dashboard/dist/index.html +3 -3
  202. package/docs/api/http/escalations.md +96 -0
  203. package/docs/api/http/{mcp-runs.md → pipelines.md} +39 -25
  204. package/docs/api/sdk/escalations.md +84 -0
  205. package/docs/cli.md +8 -0
  206. package/docs/dashboard.md +1 -1
  207. package/docs/sdk.md +2 -2
  208. package/package.json +1 -1
  209. package/dashboard/dist/assets/AgentConfigPage-CjuCbr5J.js +0 -16
  210. package/dashboard/dist/assets/AgentConfigPage-CjuCbr5J.js.map +0 -1
  211. package/dashboard/dist/assets/AvailableEscalationsPage-CEkeo_N4.js +0 -2
  212. package/dashboard/dist/assets/AvailableEscalationsPage-CEkeo_N4.js.map +0 -1
  213. package/dashboard/dist/assets/BotPicker-CAowL3ib.js +0 -2
  214. package/dashboard/dist/assets/CapabilitiesPage-CSUKBvEN.js +0 -2
  215. package/dashboard/dist/assets/HomePage-BkMEYnRK.js +0 -2
  216. package/dashboard/dist/assets/HomePage-BkMEYnRK.js.map +0 -1
  217. package/dashboard/dist/assets/ListToolbar-o8xSCSVv.js +0 -2
  218. package/dashboard/dist/assets/McpOverview-C4man2br.js +0 -2
  219. package/dashboard/dist/assets/McpOverview-C4man2br.js.map +0 -1
  220. package/dashboard/dist/assets/McpQueryDetailPage-UR0bySPJ.js.map +0 -1
  221. package/dashboard/dist/assets/McpRunDetailPage-bJl08JSG.js +0 -2
  222. package/dashboard/dist/assets/McpRunDetailPage-bJl08JSG.js.map +0 -1
  223. package/dashboard/dist/assets/McpRunsPage-i2FGJ6yf.js +0 -2
  224. package/dashboard/dist/assets/McpRunsPage-i2FGJ6yf.js.map +0 -1
  225. package/dashboard/dist/assets/OperatorDashboard-DLpqyLle.js +0 -2
  226. package/dashboard/dist/assets/OperatorDashboard-DLpqyLle.js.map +0 -1
  227. package/dashboard/dist/assets/TopicDetailPage-DQkoAlsj.js +0 -9
  228. package/dashboard/dist/assets/TopicDetailPage-DQkoAlsj.js.map +0 -1
  229. package/dashboard/dist/assets/WorkflowExecutionPage-B6mBqWq6.js +0 -2
  230. package/dashboard/dist/assets/WorkflowExecutionPage-B6mBqWq6.js.map +0 -1
  231. package/dashboard/dist/assets/WorkflowPill-BkfIn8N3.js +0 -2
  232. package/dashboard/dist/assets/WorkflowPill-BkfIn8N3.js.map +0 -1
  233. package/dashboard/dist/assets/WorkflowsDashboard-nXLTR0OO.js.map +0 -1
  234. package/dashboard/dist/assets/YamlWorkflowsPage-BsO4L_SW.js +0 -2
  235. package/dashboard/dist/assets/escalation-columns-BayccZzU.js +0 -2
  236. package/dashboard/dist/assets/escalation-columns-BayccZzU.js.map +0 -1
  237. package/dashboard/dist/assets/index-Bb1ycul8.js +0 -2
  238. package/dashboard/dist/assets/index-BnB7G5bA.js.map +0 -1
  239. package/dashboard/dist/assets/index-BnVnJcXw.js +0 -2
  240. package/dashboard/dist/assets/index-BnVnJcXw.js.map +0 -1
  241. package/dashboard/dist/assets/index-CkcPZdQm.js.map +0 -1
  242. package/dashboard/dist/assets/index-CsagXf3M.js +0 -2
  243. package/dashboard/dist/assets/index-CsagXf3M.js.map +0 -1
  244. package/dashboard/dist/assets/index-DZI2L4ag.css +0 -1
  245. package/dashboard/dist/assets/index-EqKHsaVz.js +0 -2
  246. package/dashboard/dist/assets/index-ox042ec_.js +0 -15
  247. package/dashboard/dist/assets/index-ox042ec_.js.map +0 -1
  248. package/dashboard/dist/assets/mcp-runs-BN5MrKai.js +0 -2
  249. package/dashboard/dist/assets/mcp-runs-BN5MrKai.js.map +0 -1
  250. package/dashboard/dist/assets/vendor-icons-5gSix3t2.js.map +0 -1
  251. /package/build/routes/{mcp-runs.d.ts → pipelines.d.ts} +0 -0
  252. /package/build/services/{mcp-runs → pipelines}/enrichment.d.ts +0 -0
  253. /package/build/services/{mcp-runs → pipelines}/enrichment.js +0 -0
  254. /package/build/services/{mcp-runs → pipelines}/events.d.ts +0 -0
  255. /package/build/services/{mcp-runs → pipelines}/events.js +0 -0
  256. /package/build/services/{mcp-runs → pipelines}/execution-builder.d.ts +0 -0
  257. /package/build/services/{mcp-runs → pipelines}/execution-builder.js +0 -0
  258. /package/build/services/{mcp-runs → pipelines}/index.d.ts +0 -0
  259. /package/build/services/{mcp-runs → pipelines}/index.js +0 -0
  260. /package/build/services/{mcp-runs → pipelines}/queries.d.ts +0 -0
  261. /package/build/services/{mcp-runs → pipelines}/queries.js +0 -0
  262. /package/build/services/{mcp-runs → pipelines}/sql.d.ts +0 -0
  263. /package/build/services/{mcp-runs → pipelines}/types.d.ts +0 -0
  264. /package/build/services/{mcp-runs → pipelines}/types.js +0 -0
  265. /package/docs/api/sdk/{mcp-runs.md → pipelines.md} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CsagXf3M.js","sources":["../../src/api/stream-messages.ts","../../src/pages/admin/streams/constants.ts","../../src/pages/admin/streams/StreamMessageDetail.tsx","../../src/pages/admin/streams/StreamMessagesPage.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport type StreamMessageStatus = 'pending' | 'claimed' | 'processed' | 'dead_lettered';\nexport type StreamMessageSource = 'engine' | 'worker';\n\nexport interface StreamMessage {\n id: string;\n source: StreamMessageSource;\n stream_name: string;\n message: string;\n status: StreamMessageStatus;\n created_at: string;\n reserved_at: string | null;\n reserved_by: string | null;\n expired_at: string | null;\n dead_lettered_at: string | null;\n priority: number;\n visible_at: string | null;\n retry_attempt: number;\n max_retry_attempts: number;\n workflow_name: string | null;\n jid: string | null;\n aid: string | null;\n dad: string | null;\n msg_type: string | null;\n topic: string | null;\n}\n\nexport interface StreamMessagesResponse {\n messages: StreamMessage[];\n total: number;\n}\n\nexport interface StreamMessagesParams {\n namespace: string;\n source: StreamMessageSource;\n limit?: number;\n offset?: number;\n sort_by?: string;\n order?: 'asc' | 'desc';\n status?: StreamMessageStatus | '';\n stream_name?: string;\n msg_type?: string;\n topic?: string;\n workflow_name?: string;\n jid?: string;\n aid?: string;\n}\n\n// ── Fetch ───────────────────────────────────────────────────────────────────\n\nfunction fetchStreamMessages(params: StreamMessagesParams) {\n const qs = new URLSearchParams();\n qs.set('namespace', params.namespace);\n qs.set('source', params.source);\n if (params.limit) qs.set('limit', String(params.limit));\n if (params.offset) qs.set('offset', String(params.offset));\n if (params.sort_by) qs.set('sort_by', params.sort_by);\n if (params.order) qs.set('order', params.order);\n if (params.status) qs.set('status', params.status);\n if (params.stream_name) qs.set('stream_name', params.stream_name);\n if (params.msg_type) qs.set('msg_type', params.msg_type);\n if (params.topic) qs.set('topic', params.topic);\n if (params.workflow_name) qs.set('workflow_name', params.workflow_name);\n if (params.jid) qs.set('jid', params.jid);\n if (params.aid) qs.set('aid', params.aid);\n return apiFetch<StreamMessagesResponse>(`/controlplane/stream-messages?${qs}`);\n}\n\n// ── Hook ────────────────────────────────────────────────────────────────────\n\nexport function useStreamMessages(params: StreamMessagesParams) {\n return useQuery({\n queryKey: ['controlplane', 'stream-messages', params],\n queryFn: () => fetchStreamMessages(params),\n enabled: !!params.namespace,\n staleTime: 15_000,\n });\n}\n","import type { StreamMessageStatus } from '../../../api/stream-messages';\n\nexport const STATUS_DOT: Record<StreamMessageStatus, string> = {\n pending: 'bg-text-tertiary',\n claimed: 'bg-status-warning',\n processed: 'bg-status-success',\n dead_lettered: 'bg-status-error',\n};\n\nexport const STATUS_LABEL: Record<StreamMessageStatus, string> = {\n pending: 'Pending',\n claimed: 'Claimed',\n processed: 'Processed',\n dead_lettered: 'Dead Lettered',\n};\n\nexport const SOURCE_BADGE =\n 'inline-block px-1.5 py-0.5 text-[10px] font-mono rounded bg-surface-sunken text-text-secondary';\n\nexport const STATUS_OPTIONS = [\n { value: 'pending', label: 'Pending' },\n { value: 'claimed', label: 'Claimed' },\n { value: 'processed', label: 'Processed' },\n { value: 'dead_lettered', label: 'Dead Lettered' },\n];\n\nexport const SOURCE_OPTIONS = [\n { value: 'engine', label: 'Engine' },\n { value: 'worker', label: 'Worker' },\n];\n","import { Filter } from 'lucide-react';\nimport type { StreamMessage } from '../../../api/stream-messages';\nimport { SectionLabel } from '../../../components/common/layout/SectionLabel';\nimport { DateValue } from '../../../components/common/display/DateValue';\nimport { JsonViewer } from '../../../components/common/data/JsonViewer';\nimport { STATUS_DOT, STATUS_LABEL, SOURCE_BADGE } from './constants';\n\nfunction Timestamp({ label, value }: { label: string; value: string | null }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <div className=\"mt-0.5\">\n <DateValue date={value} format=\"datetime\" />\n </div>\n </div>\n );\n}\n\nfunction Field({ label, value }: { label: string; value: string | null | undefined }) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <p className=\"text-xs text-text-primary font-mono break-all\">{value}</p>\n </div>\n );\n}\n\n/** A field value that can be clicked to filter the master list. */\nfunction FilterableField({ label, value, onFilter }: {\n label: string;\n value: string | null | undefined;\n onFilter?: (value: string) => void;\n}) {\n if (!value) return null;\n return (\n <div>\n <span className=\"text-text-tertiary\">{label}</span>\n <button\n onClick={() => onFilter?.(value)}\n className=\"flex items-center gap-1 group text-left w-full\"\n title={`Filter by ${label.toLowerCase()}: ${value}`}\n >\n <p className=\"text-xs text-text-primary font-mono break-all group-hover:text-accent transition-colors\">{value}</p>\n <Filter className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary opacity-0 group-hover:opacity-100 transition-opacity\" />\n </button>\n </div>\n );\n}\n\nexport interface StreamMessageDetailFilters {\n onFilterStatus?: (value: string) => void;\n onFilterStreamName?: (value: string) => void;\n onFilterMsgType?: (value: string) => void;\n onFilterTopic?: (value: string) => void;\n onFilterWorkflow?: (value: string) => void;\n onFilterJid?: (value: string) => void;\n onFilterAid?: (value: string) => void;\n}\n\n/**\n * Standard stream message detail view.\n *\n * This component is the canonical representation of a stream message.\n * Reuse it wherever stream messages need to be displayed — the layout,\n * timestamp formatting (via DateValue with ms/UTC/local tooltip), and\n * payload viewer are the standard.\n */\nexport function StreamMessageDetail({ message, filters }: {\n message: StreamMessage | null;\n filters?: StreamMessageDetailFilters;\n}) {\n if (!message) return null;\n\n return (\n <div className=\"space-y-5 text-[11px]\">\n {/* Header */}\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[message.status]}`} />\n <FilterableField\n label=\"\"\n value={STATUS_LABEL[message.status]}\n onFilter={() => filters?.onFilterStatus?.(message.status)}\n />\n <span className={SOURCE_BADGE}>{message.source}</span>\n </div>\n <FilterableField\n label=\"\"\n value={message.stream_name}\n onFilter={() => filters?.onFilterStreamName?.(message.stream_name)}\n />\n <p className=\"text-[10px] text-text-tertiary mt-0.5\">ID: {message.id}</p>\n </div>\n\n {/* Timestamps */}\n <div className=\"space-y-2\">\n <SectionLabel>Timestamps</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <Timestamp label=\"Created\" value={message.created_at} />\n <Timestamp label=\"Reserved\" value={message.reserved_at} />\n <Timestamp label=\"Processed\" value={message.expired_at} />\n <Timestamp label=\"Dead-lettered\" value={message.dead_lettered_at} />\n </div>\n </div>\n\n {/* Metadata */}\n <div className=\"space-y-2\">\n <SectionLabel>Metadata</SectionLabel>\n <div className=\"grid grid-cols-2 gap-2\">\n <Field label=\"Priority\" value={String(message.priority)} />\n <Field label=\"Retries\" value={`${message.retry_attempt} / ${message.max_retry_attempts}`} />\n <Field label=\"Reserved by\" value={message.reserved_by} />\n </div>\n </div>\n\n {/* Job ID — available on both engine and worker streams */}\n {message.jid && (\n <div className=\"space-y-2\">\n <SectionLabel>Job</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Job ID\" value={message.jid} onFilter={filters?.onFilterJid} />\n </div>\n </div>\n )}\n\n {/* Worker-specific fields — clickable to filter */}\n {message.source === 'worker' && (\n <div className=\"space-y-2\">\n <SectionLabel>Worker Details</SectionLabel>\n <div className=\"grid grid-cols-1 gap-2\">\n <FilterableField label=\"Workflow\" value={message.workflow_name} onFilter={filters?.onFilterWorkflow} />\n <FilterableField label=\"Activity\" value={message.aid} onFilter={filters?.onFilterAid} />\n <Field label=\"Dimension\" value={message.dad} />\n <FilterableField label=\"Type\" value={message.msg_type} onFilter={filters?.onFilterMsgType} />\n <FilterableField label=\"Topic\" value={message.topic} onFilter={filters?.onFilterTopic} />\n </div>\n </div>\n )}\n\n {/* Message payload — fully expanded by default */}\n <div className=\"space-y-2\">\n <JsonViewer data={message.message} label=\"Payload\" defaultCollapsed={false} />\n </div>\n </div>\n );\n}\n","import { useState, useMemo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useStreamMessages, type StreamMessage } from '../../../api/stream-messages';\nimport { useControlPlaneApps } from '../../../api/controlplane';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { StickyPagination } from '../../../components/common/data/StickyPagination';\nimport { FilterBar, FilterSelect, FilterInput } from '../../../components/common/data/FilterBar';\nimport { TimestampCell } from '../../../components/common/display/TimestampCell';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { ListToolbar } from '../../../components/common/data/ListToolbar';\nimport { StreamMessageDetail } from './StreamMessageDetail';\nimport { STATUS_DOT, STATUS_LABEL, STATUS_OPTIONS, SOURCE_OPTIONS, SOURCE_BADGE } from './constants';\n\nexport function StreamMessagesPage() {\n const { filters, setFilter, pagination, sort, setSort } = useFilterParams({\n filters: { namespace: 'durable', source: 'worker', status: '', stream_name: '', msg_type: '', topic: '', workflow_name: '', jid: '', aid: '' },\n });\n\n const [selected, setSelected] = useState<StreamMessage | null>(null);\n\n const { data: appsData } = useControlPlaneApps();\n const namespaceOptions = useMemo(\n () => (appsData?.apps ?? []).map((a) => ({ value: a.appId, label: a.appId })),\n [appsData],\n );\n\n const { data, isLoading, refetch, isFetching } = useStreamMessages({\n namespace: filters.namespace || 'durable',\n source: (filters.source as 'engine' | 'worker') || 'worker',\n limit: pagination.pageSize,\n offset: pagination.offset,\n sort_by: sort.sort_by || 'created_at',\n order: sort.order || 'desc',\n status: (filters.status as any) || undefined,\n stream_name: filters.stream_name || undefined,\n msg_type: filters.msg_type || undefined,\n topic: filters.topic || undefined,\n workflow_name: filters.workflow_name || undefined,\n jid: filters.jid || undefined,\n aid: filters.aid || undefined,\n });\n\n const messages = data?.messages ?? [];\n const total = data?.total ?? 0;\n\n const activeMessage = useMemo(() => {\n if (!selected) return null;\n return messages.find((m) => m.id === selected.id && m.source === selected.source) ?? selected;\n }, [messages, selected]);\n\n const panelOpen = !!activeMessage;\n\n const columns: Column<StreamMessage>[] = [\n {\n key: 'status',\n label: 'Status',\n render: (row) => (\n <div className=\"flex items-center gap-2\">\n <span className={`w-2 h-2 rounded-full shrink-0 ${STATUS_DOT[row.status]}`} />\n <span className=\"text-xs\">{STATUS_LABEL[row.status]}</span>\n </div>\n ),\n className: 'w-28',\n },\n {\n key: 'source',\n label: 'Source',\n render: (row) => <span className={SOURCE_BADGE}>{row.source}</span>,\n className: 'w-20',\n },\n {\n key: 'stream_name',\n label: 'Stream',\n sortable: true,\n render: (row) => (\n <span className=\"font-mono text-xs text-text-secondary truncate block max-w-[240px]\" title={row.stream_name}>\n {row.stream_name}\n </span>\n ),\n },\n {\n key: 'msg_type',\n label: 'Type',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">{row.msg_type || '—'}</span>\n ),\n className: 'w-24',\n },\n {\n key: 'created_at',\n label: 'Created',\n sortable: true,\n render: (row) => <TimestampCell date={row.created_at} />,\n className: 'w-44',\n },\n {\n key: 'reserved_at',\n label: 'Reserved',\n render: (row) => row.reserved_at ? <TimestampCell date={row.reserved_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'expired_at',\n label: 'Processed',\n render: (row) => row.expired_at ? <TimestampCell date={row.expired_at} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'w-44',\n },\n {\n key: 'priority',\n label: 'Pri',\n sortable: true,\n render: (row) => <span className=\"text-xs text-text-secondary\">{row.priority}</span>,\n className: 'w-12 text-right',\n },\n {\n key: 'retry_attempt',\n label: 'Retries',\n render: (row) => (\n <span className=\"text-xs text-text-secondary\">\n {row.retry_attempt}/{row.max_retry_attempts}\n </span>\n ),\n className: 'w-16',\n },\n ];\n\n return (\n <div>\n <PageHeader title=\"Messages\" docsHash=\"#docs:dashboard.md:messages\" />\n\n <FilterBar actions={\n <ListToolbar\n onRefresh={() => refetch()}\n isFetching={isFetching}\n apiPath={`/controlplane/stream-messages?namespace=${filters.namespace || 'durable'}&source=${filters.source || 'worker'}&limit=${pagination.pageSize}&offset=${pagination.offset}${filters.status ? `&status=${filters.status}` : ''}${filters.stream_name ? `&stream_name=${filters.stream_name}` : ''}`}\n />\n }>\n <FilterSelect\n label=\"Namespace\"\n value={filters.namespace}\n onChange={(v) => setFilter('namespace', v)}\n options={namespaceOptions}\n required\n />\n <FilterSelect\n label=\"Source\"\n value={filters.source}\n onChange={(v) => setFilter('source', v)}\n options={SOURCE_OPTIONS}\n required\n />\n <FilterSelect\n label=\"Status\"\n value={filters.status}\n onChange={(v) => setFilter('status', v)}\n options={STATUS_OPTIONS}\n />\n <FilterInput\n label=\"Stream\"\n value={filters.stream_name}\n onChange={(v) => setFilter('stream_name', v)}\n placeholder=\"Filter by stream name…\"\n />\n {/* Active dimension filter pills — inline in the sticky bar */}\n {[\n { key: 'topic', label: 'Topic', value: filters.topic },\n { key: 'workflow_name', label: 'Workflow', value: filters.workflow_name },\n { key: 'jid', label: 'Job', value: filters.jid },\n { key: 'aid', label: 'Activity', value: filters.aid },\n { key: 'msg_type', label: 'Type', value: filters.msg_type },\n ].filter((f) => f.value).map((f) => (\n <button\n key={f.key}\n onClick={() => setFilter(f.key as any, '')}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 text-[10px] font-mono rounded-full bg-accent/15 text-accent hover:bg-accent/25 transition-colors\"\n title={`Clear ${f.label} filter`}\n >\n {f.label}: {f.value}\n <X className=\"w-2.5 h-2.5\" />\n </button>\n ))}\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={messages}\n keyFn={(row) => `${row.source}:${row.id}`}\n isLoading={isLoading}\n emptyMessage=\"No stream messages found\"\n onRowClick={(row) => setSelected(row)}\n activeRowKey={activeMessage ? `${activeMessage.source}:${activeMessage.id}` : null}\n sort={sort}\n onSort={setSort}\n />\n\n <StickyPagination\n page={pagination.page}\n totalPages={pagination.totalPages(total)}\n onPageChange={pagination.setPage}\n total={total}\n pageSize={pagination.pageSize}\n onPageSizeChange={pagination.setPageSize}\n />\n\n {/* Detail panel — portaled to body so fixed positioning works */}\n {panelOpen && createPortal(\n <div className=\"fixed right-0 bottom-0 w-[400px] z-40 border-l border-surface-border bg-surface overflow-y-auto shadow-lg\" style={{ top: '3.5rem' }}>\n <div className=\"sticky top-0 z-10 flex items-center justify-between px-4 py-3 bg-surface border-b border-surface-border/50\">\n <span className=\"text-xs font-medium text-text-primary\">Message Detail</span>\n <button\n onClick={() => setSelected(null)}\n className=\"p-1 rounded hover:bg-surface-hover text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Close\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"px-4 py-4\">\n <StreamMessageDetail\n message={activeMessage}\n filters={{\n onFilterStatus: (v) => setFilter('status', v),\n onFilterStreamName: (v) => setFilter('stream_name', v),\n onFilterMsgType: (v) => setFilter('msg_type', v),\n onFilterTopic: (v) => setFilter('topic', v),\n onFilterWorkflow: (v) => setFilter('workflow_name', v),\n onFilterJid: (v) => setFilter('jid', v),\n onFilterAid: (v) => setFilter('aid', v),\n }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n"],"names":["fetchStreamMessages","params","qs","apiFetch","useStreamMessages","useQuery","STATUS_DOT","STATUS_LABEL","SOURCE_BADGE","STATUS_OPTIONS","SOURCE_OPTIONS","Timestamp","label","value","jsx","DateValue","Field","FilterableField","onFilter","jsxs","Filter","StreamMessageDetail","message","filters","_a","SectionLabel","JsonViewer","StreamMessagesPage","setFilter","pagination","sort","setSort","useFilterParams","selected","setSelected","useState","appsData","useControlPlaneApps","namespaceOptions","useMemo","a","data","isLoading","refetch","isFetching","messages","total","activeMessage","m","panelOpen","columns","row","TimestampCell","PageHeader","FilterBar","ListToolbar","FilterSelect","v","FilterInput","f","X","DataTable","StickyPagination","createPortal"],"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}body{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{--tw-border-opacity: 1;border-color:rgb(224 218 240 / 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(108 71 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(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(88 53 219 / var(--tw-bg-opacity, 1))}.btn-secondary{border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(224 218 240 / 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(30 21 53 / 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(247 244 255 / 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(91 81 115 / 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(247 244 255 / 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}.row-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.\!input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / 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(145 138 171 / var(--tw-text-opacity, 1))}.\!input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.\!input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input{width:100%;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / 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(145 138 171 / var(--tw-text-opacity, 1))}.input::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.input-json{width:100%;resize:vertical;border-radius:.375rem;border-width:1px;border-color:#e0daf066;background-color:transparent;padding:.5rem .75rem;font-family:JetBrains Mono,Fira Code,ui-monospace,monospace;font-size:11px;--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);line-height:1.625;--tw-text-opacity: 1;color:rgb(30 21 53 / 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(145 138 171 / var(--tw-text-opacity, 1))}.input-json::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.input-json:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-bottom-width:1px;border-color:#e0daf099;background-color:transparent;padding:.375rem .25rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.select:focus{border-color:#6c47ff80;outline:2px solid transparent;outline-offset:2px}.label{margin-bottom:.125rem;display:block;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.hint{margin-top:.25rem;font-size:9px;line-height:1.375;color:#918aabb3}.section-header{margin-bottom:.75rem;display:block;border-bottom-width:1px;border-color:#e0daf04d;padding-bottom:.375rem;font-size:.75rem;line-height:1rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:#6c47ffcc}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-y-0{top:0;bottom:0}.-left-\[3px\]{left:-3px}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-56{left:14rem}.left-\[7px\]{left:7px}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-6{top:1.5rem}.top-\[2\.75rem\]{top:2.75rem}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[45\]{z-index:45}.z-\[5\]{z-index:5}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.float-right{float:right}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-ml-10{margin-left:-2.5rem}.-ml-8{margin-left:-2rem}.-ml-\[12\.5rem\]{margin-left:-12.5rem}.-ml-\[9\.75rem\]{margin-left:-9.75rem}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.-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-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-6{margin-left:1.5rem}.ml-7{margin-left:1.75rem}.ml-8{margin-left:2rem}.ml-9{margin-left:2.25rem}.ml-\[19px\]{margin-left:19px}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-14{margin-top:3.5rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-\[3em\]{margin-top:3em}.mt-px{margin-top:1px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-8{height:2rem}.h-\[12\.5rem\]{height:12.5rem}.h-\[14px\]{height:14px}.h-\[15px\]{height:15px}.h-\[16rem\]{height:16rem}.h-\[18px\]{height:18px}.h-\[7px\]{height:7px}.h-\[80px\]{height:80px}.h-\[9px\]{height:9px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-40{max-height:10rem}.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-\[calc\(100vh-220px\)\]{max-height:calc(100vh - 220px)}.max-h-\[calc\(100vh-8rem\)\]{max-height:calc(100vh - 8rem)}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[160px\]{min-height:160px}.min-h-\[200px\]{min-height:200px}.min-h-\[28px\]{min-height:28px}.min-h-\[300px\]{min-height:300px}.min-h-\[34px\]{min-height:34px}.min-h-\[360px\]{min-height:360px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[calc\(100vh-12rem\)\]{min-height:calc(100vh - 12rem)}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.min-h-\[calc\(100vh-9rem\)\]{min-height:calc(100vh - 9rem)}.min-h-screen{min-height:100vh}.w-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-8{width:2rem}.w-80{width:20rem}.w-\[12\.5rem\]{width:12.5rem}.w-\[120px\]{width:120px}.w-\[14px\]{width:14px}.w-\[15px\]{width:15px}.w-\[16rem\]{width:16rem}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[22rem\]{width:22rem}.w-\[28rem\]{width:28rem}.w-\[30\%\]{width:30%}.w-\[36rem\]{width:36rem}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[40vw\]{width:40vw}.w-\[48rem\]{width:48rem}.w-\[7px\]{width:7px}.w-\[9px\]{width:9px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-4{min-width:1rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[180px\]{min-width:180px}.min-w-\[20px\]{min-width:20px}.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-\[200px\]{max-width:200px}.max-w-\[240px\]{max-width:240px}.max-w-\[60\%\]{max-width:60%}.max-w-\[65\%\]{max-width:65%}.max-w-\[85\%\]{max-width:85%}.max-w-\[90vw\]{max-width:90vw}.max-w-dashboard{max-width:1440px}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:center}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-\[60vh\]{--tw-translate-y: -60vh;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[120vw\]{--tw-translate-x: 120vw;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-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-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))}.-rotate-\[120deg\]{--tw-rotate: -120deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[3\]{--tw-scale-x: 3;--tw-scale-y: 3;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[field-error-in_0\.3s_ease-out\]{animation:field-error-in .3s ease-out}.animate-\[field-shake_0\.4s_ease-in-out\]{animation:field-shake .4s ease-in-out}.animate-\[triage-glow_6s_ease-in-out_infinite\]{animation:triage-glow 6s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr}.grid-cols-\[3fr_1fr\]{grid-template-columns:3fr 1fr}.grid-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-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-14{row-gap:3.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-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-surface-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(224 218 240 / var(--tw-divide-opacity, 1))}.divide-surface-border\/20>:not([hidden])~:not([hidden]){border-color:#e0daf033}.divide-surface-border\/30>:not([hidden])~:not([hidden]){border-color:#e0daf04d}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.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-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-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.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(108 71 255 / var(--tw-border-opacity, 1))}.border-accent-faint{--tw-border-opacity: 1;border-color:rgb(232 226 248 / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(200 190 240 / var(--tw-border-opacity, 1))}.border-accent-muted\/40{border-color:#c8bef066}.border-accent\/10{border-color:#6c47ff1a}.border-accent\/20{border-color:#6c47ff33}.border-accent\/30{border-color:#6c47ff4d}.border-accent\/40{border-color:#6c47ff66}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-600{--tw-border-opacity: 1;border-color:rgb(217 119 6 / var(--tw-border-opacity, 1))}.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\/30{border-color:#34d3994d}.border-emerald-400\/40{border-color:#34d39966}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-purple-500\/20{border-color:#a855f733}.border-status-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\/20{border-color:#16a34a33}.border-status-success\/30{border-color:#16a34a4d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#f59e0b33}.border-status-warning\/30{border-color:#f59e0b4d}.border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.border-surface-border\/15{border-color:#e0daf026}.border-surface-border\/30{border-color:#e0daf04d}.border-surface-border\/40{border-color:#e0daf066}.border-surface-border\/50{border-color:#e0daf080}.border-surface-border\/60{border-color:#e0daf099}.border-text-tertiary{--tw-border-opacity: 1;border-color:rgb(145 138 171 / var(--tw-border-opacity, 1))}.border-violet-400\/40{border-color:#a78bfa66}.border-violet-500{--tw-border-opacity: 1;border-color:rgb(139 92 246 / var(--tw-border-opacity, 1))}.border-white\/70{border-color:#ffffffb3}.border-l-accent{--tw-border-opacity: 1;border-left-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-r-surface-border{--tw-border-opacity: 1;border-right-color:rgb(224 218 240 / 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-\[\#6C47FF\]{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-\[a-z\]{background-color:a-z}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(108 71 255 / var(--tw-bg-opacity, 1))}.bg-accent-faint{--tw-bg-opacity: 1;background-color:rgb(232 226 248 / var(--tw-bg-opacity, 1))}.bg-accent-faint\/50{background-color:#e8e2f880}.bg-accent-muted{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.bg-accent-muted\/20{background-color:#c8bef033}.bg-accent\/10{background-color:#6c47ff1a}.bg-accent\/15{background-color:#6c47ff26}.bg-accent\/20{background-color:#6c47ff33}.bg-accent\/5{background-color:#6c47ff0d}.bg-accent\/60{background-color:#6c47ff99}.bg-accent\/\[0\.06\]{background-color:#6c47ff0f}.bg-accent\/\[0\.08\]{background-color:#6c47ff14}.bg-amber-300\/\[0\.08\]{background-color:#fcd34d14}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.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-blue-500\/60{background-color:#3b82f699}.bg-blue-500\/70{background-color:#3b82f6b3}.bg-cyan-400\/15{background-color:#22d3ee26}.bg-cyan-400\/\[0\.08\]{background-color:#22d3ee14}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.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\/15{background-color:#fb923c26}.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{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-400\/\[0\.08\]{background-color:#f8717114}.bg-rose-300\/\[0\.08\]{background-color:#fda4af14}.bg-rose-400\/15{background-color:#fb718526}.bg-rose-400\/\[0\.08\]{background-color:#fb718514}.bg-sky-300\/\[0\.08\]{background-color:#7dd3fc14}.bg-sky-400\/\[0\.08\]{background-color:#38bdf814}.bg-status-active{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-status-draft{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.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-success\/5{background-color:#16a34a0d}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#f59e0b1a}.bg-status-warning\/15{background-color:#f59e0b26}.bg-status-warning\/5{background-color:#f59e0b0d}.bg-stone-400\/\[0\.08\]{background-color:#a8a29e14}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-border{--tw-bg-opacity: 1;background-color:rgb(224 218 240 / var(--tw-bg-opacity, 1))}.bg-surface-border\/60{background-color:#e0daf099}.bg-surface-hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.bg-surface-hover\/30{background-color:#f7f4ff4d}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-surface-raised\/50{background-color:#ffffff80}.bg-surface-raised\/\[0\.03\]{background-color:#ffffff08}.bg-surface-sunken{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.bg-surface-sunken\/20{background-color:#f5f5f733}.bg-surface-sunken\/30{background-color:#f5f5f74d}.bg-surface-sunken\/40{background-color:#f5f5f766}.bg-surface-sunken\/50{background-color:#f5f5f780}.bg-surface-sunken\/80{background-color:#f5f5f7cc}.bg-surface-sunken\/90{background-color:#f5f5f7e6}.bg-surface\/90{background-color:#ffffffe6}.bg-surface\/95{background-color:#fffffff2}.bg-teal-300\/\[0\.08\]{background-color:#5eead414}.bg-teal-400\/\[0\.08\]{background-color:#2dd4bf14}.bg-text-primary\/30{background-color:#1e15354d}.bg-text-secondary{--tw-bg-opacity: 1;background-color:rgb(91 81 115 / var(--tw-bg-opacity, 1))}.bg-text-tertiary{--tw-bg-opacity: 1;background-color:rgb(145 138 171 / var(--tw-bg-opacity, 1))}.bg-text-tertiary\/30{background-color:#918aab4d}.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-zinc-400\/15{background-color:#a1a1aa26}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.bg-zinc-600{--tw-bg-opacity: 1;background-color:rgb(82 82 91 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.from-accent\/\[0\.04\]{--tw-gradient-from: rgb(108 71 255 / .04) var(--tw-gradient-from-position);--tw-gradient-to: rgb(108 71 255 / 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)}.fill-status-active{fill:#2563eb}.fill-status-error{fill:#dc2626}.fill-status-success{fill:#16a34a}.fill-status-warning{fill:#f59e0b}.fill-text-tertiary{fill:#918aab}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.object-top{-o-object-position:top;object-position:top}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\!px-2\.5{padding-left:.625rem!important;padding-right:.625rem!important}.\!py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}.\!py-1\.5{padding-top:.375rem!important;padding-bottom:.375rem!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-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-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-0{padding-left:0}.pl-11{padding-left:2.75rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-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-9{padding-left:2.25rem}.pr-2{padding-right:.5rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pr-7{padding-right:1.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-24{padding-top:6rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[36px\]{padding-top:36px}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,Fira Code,ui-monospace,monospace}.font-sans{font-family:Plus Jakarta Sans,system-ui,-apple-system,sans-serif}.\!text-\[9px\]{font-size:9px!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[1\.5rem\]{font-size:1.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[36px\]{font-size:36px}.text-\[44px\]{font-size:44px}.text-\[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}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.15em\]{letter-spacing:.15em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[a-z\]{color:a-z}.text-accent{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.text-accent-muted{--tw-text-opacity: 1;color:rgb(200 190 240 / var(--tw-text-opacity, 1))}.text-accent\/40{color:#6c47ff66}.text-accent\/50{color:#6c47ff80}.text-accent\/60{color:#6c47ff99}.text-accent\/70{color:#6c47ffb3}.text-accent\/75{color:#6c47ffbf}.text-accent\/80{color:#6c47ffcc}.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-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / 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-blue-500\/70{color:#3b82f6b3}.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-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-red-400\/60{color:#f8717199}.text-rose-300{--tw-text-opacity: 1;color:rgb(253 164 175 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-sky-300{--tw-text-opacity: 1;color:rgb(125 211 252 / var(--tw-text-opacity, 1))}.text-sky-400{--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.text-status-active{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-error\/50{color:#dc262680}.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(224 218 240 / 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(30 21 53 / var(--tw-text-opacity, 1))}.text-text-secondary{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.text-text-tertiary\/30{color:#918aab4d}.text-text-tertiary\/40{color:#918aab66}.text-text-tertiary\/50{color:#918aab80}.text-text-tertiary\/60{color:#918aab99}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-violet-500{--tw-text-opacity: 1;color:rgb(139 92 246 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-zinc-400{--tw-text-opacity: 1;color:rgb(161 161 170 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.decoration-text-tertiary\/30{text-decoration-color:#918aab4d}.accent-accent{accent-color:#6C47FF}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-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(108 71 255 / var(--tw-ring-opacity, 1))}.ring-accent\/40{--tw-ring-color: rgb(108 71 255 / .4)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-surface{--tw-ring-offset-color: #FFFFFF}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.brightness-150{--tw-brightness: brightness(1.5);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-\[2px\]{--tw-backdrop-blur: blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-\[1500ms\]{transition-duration:1.5s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes triage-glow{0%{box-shadow:0 0 3px #6c47ff26}8.3%{box-shadow:0 0 10px 2px #6c47ff66}16.7%,to{box-shadow:0 0 3px #6c47ff26}}.animate-page-enter{animation:fadeIn .15s ease-out both}@keyframes pageFade{0%{opacity:0}to{opacity:1}}.animate-page-in{animation:pageFade .2s ease-out both}@keyframes field-shake{0%,to{transform:translate(0)}15%{transform:translate(-4px)}30%{transform:translate(3px)}45%{transform:translate(-2px)}60%{transform:translate(1px)}75%{transform:translate(0)}}@keyframes field-error-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.bg-stripes{background-image:repeating-linear-gradient(-45deg,transparent,transparent 3px,rgba(255,255,255,.15) 3px,rgba(255,255,255,.15) 6px);background-color:var(--color-status-warning, #f59e0b)}.placeholder\:italic::-moz-placeholder{font-style:italic}.placeholder\:italic::placeholder{font-style:italic}.placeholder\:text-text-tertiary::-moz-placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary::placeholder{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.placeholder\:text-text-tertiary\/40::-moz-placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/40::placeholder{color:#918aab66}.placeholder\:text-text-tertiary\/50::-moz-placeholder{color:#918aab80}.placeholder\:text-text-tertiary\/50::placeholder{color:#918aab80}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-accent\/40:hover{border-color:#6c47ff66}.hover\:border-accent\/50:hover{border-color:#6c47ff80}.hover\:border-text-tertiary:hover{--tw-border-opacity: 1;border-color:rgb(145 138 171 / 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(88 53 219 / var(--tw-bg-opacity, 1))}.hover\:bg-accent-muted:hover{--tw-bg-opacity: 1;background-color:rgb(200 190 240 / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/10:hover{background-color:#6c47ff1a}.hover\:bg-accent\/20:hover{background-color:#6c47ff33}.hover\:bg-accent\/25:hover{background-color:#6c47ff40}.hover\:bg-accent\/30:hover{background-color:#6c47ff4d}.hover\:bg-accent\/90:hover{background-color:#6c47ffe6}.hover\:bg-accent\/\[0\.04\]:hover{background-color:#6c47ff0a}.hover\:bg-emerald-600\/10:hover{background-color:#0596691a}.hover\:bg-red-600\/10:hover,.hover\:bg-status-error\/10:hover{background-color:#dc26261a}.hover\:bg-status-error\/20:hover{background-color:#dc262633}.hover\:bg-status-error\/80:hover{background-color:#dc2626cc}.hover\:bg-status-error\/90:hover{background-color:#dc2626e6}.hover\:bg-status-success\/10:hover{background-color:#16a34a1a}.hover\:bg-status-success\/20:hover{background-color:#16a34a33}.hover\:bg-surface-hover:hover{--tw-bg-opacity: 1;background-color:rgb(247 244 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-hover\/30:hover{background-color:#f7f4ff4d}.hover\:bg-surface-hover\/50:hover{background-color:#f7f4ff80}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-raised\/30:hover{background-color:#ffffff4d}.hover\:bg-surface-raised\/60:hover{background-color:#fff9}.hover\:bg-surface-sunken:hover{--tw-bg-opacity: 1;background-color:rgb(245 245 247 / var(--tw-bg-opacity, 1))}.hover\:bg-surface-sunken\/40:hover{background-color:#f5f5f766}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(108 71 255 / var(--tw-text-opacity, 1))}.hover\:text-accent-hover:hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.hover\:text-accent\/80:hover{color:#6c47ffcc}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-blue-500:hover{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.hover\:text-emerald-300:hover{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / 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(30 21 53 / var(--tw-text-opacity, 1))}.hover\:text-text-secondary:hover{--tw-text-opacity: 1;color:rgb(91 81 115 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-70:hover{opacity:.7}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(108 71 255 / var(--tw-border-opacity, 1))}.focus\:border-accent\/50:focus{border-color:#6c47ff80}.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(108 71 255 / var(--tw-ring-opacity, 1))}.focus\:ring-accent\/30:focus{--tw-ring-color: rgb(108 71 255 / .3)}.focus\:ring-accent\/40:focus{--tw-ring-color: rgb(108 71 255 / .4)}.focus\:ring-accent\/50:focus{--tw-ring-color: rgb(108 71 255 / .5)}.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}.group\/srv:hover .group-hover\/srv\:visible{visibility:visible}.group\/section:hover .group-hover\/section\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / 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(108 71 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-accent-hover{--tw-text-opacity: 1;color:rgb(88 53 219 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-primary{--tw-text-opacity: 1;color:rgb(30 21 53 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-text-tertiary{--tw-text-opacity: 1;color:rgb(145 138 171 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:underline{text-decoration-line:underline}.group\/key:hover .group-hover\/key\:opacity-100,.group\/row:hover .group-hover\/row\:opacity-100,.group\/sched:hover .group-hover\/sched\:opacity-100{opacity:1}.group\/sorthead:hover .group-hover\/sorthead\:opacity-40{opacity:.4}.group\/sub:hover .group-hover\/sub\:opacity-100,.group\/task:hover .group-hover\/task\:opacity-100,.group\/trace:hover .group-hover\/trace\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:w-72{width:18rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-\[1fr_240px\]{grid-template-columns:1fr 240px}.lg\:grid-cols-\[1fr_320px\]{grid-template-columns:1fr 320px}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}.lg\:grid-cols-\[1fr_360px\]{grid-template-columns:1fr 360px}.lg\:grid-cols-\[1fr_400px\]{grid-template-columns:1fr 400px}.lg\:grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.lg\:border-l{border-left-width:1px}.lg\:border-surface-border{--tw-border-opacity: 1;border-color:rgb(224 218 240 / var(--tw-border-opacity, 1))}.lg\:pl-12{padding-left:3rem}}
@@ -1,2 +0,0 @@
1
- import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{b as I,c as M,d as F,e as E,f as z,u as $}from"./users-DnxSh2dX.js";import{u as P}from"./useFilterParams-x-Dg0Vgz.js";import{D as R}from"./DataTable-D9yuBv0w.js";import{S as A}from"./StickyPagination-BWhFSr2d.js";import{F as O,b as G}from"./FilterBar-Ck4K4rzu.js";import{T as B}from"./TimestampCell-DxIz3l1J.js";import{C as w}from"./ConfirmDeleteModal-D9_1b4MW.js";import{R as U,a as b}from"./RowActions-Dg-Fsm5O.js";import{P as T}from"./PageHeader-B4w-LDUF.js";import{R as N}from"./RolePill-Dk-YUxCm.js";import{M as k}from"./Modal-CSrxpXeM.js";import{u as L,a as q,b as H,c as J,d as Q,e as V,f as W,g as X,h as Y}from"./bots-DOP_eck8.js";import{u as D}from"./roles-DuOWZTpx.js";import{T as Z}from"./TimeAgo-BLNstYO1.js";import{Q as ee,V as te,am as se,p as S,l as ae,O as K,U as ne,a as ie}from"./vendor-icons-5gSix3t2.js";import{f as le}from"./vendor-react-CXumBFUA.js";import"./index-BnB7G5bA.js";import"./EmptyState-BcsfPq9T.js";function re({open:a,onClose:l}){const t=I(),[n,i]=x.useState({external_id:"",email:"",display_name:"",password:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({external_id:"",email:"",display_name:"",password:""}));const m=()=>{n.external_id.trim()&&t.mutate({external_id:n.external_id.trim(),email:n.email.trim()||void 0,display_name:n.display_name.trim()||void 0,password:n.password||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create User",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"External ID (required)"}),e.jsx("input",{type:"text",value:n.external_id,onChange:s=>d("external_id",s.target.value),placeholder:"e.g., john.doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"John Doe",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:n.email,onChange:s=>d("email",s.target.value),placeholder:"john@example.com",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Password"}),e.jsx("input",{type:"password",value:n.password,onChange:s=>d("password",s.target.value),placeholder:"Leave blank for no password",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.external_id.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function ce({open:a,onClose:l,user:t}){const n=M(),[i,o]=x.useState({display_name:"",email:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",email:t.email??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,email:i.email.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Email"}),e.jsx("input",{type:"text",value:i.email,onChange:s=>o(r=>({...r,email:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function oe({open:a,onClose:l}){const t=L(),[n,i]=x.useState({name:"",display_name:"",description:""}),[o,p]=x.useState(a);a!==o&&(p(a),a&&i({name:"",display_name:"",description:""}));const m=()=>{n.name.trim()&&t.mutate({name:n.name.trim(),display_name:n.display_name.trim()||void 0,description:n.description.trim()||void 0},{onSuccess:l})},d=(s,r)=>i(h=>({...h,[s]:r}));return e.jsx(k,{open:a,onClose:l,title:"Create Bot",children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Name (required)"}),e.jsx("input",{type:"text",value:n.name,onChange:s=>d("name",s.target.value.replace(/\s+/g,"-").toLowerCase()),placeholder:"e.g., ci-bot",className:"input text-xs w-full font-mono"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:n.display_name,onChange:s=>d("display_name",s.target.value),placeholder:"CI Bot",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:n.description,onChange:s=>d("description",s.target.value),placeholder:"Runs scheduled workflows",className:"input text-xs w-full"})]}),t.error&&e.jsx("p",{className:"text-xs text-status-error",children:t.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:m,disabled:!n.name.trim()||t.isPending,className:"btn-primary text-xs",children:t.isPending?"Creating...":"Create"})]})]})})}function de({open:a,onClose:l,bot:t}){const n=q(),[i,o]=x.useState({display_name:"",description:"",status:"active"}),[p,m]=x.useState(t);t!==p&&(m(t),t&&o({display_name:t.display_name??"",description:t.description??"",status:t.status}));const d=()=>{t&&n.mutate({id:t.id,display_name:i.display_name.trim()||void 0,description:i.description.trim()||void 0,status:i.status},{onSuccess:l})};return e.jsx(k,{open:a,onClose:l,title:`Edit — ${(t==null?void 0:t.display_name)||(t==null?void 0:t.external_id)||""}`,children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:i.display_name,onChange:s=>o(r=>({...r,display_name:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Description"}),e.jsx("input",{type:"text",value:i.description,onChange:s=>o(r=>({...r,description:s.target.value})),className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-1",children:"Status"}),e.jsxs("select",{value:i.status,onChange:s=>o(r=>({...r,status:s.target.value})),className:"select text-xs w-full",children:[e.jsx("option",{value:"active",children:"Active"}),e.jsx("option",{value:"inactive",children:"Inactive"}),e.jsx("option",{value:"suspended",children:"Suspended"})]})]}),n.error&&e.jsx("p",{className:"text-xs text-status-error",children:n.error.message}),e.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[e.jsx("button",{onClick:l,className:"btn-secondary text-xs",children:"Cancel"}),e.jsx("button",{onClick:d,disabled:n.isPending,className:"btn-primary text-xs",children:n.isPending?"Saving...":"Save"})]})]})})}function xe({botId:a}){const{data:l}=H(a),t=J(),n=Q(),[i,o]=x.useState(""),[p,m]=x.useState(null),[d,s]=x.useState(!1),[r,h]=x.useState(null),v=(l==null?void 0:l.keys)??[],c=()=>{i.trim()&&t.mutate({botId:a,name:i.trim(),scopes:["mcp:tool:call"]},{onSuccess:y=>{m(y.rawKey),o("")}})},g=()=>{p&&(navigator.clipboard.writeText(p),s(!0),setTimeout(()=>s(!1),2e3))},f=()=>{r&&n.mutate({botId:a,keyId:r.id},{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"API Keys"}),p&&e.jsxs("div",{className:"mb-3 p-3 bg-status-success/10 border border-status-success/30 rounded-md",children:[e.jsx("p",{className:"text-[10px] font-semibold text-status-success mb-1",children:"Key generated — copy now, it won't be shown again"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"text-[11px] font-mono text-text-primary bg-surface-sunken px-2 py-1 rounded flex-1 overflow-hidden text-ellipsis",children:p}),e.jsx("button",{onClick:g,className:"text-text-tertiary hover:text-text-primary shrink-0",title:"Copy to clipboard",children:d?e.jsx(ee,{className:"w-3.5 h-3.5 text-status-success"}):e.jsx(te,{className:"w-3.5 h-3.5"})})]})]}),v.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No API keys."}):e.jsx("div",{className:"space-y-1.5 mb-3",children:v.map(y=>e.jsxs("div",{className:"group/key flex items-center justify-between px-2.5 py-1.5 bg-surface-sunken rounded text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(se,{className:"w-3 h-3 text-text-tertiary"}),e.jsx("span",{className:"text-text-primary font-mono",children:y.name}),y.last_used_at&&e.jsxs("span",{className:"text-[10px] text-text-tertiary",children:["used ",e.jsx(Z,{date:y.last_used_at})]})]}),e.jsx("button",{onClick:()=>h(y),className:"opacity-0 group-hover/key:opacity-100 transition-opacity text-text-tertiary hover:text-status-error",title:"Revoke key",children:e.jsx(S,{className:"w-3 h-3"})})]},y.id))}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:y=>o(y.target.value),placeholder:"Key name...",className:"input text-xs flex-1 font-mono"}),e.jsxs("button",{onClick:c,disabled:!i.trim()||t.isPending,className:"btn-primary text-xs inline-flex items-center gap-1",children:[e.jsx(ae,{className:"w-3 h-3"}),t.isPending?"...":"Generate"]})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:f,title:"Revoke API Key",description:e.jsxs(e.Fragment,{children:["Revoke API key"," ",e.jsx("span",{className:"font-medium text-text-primary font-mono",children:r==null?void 0:r.name}),"? This bot will no longer be able to authenticate with this key."]}),isPending:n.isPending,error:n.error})]})}function me({bot:a}){const{data:l}=D(),t=V(),n=W(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=a.roles??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{i.trim()&&t.mutate({botId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{n.mutate({botId:a.id,role:c})};return e.jsxs("div",{children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-3",children:"Roles"}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary mb-3",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2 mb-3",children:s.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})}function pe({bot:a}){return a?e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px] space-y-6",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),a.description&&e.jsx("p",{className:"text-xs text-text-tertiary mt-0.5",children:a.description})]}),e.jsx(xe,{botId:a.id}),e.jsx(me,{bot:a})]}):e.jsx("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a bot to manage its API keys and roles."})})}const ue={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function he({embedded:a=!1}){const{pagination:l}=P({filters:{}}),t=X(),[n,i]=x.useState(!1),[o,p]=x.useState(null),[m,d]=x.useState(null),[s,r]=x.useState(null),{data:h,isLoading:v}=Y({limit:l.pageSize,offset:l.offset}),c=(h==null?void 0:h.total)??0,g=(h==null?void 0:h.bots)??[],f=x.useMemo(()=>m?g.find(j=>j.id===m.id)??m:null,[g,m]),y=[{key:"display_name",label:"Bot",render:j=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ue[j.status]??"bg-status-pending"}`,title:j.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:j.display_name||j.external_id}),j.description&&e.jsx("p",{className:"text-xs text-text-tertiary",children:j.description})]})]})},{key:"roles",label:"Roles",render:j=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(j.roles??[]).map(u=>e.jsx(N,{role:u.role},u.role))})},{key:"created_at",label:"Created",render:j=>e.jsx(B,{date:j.created_at}),className:"w-44"},{key:"actions",label:"",render:j=>e.jsxs(U,{children:[e.jsx(b,{icon:K,title:"Edit bot",onClick:()=>p(j)}),e.jsx(b,{icon:S,title:"Delete bot",onClick:()=>r(j),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],C=()=>{s&&t.mutate(s.id,{onSuccess:()=>{r(null),(m==null?void 0:m.id)===s.id&&d(null)}})};return e.jsxs("div",{children:[a?e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}):e.jsx(T,{title:"Service Accounts",actions:e.jsx("button",{onClick:()=>i(!0),className:"btn-primary text-xs",children:"Add Bot"})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_360px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:y,data:g,keyFn:j=>j.id,isLoading:v,emptyMessage:"No bots yet",onRowClick:j=>d(j),activeRowKey:(f==null?void 0:f.id)??null}),e.jsx(A,{page:l.page,totalPages:l.totalPages(c),onPageChange:l.setPage,total:c,pageSize:l.pageSize,onPageSizeChange:l.setPageSize})]}),e.jsx(pe,{bot:f})]}),e.jsx(oe,{open:n,onClose:()=>i(!1)}),e.jsx(de,{open:!!o,onClose:()=>p(null),bot:o}),e.jsx(w,{open:!!s,onClose:()=>r(null),onConfirm:C,title:"Delete Bot",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(s==null?void 0:s.display_name)||(s==null?void 0:s.external_id)}),"? This will also revoke all API keys. This action cannot be undone."]}),isPending:t.isPending,error:t.error})]})}function je({user:a}){const{data:l}=D(),t=F(),n=E(),[i,o]=x.useState(""),[p,m]=x.useState("member"),d=(l==null?void 0:l.roles)??[],s=(a==null?void 0:a.roles)??[],r=x.useMemo(()=>{const c=new Set(s.map(g=>g.role));return d.filter(g=>!c.has(g))},[d,s]),h=()=>{!a||!i.trim()||t.mutate({userId:a.id,role:i.trim(),type:p},{onSuccess:()=>{o(""),m("member")}})},v=c=>{a&&n.mutate({userId:a.id,role:c})};return e.jsxs("div",{className:"border-l border-surface-border pl-6 pt-4 min-h-[300px]",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-4",children:"Role Membership"}),a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:a.display_name||a.external_id}),e.jsx("p",{className:"text-[10px] text-text-tertiary mt-0.5",children:"Member of:"})]}),s.length===0?e.jsx("p",{className:"text-xs text-text-tertiary",children:"No roles assigned."}):e.jsx("div",{className:"flex flex-wrap gap-2",children:s.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs bg-surface-sunken rounded-full text-text-secondary",children:[e.jsx(N,{role:c.role}),e.jsx("span",{className:"text-[9px] text-text-tertiary",children:c.type}),e.jsx("button",{onClick:()=>v(c.role),className:"text-text-tertiary hover:text-status-error transition-colors ml-0.5",title:`Remove ${c.role}`,children:"×"})]},c.role))}),r.length>0&&e.jsxs("div",{className:"pt-3 border-t border-surface-border",children:[e.jsx("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary mb-2",children:"Add Role"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("select",{value:i,onChange:c=>o(c.target.value),className:"select text-xs font-mono flex-1",children:[e.jsx("option",{value:"",children:"Select a role..."}),r.map(c=>e.jsx("option",{value:c,children:c},c))]}),e.jsxs("select",{value:p,onChange:c=>m(c.target.value),className:"select text-xs w-24",children:[e.jsx("option",{value:"member",children:"member"}),e.jsx("option",{value:"admin",children:"admin"}),e.jsx("option",{value:"superadmin",children:"superadmin"})]}),e.jsx("button",{onClick:h,disabled:!i||t.isPending,className:"btn-primary text-xs",children:t.isPending?"...":"Add"})]}),t.error&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:t.error.message})]})]}):e.jsx("p",{className:"text-xs text-text-tertiary",children:"Select a user to manage their roles."})]})}function ge({active:a,onChange:l}){const t=(n,i,o)=>e.jsxs("button",{onClick:()=>l(n),className:`flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-md transition-colors ${a===n?"bg-accent/10 text-accent font-medium":"text-text-tertiary hover:text-text-secondary hover:bg-surface-hover"}`,children:[i,o]});return e.jsxs("div",{className:"flex gap-1 p-0.5 bg-surface-sunken rounded-lg w-fit",children:[t("users",e.jsx(ne,{className:"w-3.5 h-3.5"}),"User Accounts"),t("service-accounts",e.jsx(ie,{className:"w-3.5 h-3.5"}),"Service Accounts")]})}const ye=[{value:"active",label:"Active"},{value:"inactive",label:"Inactive"},{value:"suspended",label:"Suspended"}],ve={active:"bg-status-success",inactive:"bg-text-tertiary",suspended:"bg-status-error"};function ze(){const[a,l]=le(),n=a.get("tab")==="service-accounts"?"service-accounts":"users",i=o=>{l(o==="users"?{}:{tab:o})};return e.jsxs("div",{children:[e.jsx(T,{title:"Accounts",docsHash:"#docs:dashboard.md:accounts",actions:e.jsx(ge,{active:n,onChange:i})}),n==="users"?e.jsx(fe,{}):e.jsx(he,{embedded:!0})]})}function fe(){const{filters:a,setFilter:l,pagination:t}=P({filters:{status:""}}),n=z(),[i,o]=x.useState(!1),[p,m]=x.useState(null),[d,s]=x.useState(null),[r,h]=x.useState(null),{data:v,isLoading:c}=$({status:a.status||void 0,limit:t.pageSize,offset:t.offset}),g=(v==null?void 0:v.total)??0,f=(v==null?void 0:v.users)??[],y=x.useMemo(()=>d?f.find(u=>u.id===d.id)??d:null,[f,d]),C=[{key:"display_name",label:"User",render:u=>e.jsxs("div",{className:"flex items-center gap-2.5",children:[e.jsx("span",{className:`w-2 h-2 rounded-full shrink-0 ${ve[u.status]??"bg-status-pending"}`,title:u.status}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-text-primary",children:u.display_name||u.external_id}),u.email&&e.jsx("p",{className:"text-xs text-text-tertiary",children:u.email})]})]})},{key:"roles",label:"Roles",render:u=>e.jsx("div",{className:"flex gap-1 flex-wrap",children:(u.roles??[]).map(_=>e.jsx(N,{role:_.role},_.role))})},{key:"created_at",label:"Created",render:u=>e.jsx(B,{date:u.created_at}),className:"w-44"},{key:"actions",label:"",render:u=>e.jsxs(U,{children:[e.jsx(b,{icon:K,title:"Edit user",onClick:()=>m(u)}),e.jsx(b,{icon:S,title:"Delete user",onClick:()=>h(u),colorClass:"text-text-tertiary hover:text-status-error"})]}),className:"w-16 text-right"}],j=()=>{r&&n.mutate(r.id,{onSuccess:()=>h(null)})};return e.jsxs("div",{children:[e.jsx("div",{className:"flex justify-end mb-4",children:e.jsx("button",{onClick:()=>o(!0),className:"btn-primary text-xs",children:"Add User"})}),e.jsx(O,{children:e.jsx(G,{label:"Status",value:a.status,onChange:u=>l("status",u),options:ye})}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1fr_320px] gap-6",children:[e.jsxs("div",{className:"overflow-x-clip",children:[e.jsx(R,{columns:C,data:f,keyFn:u=>u.id,isLoading:c,emptyMessage:"No users found",onRowClick:u=>s(u),activeRowKey:(y==null?void 0:y.id)??null}),e.jsx(A,{page:t.page,totalPages:t.totalPages(g),onPageChange:t.setPage,total:g,pageSize:t.pageSize,onPageSizeChange:t.setPageSize})]}),e.jsx(je,{user:y})]}),e.jsx(re,{open:i,onClose:()=>o(!1)}),e.jsx(ce,{open:!!p,onClose:()=>m(null),user:p}),e.jsx(w,{open:!!r,onClose:()=>h(null),onConfirm:j,title:"Delete User",description:e.jsxs(e.Fragment,{children:["Delete"," ",e.jsx("span",{className:"font-medium text-text-primary",children:(r==null?void 0:r.display_name)||(r==null?void 0:r.external_id)}),"? This action cannot be undone."]}),isPending:n.isPending,error:n.error})]})}export{ze as UsersPage};
2
- //# sourceMappingURL=index-EqKHsaVz.js.map
@@ -1,15 +0,0 @@
1
- import{a as x,j as e}from"./vendor-query-B2UbickB.js";import{e as Z,i as ee,u as Q,j as te,b as se}from"./workflows-zFmmxc08.js";import{D as re}from"./DataTable-D9yuBv0w.js";import{C as ae}from"./ConfirmDeleteModal-D9_1b4MW.js";import{F as ne,b as E}from"./FilterBar-Ck4K4rzu.js";import{R as oe,a as I}from"./RowActions-Dg-Fsm5O.js";import{u as le}from"./useFilterParams-x-Dg0Vgz.js";import{P as B}from"./PageHeader-B4w-LDUF.js";import{R as L}from"./RolePill-Dk-YUxCm.js";import{T as ie}from"./TaskQueuePill-BSFLiBcf.js";import{W as ce}from"./WorkflowPill-BkfIn8N3.js";import{ab as O,S as ue,ad as A,af as de,P as xe,ag as me,ah as pe,U as F,X as z,i as H,Q as V,c as $}from"./vendor-icons-5gSix3t2.js";import{c as Y,e as he,f as fe}from"./vendor-react-CXumBFUA.js";import{S as we}from"./StepIndicator-CuUIGxKk.js";import{u as ve}from"./roles-DuOWZTpx.js";import{B as je}from"./BotPicker-CAowL3ib.js";import"./index-BnB7G5bA.js";import"./EmptyState-BcsfPq9T.js";import"./Modal-CSrxpXeM.js";import"./bots-DOP_eck8.js";function ke(t,r){const l=r.toLowerCase();return t.workflow_type.toLowerCase().includes(l)||(t.description??"").toLowerCase().includes(l)}function Ve(){const t=Y(),{data:r,isLoading:l}=Z(),d=ee(),{filters:a,setFilter:i}=le({filters:{search:"",queue:"",role:"",tier:""}}),[u,y]=x.useState(a.search),[p,N]=x.useState(null);x.useEffect(()=>{if(u===a.search)return;const s=setTimeout(()=>i("search",u),300);return()=>clearTimeout(s)},[u,i,a.search]);const o=r??[],m=x.useMemo(()=>[...new Set(o.map(s=>s.task_queue).filter(Boolean))].sort(),[o]),c=x.useMemo(()=>[...new Set(o.flatMap(s=>s.roles??[]))].sort(),[o]),n=x.useMemo(()=>{let s=o;return a.search&&(s=s.filter(f=>ke(f,a.search))),a.queue&&(s=s.filter(f=>f.task_queue===a.queue)),a.role&&(s=s.filter(f=>(f.roles??[]).includes(a.role))),a.tier&&(s=s.filter(f=>f.tier===a.tier)),s},[o,a]),_=[{key:"workflow_type",label:"Workflow",className:"max-w-xs",render:s=>e.jsxs("div",{className:"min-w-0",children:[e.jsx(ce,{type:s.workflow_type,size:"md",variant:s.tier==="certified"?"certified":s.tier==="configured"?"configured":"durable"}),s.description&&e.jsx("p",{className:"text-[10px] leading-tight text-text-quaternary mt-0.5",children:s.description})]})},{key:"task_queue",label:"Queue",render:s=>s.task_queue?e.jsx(ie,{queue:s.task_queue}):e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}),className:"whitespace-nowrap"},{key:"tier",label:"Tier",render:s=>s.tier==="certified"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsx(O,{className:"w-3 h-3"}),"Certified"]}):s.tier==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsx(ue,{className:"w-3 h-3"}),"Configured"]}):e.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary",children:[e.jsx(A,{className:"w-3 h-3"}),"Durable"]}),className:"whitespace-nowrap"},{key:"roles",label:"Access",render:s=>{if(!s.registered)return e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"});const f=s.roles??[],w=s.invocation_roles??[];return!f.length&&!w.length?e.jsx("span",{className:"text-xs text-text-tertiary",children:"—"}):e.jsxs("div",{className:"space-y-1.5",children:[f.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{title:"Escalation roles",children:e.jsx(O,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),e.jsx("div",{className:"flex gap-1 flex-wrap",children:f.map(b=>e.jsx(L,{role:b},`e-${b}`))})]}),w.length>0&&e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{title:"Invocation roles",children:e.jsx(de,{className:"w-3 h-3 text-text-quaternary shrink-0"})}),e.jsx("div",{className:"flex gap-1 flex-wrap",children:w.map(b=>e.jsx(L,{role:b},`i-${b}`))})]})]})}},{key:"actions",label:"",render:s=>e.jsxs(oe,{children:[s.invocable&&e.jsx(I,{icon:xe,title:"Invoke workflow",onClick:()=>t(`/workflows/start?type=${encodeURIComponent(s.workflow_type)}&mode=now`),colorClass:"text-text-tertiary hover:text-status-success"}),s.tier==="durable"&&e.jsx(I,{icon:A,title:"Configure workflow",onClick:()=>t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`),colorClass:"text-text-tertiary hover:text-status-info"}),s.tier==="configured"&&e.jsx(I,{icon:me,title:"Certify workflow",onClick:()=>t(`/workflows/registry/${encodeURIComponent(s.workflow_type)}`),colorClass:"text-text-tertiary hover:text-status-success"}),s.registered&&e.jsx(I,{icon:pe,title:"Remove configuration",onClick:()=>N(s.workflow_type),colorClass:"text-text-tertiary hover:text-status-warning"})]}),className:"w-16 text-right"}],R=()=>{p&&d.mutate(p,{onSuccess:()=>N(null)})},C=s=>{s.registered?t(`/workflows/registry/${encodeURIComponent(s.workflow_type)}`):t(`/workflows/registry/new?workflow_type=${encodeURIComponent(s.workflow_type)}&task_queue=${encodeURIComponent(s.task_queue??"")}`)};return e.jsxs("div",{children:[e.jsx(B,{title:"Workflow Registry",docsHash:"#docs:dashboard.md:workflow-registry",actions:e.jsx("button",{onClick:()=>t("/workflows/registry/new"),className:"btn-primary text-xs",children:"Register Workflow"})}),e.jsxs(ne,{children:[e.jsx("input",{type:"text",placeholder:"Search workflow type...",value:u,onChange:s=>y(s.target.value),className:"input text-[11px] py-1 px-2 w-56"}),e.jsx(E,{label:"Queue",value:a.queue,onChange:s=>i("queue",s),options:m.map(s=>({value:s,label:s}))}),e.jsx(E,{label:"Tier",value:a.tier,onChange:s=>i("tier",s),options:[{value:"certified",label:"Certified"},{value:"configured",label:"Configured"},{value:"durable",label:"Durable"}]}),e.jsx(E,{label:"Role",value:a.role,onChange:s=>i("role",s),options:c.map(s=>({value:s,label:s}))})]}),e.jsx(re,{columns:_,data:n,keyFn:s=>s.workflow_type,onRowClick:C,isLoading:l,emptyMessage:"No workflows found"}),e.jsx(ae,{open:!!p,onClose:()=>N(null),onConfirm:R,title:"De-certify Workflow",description:e.jsxs(e.Fragment,{children:["Remove certification from ",e.jsx("span",{className:"font-mono font-medium text-text-primary",children:p}),"? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow."]}),isPending:d.isPending,error:d.error})]})}function S(t){return t.split(",").map(r=>r.trim()).filter(Boolean)}const T={workflow_type:"",description:"",task_queue:"",default_role:"reviewer",invocable:!1,roles:"",invocation_roles:"",consumes:"",envelope_schema:"",resolver_schema:"",cron_schedule:"",execute_as:"",certified:!1};function ge(t){const r=(t.roles??[]).join(", "),l=(t.consumes??[]).join(", ");return{workflow_type:t.workflow_type,description:t.description??"",task_queue:t.task_queue??"",default_role:t.default_role,invocable:t.invocable,roles:r,invocation_roles:(t.invocation_roles??[]).join(", "),consumes:l,envelope_schema:t.envelope_schema?JSON.stringify(t.envelope_schema,null,2):"",resolver_schema:t.resolver_schema?JSON.stringify(t.resolver_schema,null,2):"",cron_schedule:t.cron_schedule??"",execute_as:t.execute_as??"",certified:!!(r||l)}}const U=["Identity","Invocation","Advanced"];function P(t){if(!t.trim())return!0;try{return JSON.parse(t),!0}catch{return!1}}function J(t,r){return t===1?!!r.workflow_type.trim():t===2?P(r.envelope_schema):t===3?P(r.resolver_schema):!0}const g="label",j="hint",G="input-json w-full";function D({selected:t,onChange:r,single:l,placeholder:d}){const{data:a}=ve(),i=(a==null?void 0:a.roles)??[],[u,y]=x.useState(!1),p=x.useRef(null);x.useEffect(()=>{const c=n=>{p.current&&!p.current.contains(n.target)&&y(!1)};return document.addEventListener("mousedown",c),()=>document.removeEventListener("mousedown",c)},[]);const N=c=>{l?(r(t.includes(c)?[]:[c]),y(!1)):r(t.includes(c)?t.filter(n=>n!==c):[...t,c])},o=c=>{r(t.filter(n=>n!==c))},m=d??(l?"Select role...":"Add roles...");return e.jsxs("div",{ref:p,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>y(!u),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[t.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:m}),t.map(c=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]",children:[e.jsx(F,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),c,e.jsx("span",{role:"button",onClick:n=>{n.stopPropagation(),o(c)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},c)),e.jsx(H,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${u?"rotate-180":""}`})]}),u&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:i.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No roles defined"}):i.map(c=>{const n=t.includes(c);return e.jsxs("button",{type:"button",onClick:()=>N(c),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${n?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx(F,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:c}),n&&e.jsx(V,{className:"w-3 h-3 shrink-0"})]},c)})})]})}function ye({options:t,selected:r,onChange:l,placeholder:d}){const[a,i]=x.useState(!1),u=x.useRef(null);x.useEffect(()=>{const o=m=>{u.current&&!u.current.contains(m.target)&&i(!1)};return document.addEventListener("mousedown",o),()=>document.removeEventListener("mousedown",o)},[]);const y=o=>{l(r.includes(o)?r.filter(m=>m!==o):[...r,o])},p=o=>{l(r.filter(m=>m!==o))},N=d??"Add workflows...";return e.jsxs("div",{ref:u,className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>i(!a),className:"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none",children:[r.length===0&&e.jsx("span",{className:"text-xs text-text-tertiary",children:N}),r.map(o=>e.jsxs("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono",children:[e.jsx($,{className:"w-2.5 h-2.5 shrink-0 text-accent/75"}),o,e.jsx("span",{role:"button",onClick:m=>{m.stopPropagation(),p(o)},className:"ml-0.5 hover:text-status-error transition-colors",children:e.jsx(z,{className:"w-2.5 h-2.5"})})]},o)),e.jsx(H,{className:`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${a?"rotate-180":""}`})]}),a&&e.jsx("div",{className:"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto",children:t.length===0?e.jsx("p",{className:"px-3 py-2 text-xs text-text-tertiary",children:"No registered workflows"}):t.map(o=>{const m=r.includes(o);return e.jsxs("button",{type:"button",onClick:()=>y(o),className:`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${m?"bg-accent/[0.06] text-accent":"text-text-primary hover:bg-surface-sunken"}`,children:[e.jsx($,{className:"w-3 h-3 shrink-0 text-accent/60"}),e.jsx("span",{className:"flex-1",children:o}),m&&e.jsx(V,{className:"w-3 h-3 shrink-0"})]},o)})})]})}function W(t){return S(t)}function M(t){return t.join(", ")}function Ne({form:t,set:r}){const{data:l}=Q(),d=(l??[]).map(a=>a.workflow_type).filter(a=>a!==t.workflow_type);return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Resolver Schema"}),e.jsx("textarea",{value:t.resolver_schema,onChange:a=>r("resolver_schema",a.target.value),placeholder:`{
2
- "properties": {
3
- "approved": { "type": "boolean", "default": false, "description": "Approve?" },
4
- "notes": { "type": "string", "default": "", "description": "Reviewer notes" }
5
- }
6
- }`,className:G,rows:8,spellCheck:!1}),e.jsxs("p",{className:j,children:["Default form template for resolving escalations from this workflow. Use ",e.jsx("span",{className:"font-mono",children:"properties"})," with ",e.jsx("span",{className:"font-mono",children:"type"}),", ",e.jsx("span",{className:"font-mono",children:"default"}),", ",e.jsx("span",{className:"font-mono",children:"description"}),", ",e.jsx("span",{className:"font-mono",children:"enum"}),", and ",e.jsx("span",{className:"font-mono",children:"format"})," for typed form fields."]}),t.resolver_schema.trim()&&!P(t.resolver_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]}),e.jsx("div",{className:"flex gap-6 pt-1",children:e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:t.certified,onChange:a=>r("certified",a.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Certify for HITL Escalation"})]})}),e.jsx("p",{className:j,children:"Certified workflows use the interceptor to wrap executions — failures escalate to human reviewers instead of throwing."}),t.certified?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Default Escalation Role"}),e.jsx(D,{selected:W(t.default_role),onChange:a=>r("default_role",a[0]??""),single:!0,placeholder:"Select escalation role..."}),e.jsx("p",{className:j,children:"When this workflow escalates, assign to users with this role"})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Escalation Roles"}),e.jsx(D,{selected:W(t.roles),onChange:a=>r("roles",M(a)),placeholder:"Select who can resolve escalations..."}),e.jsx("p",{className:j,children:"Users with any of these roles can claim and resolve escalations from this workflow."})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Consumes"}),e.jsx(ye,{options:d,selected:W(t.consumes),onChange:a=>r("consumes",M(a)),placeholder:"Select workflow dependencies..."}),e.jsx("p",{className:j,children:"Output from these upstream workflows will be injected into the input envelope for this workflow."})]})]}):e.jsx("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxs("p",{className:"text-xs text-text-tertiary",children:["This workflow will run as standard durable without the interceptor. Enable"," ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Certify for HITL Escalation"})," ","to add automatic escalation routing and role-based resolution."]})})]})}function be(t){return S(t)}function _e(t){return t.join(", ")}function Ce({form:t,set:r,editing:l,durableTypes:d=[]}){const a=!l&&d.length>0;return e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Workflow Type"}),a&&!t.workflow_type?e.jsxs("div",{className:"space-y-2",children:[e.jsx("p",{className:"text-xs text-text-secondary",children:"Select a durable workflow to register:"}),e.jsx("div",{className:"grid gap-1",children:d.map(i=>e.jsx("button",{onClick:()=>r("workflow_type",i),className:"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors",children:i},i))}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx("span",{className:"text-[10px] text-text-tertiary",children:"or"}),e.jsx("input",{type:"text",onChange:i=>r("workflow_type",i.target.value),placeholder:"Enter a workflow type manually",className:"input font-mono flex-1"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",value:t.workflow_type,onChange:i=>r("workflow_type",i.target.value),disabled:l,placeholder:"reviewContent",className:"input font-mono w-full"}),!l&&t.workflow_type&&d.length>0&&e.jsx("button",{onClick:()=>r("workflow_type",""),className:"text-[10px] text-accent hover:underline mt-1",children:"Choose from durable workflows"})]}),e.jsx("p",{className:j,children:"Register a workflow to configure invocation schemas and dashboard visibility. Certification for HITL escalation is optional (step 3)."})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Description"}),e.jsx("input",{type:"text",value:t.description,onChange:i=>r("description",i.target.value),placeholder:"AI-powered content moderation with human escalation",className:"input text-xs w-full"})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Task Queue"}),e.jsx("input",{type:"text",value:t.task_queue,onChange:i=>r("task_queue",i.target.value),placeholder:"lt-review",className:"input font-mono w-full"}),e.jsx("p",{className:j,children:"Durable task queue this workflow listens on"})]})]})}function Se({form:t,set:r}){return e.jsxs("div",{className:"space-y-5",children:[e.jsx("div",{className:"flex gap-6 pt-1",children:e.jsxs("label",{className:"flex items-center gap-2 cursor-pointer",children:[e.jsx("input",{type:"checkbox",checked:t.invocable,onChange:l=>r("invocable",l.target.checked),className:"w-4 h-4 rounded border-border accent-accent"}),e.jsx("span",{className:"text-xs text-text-primary font-medium",children:"Invocable"})]})}),e.jsx("p",{className:j,children:"Allow this workflow to be started from the dashboard or API."}),t.invocable&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Run As"}),e.jsx(je,{selected:t.execute_as,onChange:l=>r("execute_as",l)}),e.jsx("p",{className:j,children:"Choose a bot to execute this workflow under its identity and credentials. Default runs as the invoking user."})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Invocation Roles"}),e.jsx(D,{selected:be(t.invocation_roles),onChange:l=>r("invocation_roles",_e(l)),placeholder:"Select who can start this workflow..."}),e.jsx("p",{className:j,children:"Only users with these roles can start this workflow. Leave empty to allow all authenticated users."})]}),e.jsxs("div",{children:[e.jsx("label",{className:g,children:"Envelope Schema"}),e.jsx("textarea",{value:t.envelope_schema,onChange:l=>r("envelope_schema",l.target.value),placeholder:`{
7
- "data": {
8
- "contentId": "example-123",
9
- "content": "Text to review"
10
- },
11
- "metadata": {
12
- "source": "dashboard"
13
- }
14
- }`,className:G,rows:8,spellCheck:!1}),e.jsxs("p",{className:j,children:["Pre-fills the JSON editor when invoking this workflow. Should include ",e.jsx("span",{className:"font-mono",children:"data"})," (workflow input) and optional ",e.jsx("span",{className:"font-mono",children:"metadata"})," (context)."]}),t.envelope_schema.trim()&&!P(t.envelope_schema)&&e.jsx("p",{className:"text-[10px] text-status-error mt-1",children:"Invalid JSON"})]})]}),!t.invocable&&e.jsx("div",{className:"py-4 px-4 bg-surface-sunken/50 rounded-md text-center",children:e.jsxs("p",{className:"text-xs text-text-tertiary",children:["Enable ",e.jsx("span",{className:"font-medium text-text-secondary",children:"Invocable"})," above to configure who can start this workflow and set an input template."]})})]})}function Ye(){const{workflowType:t}=he(),r=!t,l=Y(),{data:d,isLoading:a}=Q(),i=te(),u=(d==null?void 0:d.find(h=>h.workflow_type===t))??null,y=new Set(["mcpQuery","mcpDeterministic","mcpQueryRouter","mcpTriage","mcpTriageRouter","mcpTriageDeterministic","insightQuery"]),{data:p}=se({limit:500}),N=x.useMemo(()=>{const h=new Set((d??[]).map(v=>v.workflow_type));return[...new Set(((p==null?void 0:p.jobs)??[]).map(v=>v.entity))].filter(v=>!h.has(v)&&!y.has(v)).sort()},[d,p]),[o,m]=fe(),c=x.useMemo(()=>{if(!r)return T;const h=o.get("workflow_type")??"",k=o.get("task_queue")??"";return!h&&!k?T:{...T,workflow_type:h,task_queue:k}},[r,o]),[n,_]=x.useState(c),[R,C]=x.useState(""),[s,f]=x.useState(!1),w=parseInt(o.get("step")||"1",10),b=x.useCallback(h=>{m(k=>{const v=new URLSearchParams(k);return v.set("step",String(h)),v},{replace:!1})},[m]);x.useEffect(()=>{if(!s){if(r){_(c),f(!0);return}u&&(_(ge(u)),f(!0))}},[u,r,s,c]);const q=(h,k)=>_(v=>({...v,[h]:k})),K=()=>{if(!n.workflow_type.trim())return;C("");let h=null,k=null;try{n.envelope_schema.trim()&&(h=JSON.parse(n.envelope_schema))}catch{C("Invalid JSON in Envelope Schema");return}try{n.resolver_schema.trim()&&(k=JSON.parse(n.resolver_schema))}catch{C("Invalid JSON in Resolver Schema");return}i.mutate({workflow_type:n.workflow_type.trim(),description:n.description.trim()||null,task_queue:n.task_queue.trim()||null,default_role:n.default_role.trim()||"reviewer",invocable:n.invocable,roles:S(n.roles),invocation_roles:S(n.invocation_roles),consumes:S(n.consumes),envelope_schema:h,resolver_schema:k,cron_schedule:n.cron_schedule.trim()||null,execute_as:n.execute_as.trim()||null},{onSuccess:()=>{l("/workflows/registry")}})};if(a)return e.jsxs("div",{className:"animate-pulse space-y-4",children:[e.jsx("div",{className:"h-8 bg-surface-sunken rounded w-48"}),e.jsx("div",{className:"h-60 bg-surface-sunken rounded"})]});if(!r&&!u)return e.jsx("p",{className:"text-sm text-text-secondary",children:"Config not found."});const X=w===U.length;return e.jsxs("div",{children:[e.jsx(B,{title:r?"Register Workflow":(u==null?void 0:u.workflow_type)??""}),e.jsxs("div",{className:"max-w-3xl",children:[e.jsx(we,{steps:U,currentStep:w-1,onStepClick:h=>b(h+1)}),e.jsxs("div",{className:"min-h-[360px] py-2",children:[w===1&&e.jsx(Ce,{form:n,set:q,editing:!!u,durableTypes:N}),w===2&&e.jsx(Se,{form:n,set:q}),w===3&&e.jsx(Ne,{form:n,set:q})]}),(R||i.error)&&e.jsx("p",{className:"text-xs text-status-error mt-4",children:R||i.error.message}),e.jsxs("div",{className:"flex justify-between items-center pt-4 border-t border-surface-border mt-4",children:[e.jsx("div",{children:w>1&&e.jsx("button",{onClick:()=>b(w-1),className:"btn-secondary text-xs",children:"Back"})}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx("button",{onClick:()=>l("/workflows/registry"),className:"btn-ghost text-xs",children:"Cancel"}),X?e.jsx("button",{onClick:K,disabled:!J(w,n)||i.isPending,className:"btn-primary text-xs",children:i.isPending?"Saving...":u?"Save":"Create"}):e.jsx("button",{onClick:()=>b(w+1),disabled:!J(w,n),className:"btn-primary text-xs",children:"Next"})]})]})]})]})}export{Ye as WorkflowConfigDetailPage,Ve as WorkflowConfigsPage};
15
- //# sourceMappingURL=index-ox042ec_.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-ox042ec_.js","sources":["../../src/pages/workflows/registry/WorkflowConfigsPage.tsx","../../src/lib/parse.ts","../../src/pages/workflows/registry/config-form-types.ts","../../src/components/common/form/RolePicker.tsx","../../src/components/common/form/WorkflowPicker.tsx","../../src/pages/workflows/registry/AdvancedStep.tsx","../../src/pages/workflows/registry/ConfigWizardSteps.tsx","../../src/pages/workflows/registry/WorkflowConfigDetailPage.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n useDiscoveredWorkflows,\n useDeleteWorkflowConfig,\n} from '../../../api/workflows';\nimport { ShieldCheck, ShieldPlus, ShieldOff, Settings, Wrench, Play, UserCheck } from 'lucide-react';\nimport { DataTable, type Column } from '../../../components/common/data/DataTable';\nimport { ConfirmDeleteModal } from '../../../components/common/modal/ConfirmDeleteModal';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { RowAction, RowActionGroup } from '../../../components/common/layout/RowActions';\nimport { useFilterParams } from '../../../hooks/useFilterParams';\nimport type { DiscoveredWorkflow } from '../../../api/types';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { RolePill } from '../../../components/common/display/RolePill';\nimport { TaskQueuePill } from '../../../components/common/display/TaskQueuePill';\nimport { WorkflowPill } from '../../../components/common/display/WorkflowPill';\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction matchesSearch(wf: DiscoveredWorkflow, search: string): boolean {\n const q = search.toLowerCase();\n return (\n wf.workflow_type.toLowerCase().includes(q) ||\n (wf.description ?? '').toLowerCase().includes(q)\n );\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport function WorkflowConfigsPage() {\n const navigate = useNavigate();\n const { data, isLoading } = useDiscoveredWorkflows();\n const deleteConfig = useDeleteWorkflowConfig();\n const { filters, setFilter } = useFilterParams({\n filters: { search: '', queue: '', role: '', tier: '' },\n });\n\n const [searchInput, setSearchInput] = useState(filters.search);\n const [confirmDelete, setConfirmDelete] = useState<string | null>(null);\n\n // Debounce search input\n useEffect(() => {\n if (searchInput === filters.search) return;\n const timer = setTimeout(() => setFilter('search', searchInput), 300);\n return () => clearTimeout(timer);\n }, [searchInput, setFilter, filters.search]);\n\n const allWorkflows = data ?? [];\n\n // Derive facet options from data\n const queues = useMemo(\n () => [...new Set(allWorkflows.map((w) => w.task_queue).filter(Boolean) as string[])].sort(),\n [allWorkflows],\n );\n const roles = useMemo(\n () => [...new Set(allWorkflows.flatMap((w) => w.roles ?? []))].sort(),\n [allWorkflows],\n );\n\n // Apply client-side filters\n const workflows = useMemo(() => {\n let result = allWorkflows;\n if (filters.search) result = result.filter((w) => matchesSearch(w, filters.search));\n if (filters.queue) result = result.filter((w) => w.task_queue === filters.queue);\n if (filters.role) result = result.filter((w) => (w.roles ?? []).includes(filters.role));\n if (filters.tier) result = result.filter((w) => w.tier === filters.tier);\n return result;\n }, [allWorkflows, filters]);\n\n const columns: Column<DiscoveredWorkflow>[] = [\n {\n key: 'workflow_type',\n label: 'Workflow',\n className: 'max-w-xs',\n render: (row) => (\n <div className=\"min-w-0\">\n <WorkflowPill type={row.workflow_type} size=\"md\" variant={row.tier === 'certified' ? 'certified' : row.tier === 'configured' ? 'configured' : 'durable'} />\n {row.description && (\n <p className=\"text-[10px] leading-tight text-text-quaternary mt-0.5\">{row.description}</p>\n )}\n </div>\n ),\n },\n {\n key: 'task_queue',\n label: 'Queue',\n render: (row) => row.task_queue ? <TaskQueuePill queue={row.task_queue} /> : <span className=\"text-xs text-text-tertiary\">—</span>,\n className: 'whitespace-nowrap',\n },\n {\n key: 'tier',\n label: 'Tier',\n render: (row) => {\n if (row.tier === 'certified') return <span className=\"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary\"><ShieldCheck className=\"w-3 h-3\" />Certified</span>;\n if (row.tier === 'configured') return <span className=\"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary\"><Settings className=\"w-3 h-3\" />Configured</span>;\n return <span className=\"inline-flex items-center gap-1 text-[10px] font-medium text-text-secondary\"><Wrench className=\"w-3 h-3\" />Durable</span>;\n },\n className: 'whitespace-nowrap',\n },\n {\n key: 'roles',\n label: 'Access',\n render: (row) => {\n if (!row.registered) return <span className=\"text-xs text-text-tertiary\">—</span>;\n const escRoles = row.roles ?? [];\n const invokeRoles = row.invocation_roles ?? [];\n if (!escRoles.length && !invokeRoles.length) return <span className=\"text-xs text-text-tertiary\">—</span>;\n return (\n <div className=\"space-y-1.5\">\n {escRoles.length > 0 && (\n <div className=\"flex items-center gap-1.5\">\n <span title=\"Escalation roles\"><ShieldCheck className=\"w-3 h-3 text-text-quaternary shrink-0\" /></span>\n <div className=\"flex gap-1 flex-wrap\">{escRoles.map((r) => <RolePill key={`e-${r}`} role={r} />)}</div>\n </div>\n )}\n {invokeRoles.length > 0 && (\n <div className=\"flex items-center gap-1.5\">\n <span title=\"Invocation roles\"><UserCheck className=\"w-3 h-3 text-text-quaternary shrink-0\" /></span>\n <div className=\"flex gap-1 flex-wrap\">{invokeRoles.map((r) => <RolePill key={`i-${r}`} role={r} />)}</div>\n </div>\n )}\n </div>\n );\n },\n },\n {\n key: 'actions',\n label: '',\n render: (row) => (\n <RowActionGroup>\n {row.invocable && (\n <RowAction\n icon={Play}\n title=\"Invoke workflow\"\n onClick={() => navigate(`/workflows/start?type=${encodeURIComponent(row.workflow_type)}&mode=now`)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n {row.tier === 'durable' && (\n <RowAction\n icon={Wrench}\n title=\"Configure workflow\"\n onClick={() => navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`)}\n colorClass=\"text-text-tertiary hover:text-status-info\"\n />\n )}\n {row.tier === 'configured' && (\n <RowAction\n icon={ShieldPlus}\n title=\"Certify workflow\"\n onClick={() => navigate(`/workflows/registry/${encodeURIComponent(row.workflow_type)}`)}\n colorClass=\"text-text-tertiary hover:text-status-success\"\n />\n )}\n {row.registered && (\n <RowAction\n icon={ShieldOff}\n title=\"Remove configuration\"\n onClick={() => setConfirmDelete(row.workflow_type)}\n colorClass=\"text-text-tertiary hover:text-status-warning\"\n />\n )}\n </RowActionGroup>\n ),\n className: 'w-16 text-right',\n },\n ];\n\n const handleDelete = () => {\n if (!confirmDelete) return;\n deleteConfig.mutate(confirmDelete, {\n onSuccess: () => setConfirmDelete(null),\n });\n };\n\n const handleRowClick = (row: DiscoveredWorkflow) => {\n if (row.registered) {\n navigate(`/workflows/registry/${encodeURIComponent(row.workflow_type)}`);\n } else {\n navigate(`/workflows/registry/new?workflow_type=${encodeURIComponent(row.workflow_type)}&task_queue=${encodeURIComponent(row.task_queue ?? '')}`);\n }\n };\n\n return (\n <div>\n <PageHeader\n title=\"Workflow Registry\"\n docsHash=\"#docs:dashboard.md:workflow-registry\"\n actions={\n <button\n onClick={() => navigate('/workflows/registry/new')}\n className=\"btn-primary text-xs\"\n >\n Register Workflow\n </button>\n }\n />\n\n <FilterBar>\n <input\n type=\"text\"\n placeholder=\"Search workflow type...\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"input text-[11px] py-1 px-2 w-56\"\n />\n <FilterSelect\n label=\"Queue\"\n value={filters.queue}\n onChange={(v) => setFilter('queue', v)}\n options={queues.map((q) => ({ value: q, label: q }))}\n />\n <FilterSelect\n label=\"Tier\"\n value={filters.tier}\n onChange={(v) => setFilter('tier', v)}\n options={[\n { value: 'certified', label: 'Certified' },\n { value: 'configured', label: 'Configured' },\n { value: 'durable', label: 'Durable' },\n ]}\n />\n <FilterSelect\n label=\"Role\"\n value={filters.role}\n onChange={(v) => setFilter('role', v)}\n options={roles.map((r) => ({ value: r, label: r }))}\n />\n </FilterBar>\n\n <DataTable\n columns={columns}\n data={workflows}\n keyFn={(row) => row.workflow_type}\n onRowClick={handleRowClick}\n isLoading={isLoading}\n emptyMessage=\"No workflows found\"\n />\n\n {/* Delete confirmation modal */}\n <ConfirmDeleteModal\n open={!!confirmDelete}\n onClose={() => setConfirmDelete(null)}\n onConfirm={handleDelete}\n title=\"De-certify Workflow\"\n description={<>Remove certification from <span className=\"font-mono font-medium text-text-primary\">{confirmDelete}</span>? This removes interceptor guarantees, escalation chains, and invocation role constraints. The workflow will continue running as a standard durable workflow.</>}\n isPending={deleteConfig.isPending}\n error={deleteConfig.error as Error | null}\n />\n </div>\n );\n}\n","export function splitCsv(s: string): string[] {\n return s\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n}\n\nexport function safeParseJson<T = unknown>(\n json: string,\n): { ok: true; data: T } | { ok: false; error: string } {\n try {\n return { ok: true, data: JSON.parse(json) as T };\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'Invalid JSON';\n return { ok: false, error: message };\n }\n}\n","import type { LTWorkflowConfig } from '../../../api/types';\n\nexport interface ConfigFormState {\n workflow_type: string;\n description: string;\n task_queue: string;\n default_role: string;\n invocable: boolean;\n roles: string;\n invocation_roles: string;\n consumes: string;\n envelope_schema: string;\n resolver_schema: string;\n cron_schedule: string;\n execute_as: string;\n /** UI-only — gates escalation fields in the wizard. Not sent to backend. */\n certified: boolean;\n}\n\nexport const EMPTY_FORM: ConfigFormState = {\n workflow_type: '',\n description: '',\n task_queue: '',\n default_role: 'reviewer',\n invocable: false,\n roles: '',\n invocation_roles: '',\n consumes: '',\n envelope_schema: '',\n resolver_schema: '',\n cron_schedule: '',\n execute_as: '',\n certified: false,\n};\n\nexport function configToForm(c: LTWorkflowConfig): ConfigFormState {\n const roles = (c.roles ?? []).join(', ');\n const consumes = (c.consumes ?? []).join(', ');\n return {\n workflow_type: c.workflow_type,\n description: c.description ?? '',\n task_queue: c.task_queue ?? '',\n default_role: c.default_role,\n invocable: c.invocable,\n roles,\n invocation_roles: (c.invocation_roles ?? []).join(', '),\n consumes,\n envelope_schema: c.envelope_schema ? JSON.stringify(c.envelope_schema, null, 2) : '',\n resolver_schema: c.resolver_schema ? JSON.stringify(c.resolver_schema, null, 2) : '',\n cron_schedule: c.cron_schedule ?? '',\n execute_as: c.execute_as ?? '',\n certified: !!(roles || consumes),\n };\n}\n\nexport const STEP_LABELS = ['Identity', 'Invocation', 'Advanced'];\n\nexport function jsonValid(v: string): boolean {\n if (!v.trim()) return true;\n try { JSON.parse(v); return true; } catch { return false; }\n}\n\nexport function isStepValid(step: number, form: ConfigFormState): boolean {\n if (step === 1) return !!form.workflow_type.trim();\n if (step === 2) return jsonValid(form.envelope_schema);\n if (step === 3) return jsonValid(form.resolver_schema);\n return true;\n}\n\nexport const labelCls = 'label';\nexport const hintCls = 'hint';\nexport const jsonCls = 'input-json w-full';\n\nexport const DEFAULT_ENVELOPE = '{\\n \"data\": {},\\n \"metadata\": {}\\n}';\n","import { useState, useRef, useEffect } from 'react';\nimport { User, X, ChevronDown, Check } from 'lucide-react';\nimport { useRoles } from '../../../api/roles';\n\ninterface RolePickerProps {\n selected: string[];\n onChange: (roles: string[]) => void;\n /** Only allow one selection */\n single?: boolean;\n placeholder?: string;\n}\n\nexport function RolePicker({ selected, onChange, single, placeholder }: RolePickerProps) {\n const { data } = useRoles();\n const allRoles = data?.roles ?? [];\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (role: string) => {\n if (single) {\n onChange(selected.includes(role) ? [] : [role]);\n setOpen(false);\n } else {\n onChange(\n selected.includes(role)\n ? selected.filter((r) => r !== role)\n : [...selected, role],\n );\n }\n };\n\n const remove = (role: string) => {\n onChange(selected.filter((r) => r !== role));\n };\n\n const placeholderText = placeholder ?? (single ? 'Select role...' : 'Add roles...');\n\n return (\n <div ref={ref} className=\"relative\">\n {/* Selected pills + trigger */}\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((role) => (\n <span\n key={role}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px]\"\n >\n <User className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {role}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(role); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {allRoles.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No roles defined</p>\n ) : (\n allRoles.map((role) => {\n const isSelected = selected.includes(role);\n return (\n <button\n key={role}\n type=\"button\"\n onClick={() => toggle(role)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <User className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{role}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { Workflow, X, ChevronDown, Check } from 'lucide-react';\n\ninterface WorkflowPickerProps {\n options: string[];\n selected: string[];\n onChange: (workflows: string[]) => void;\n placeholder?: string;\n}\n\nexport function WorkflowPicker({ options, selected, onChange, placeholder }: WorkflowPickerProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n const toggle = (wfType: string) => {\n onChange(\n selected.includes(wfType)\n ? selected.filter((t) => t !== wfType)\n : [...selected, wfType],\n );\n };\n\n const remove = (wfType: string) => {\n onChange(selected.filter((t) => t !== wfType));\n };\n\n const placeholderText = placeholder ?? 'Add workflows...';\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex flex-wrap items-center gap-1.5 w-full min-h-[34px] px-2 py-1.5 bg-surface-sunken border border-surface-border rounded-md text-left cursor-pointer hover:border-accent/40 transition-colors focus:ring-1 focus:ring-accent focus:outline-none\"\n >\n {selected.length === 0 && (\n <span className=\"text-xs text-text-tertiary\">{placeholderText}</span>\n )}\n {selected.map((wfType) => (\n <span\n key={wfType}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-lg bg-accent/[0.08] text-text-secondary text-[11px] font-mono\"\n >\n <Workflow className=\"w-2.5 h-2.5 shrink-0 text-accent/75\" />\n {wfType}\n <span\n role=\"button\"\n onClick={(e) => { e.stopPropagation(); remove(wfType); }}\n className=\"ml-0.5 hover:text-status-error transition-colors\"\n >\n <X className=\"w-2.5 h-2.5\" />\n </span>\n </span>\n ))}\n <ChevronDown className={`w-3.5 h-3.5 ml-auto shrink-0 text-text-tertiary transition-transform ${open ? 'rotate-180' : ''}`} />\n </button>\n\n {open && (\n <div className=\"absolute z-20 mt-1 w-full bg-white border border-surface-border rounded-md shadow-lg max-h-48 overflow-y-auto\">\n {options.length === 0 ? (\n <p className=\"px-3 py-2 text-xs text-text-tertiary\">No registered workflows</p>\n ) : (\n options.map((wfType) => {\n const isSelected = selected.includes(wfType);\n return (\n <button\n key={wfType}\n type=\"button\"\n onClick={() => toggle(wfType)}\n className={`flex items-center gap-2 w-full px-3 py-1.5 text-left text-xs font-mono transition-colors ${\n isSelected\n ? 'bg-accent/[0.06] text-accent'\n : 'text-text-primary hover:bg-surface-sunken'\n }`}\n >\n <Workflow className=\"w-3 h-3 shrink-0 text-accent/60\" />\n <span className=\"flex-1\">{wfType}</span>\n {isSelected && <Check className=\"w-3 h-3 shrink-0\" />}\n </button>\n );\n })\n )}\n </div>\n )}\n </div>\n );\n}\n","import { labelCls, hintCls, jsonCls, jsonValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { RolePicker } from '../../../components/common/form/RolePicker';\nimport { WorkflowPicker } from '../../../components/common/form/WorkflowPicker';\nimport { useWorkflowConfigs } from '../../../api/workflows';\nimport { splitCsv } from '../../../lib/parse';\n\ninterface StepProps {\n form: ConfigFormState;\n set: (field: keyof ConfigFormState, value: string | boolean) => void;\n}\n\nfunction csvToArray(csv: string): string[] {\n return splitCsv(csv);\n}\n\nfunction arrayToCsv(arr: string[]): string {\n return arr.join(', ');\n}\n\nexport function AdvancedStep({ form, set }: StepProps) {\n const { data: configs } = useWorkflowConfigs();\n const consumesOptions = (configs ?? [])\n .map((c) => c.workflow_type)\n .filter((t) => t !== form.workflow_type);\n\n return (\n <div className=\"space-y-5\">\n {/* Resolver Schema — always available */}\n <div>\n <label className={labelCls}>Resolver Schema</label>\n <textarea\n value={form.resolver_schema}\n onChange={(e) => set('resolver_schema', e.target.value)}\n placeholder={`{\\n \"properties\": {\\n \"approved\": { \"type\": \"boolean\", \"default\": false, \"description\": \"Approve?\" },\\n \"notes\": { \"type\": \"string\", \"default\": \"\", \"description\": \"Reviewer notes\" }\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n Default form template for resolving escalations from this workflow.\n Use <span className=\"font-mono\">properties</span> with <span className=\"font-mono\">type</span>, <span className=\"font-mono\">default</span>, <span className=\"font-mono\">description</span>, <span className=\"font-mono\">enum</span>, and <span className=\"font-mono\">format</span> for typed form fields.\n </p>\n {form.resolver_schema.trim() && !jsonValid(form.resolver_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n\n {/* Certify toggle */}\n <div className=\"flex gap-6 pt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.certified}\n onChange={(e) => set('certified', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary font-medium\">Certify for HITL Escalation</span>\n </label>\n </div>\n <p className={hintCls}>\n Certified workflows use the interceptor to wrap executions — failures\n escalate to human reviewers instead of throwing.\n </p>\n\n {form.certified ? (\n <>\n {/* Default Escalation Role */}\n <div>\n <label className={labelCls}>Default Escalation Role</label>\n <RolePicker\n selected={csvToArray(form.default_role)}\n onChange={(roles) => set('default_role', roles[0] ?? '')}\n single\n placeholder=\"Select escalation role...\"\n />\n <p className={hintCls}>\n When this workflow escalates, assign to users with this role\n </p>\n </div>\n\n {/* Escalation Roles */}\n <div>\n <label className={labelCls}>Escalation Roles</label>\n <RolePicker\n selected={csvToArray(form.roles)}\n onChange={(roles) => set('roles', arrayToCsv(roles))}\n placeholder=\"Select who can resolve escalations...\"\n />\n <p className={hintCls}>\n Users with any of these roles can claim and resolve escalations from this workflow.\n </p>\n </div>\n\n {/* Consumes */}\n <div>\n <label className={labelCls}>Consumes</label>\n <WorkflowPicker\n options={consumesOptions}\n selected={csvToArray(form.consumes)}\n onChange={(workflows) => set('consumes', arrayToCsv(workflows))}\n placeholder=\"Select workflow dependencies...\"\n />\n <p className={hintCls}>\n Output from these upstream workflows will be injected into the input envelope for this workflow.\n </p>\n </div>\n </>\n ) : (\n <div className=\"py-4 px-4 bg-surface-sunken/50 rounded-md text-center\">\n <p className=\"text-xs text-text-tertiary\">\n This workflow will run as standard durable without the interceptor.\n Enable{' '}\n <span className=\"font-medium text-text-secondary\">\n Certify for HITL Escalation\n </span>{' '}\n to add automatic escalation routing and role-based resolution.\n </p>\n </div>\n )}\n </div>\n );\n}\n","import { labelCls, hintCls, jsonCls, jsonValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { RolePicker } from '../../../components/common/form/RolePicker';\nimport { BotPicker } from '../../../components/common/form/BotPicker';\nimport { splitCsv } from '../../../lib/parse';\nexport { AdvancedStep } from './AdvancedStep';\n\ninterface StepProps {\n form: ConfigFormState;\n set: (field: keyof ConfigFormState, value: string | boolean) => void;\n}\n\ninterface BasicsStepProps extends StepProps {\n editing: boolean;\n durableTypes?: string[];\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction csvToArray(csv: string): string[] {\n return splitCsv(csv);\n}\n\nfunction arrayToCsv(arr: string[]): string {\n return arr.join(', ');\n}\n\n// ── Step 1: Identity ────────────────────────────────────────────────────────\n\nexport function BasicsStep({ form, set, editing, durableTypes = [] }: BasicsStepProps) {\n const showPickList = !editing && durableTypes.length > 0;\n\n return (\n <div className=\"space-y-5\">\n <div>\n <label className={labelCls}>Workflow Type</label>\n {showPickList && !form.workflow_type ? (\n <div className=\"space-y-2\">\n <p className=\"text-xs text-text-secondary\">\n Select a durable workflow to register:\n </p>\n <div className=\"grid gap-1\">\n {durableTypes.map((type) => (\n <button\n key={type}\n onClick={() => set('workflow_type', type)}\n className=\"flex items-center gap-2 px-3 py-2 text-left text-xs font-mono rounded-md border border-surface-border hover:border-accent/50 hover:bg-accent/[0.04] transition-colors\"\n >\n {type}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-2 pt-1\">\n <span className=\"text-[10px] text-text-tertiary\">or</span>\n <input\n type=\"text\"\n onChange={(e) => set('workflow_type', e.target.value)}\n placeholder=\"Enter a workflow type manually\"\n className=\"input font-mono flex-1\"\n />\n </div>\n </div>\n ) : (\n <>\n <input\n type=\"text\"\n value={form.workflow_type}\n onChange={(e) => set('workflow_type', e.target.value)}\n disabled={editing}\n placeholder=\"reviewContent\"\n className=\"input font-mono w-full\"\n />\n {!editing && form.workflow_type && durableTypes.length > 0 && (\n <button\n onClick={() => set('workflow_type', '')}\n className=\"text-[10px] text-accent hover:underline mt-1\"\n >\n Choose from durable workflows\n </button>\n )}\n </>\n )}\n <p className={hintCls}>\n Register a workflow to configure invocation schemas and dashboard visibility. Certification for HITL escalation is optional (step 3).\n </p>\n </div>\n\n <div>\n <label className={labelCls}>Description</label>\n <input\n type=\"text\"\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"AI-powered content moderation with human escalation\"\n className=\"input text-xs w-full\"\n />\n </div>\n\n <div>\n <label className={labelCls}>Task Queue</label>\n <input\n type=\"text\"\n value={form.task_queue}\n onChange={(e) => set('task_queue', e.target.value)}\n placeholder=\"lt-review\"\n className=\"input font-mono w-full\"\n />\n <p className={hintCls}>\n Durable task queue this workflow listens on\n </p>\n </div>\n </div>\n );\n}\n\n// ── Step 2: Invocation ─────────────────────────────────────────────────────\n\nexport function InvocationStep({ form, set }: StepProps) {\n return (\n <div className=\"space-y-5\">\n {/* Invocable toggle */}\n <div className=\"flex gap-6 pt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={form.invocable}\n onChange={(e) => set('invocable', e.target.checked)}\n className=\"w-4 h-4 rounded border-border accent-accent\"\n />\n <span className=\"text-xs text-text-primary font-medium\">Invocable</span>\n </label>\n </div>\n <p className={hintCls}>\n Allow this workflow to be started from the dashboard or API.\n </p>\n\n {form.invocable && (\n <>\n {/* Run As */}\n <div>\n <label className={labelCls}>Run As</label>\n <BotPicker\n selected={form.execute_as}\n onChange={(botId) => set('execute_as', botId)}\n />\n <p className={hintCls}>\n Choose a bot to execute this workflow under its identity and credentials.\n Default runs as the invoking user.\n </p>\n </div>\n\n {/* Invocation roles */}\n <div>\n <label className={labelCls}>Invocation Roles</label>\n <RolePicker\n selected={csvToArray(form.invocation_roles)}\n onChange={(roles) => set('invocation_roles', arrayToCsv(roles))}\n placeholder=\"Select who can start this workflow...\"\n />\n <p className={hintCls}>\n Only users with these roles can start this workflow.\n Leave empty to allow all authenticated users.\n </p>\n </div>\n\n {/* Envelope schema */}\n <div>\n <label className={labelCls}>Envelope Schema</label>\n <textarea\n value={form.envelope_schema}\n onChange={(e) => set('envelope_schema', e.target.value)}\n placeholder={`{\\n \"data\": {\\n \"contentId\": \"example-123\",\\n \"content\": \"Text to review\"\\n },\\n \"metadata\": {\\n \"source\": \"dashboard\"\\n }\\n}`}\n className={jsonCls}\n rows={8}\n spellCheck={false}\n />\n <p className={hintCls}>\n Pre-fills the JSON editor when invoking this workflow.\n Should include <span className=\"font-mono\">data</span> (workflow input) and optional <span className=\"font-mono\">metadata</span> (context).\n </p>\n {form.envelope_schema.trim() && !jsonValid(form.envelope_schema) && (\n <p className=\"text-[10px] text-status-error mt-1\">Invalid JSON</p>\n )}\n </div>\n </>\n )}\n\n {!form.invocable && (\n <div className=\"py-4 px-4 bg-surface-sunken/50 rounded-md text-center\">\n <p className=\"text-xs text-text-tertiary\">\n Enable <span className=\"font-medium text-text-secondary\">Invocable</span> above to configure who can start this workflow and set an input template.\n </p>\n </div>\n )}\n </div>\n );\n}\n\n","import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useParams, useNavigate, useSearchParams } from 'react-router-dom';\nimport { useWorkflowConfigs, useUpsertWorkflowConfig, useJobs } from '../../../api/workflows';\nimport { StepIndicator } from '../../../components/common/layout/StepIndicator';\nimport { PageHeader } from '../../../components/common/layout/PageHeader';\nimport { splitCsv } from '../../../lib/parse';\nimport { EMPTY_FORM, configToForm, STEP_LABELS, isStepValid } from './config-form-types';\nimport type { ConfigFormState } from './config-form-types';\nimport { BasicsStep, InvocationStep, AdvancedStep } from './ConfigWizardSteps';\n\nexport function WorkflowConfigDetailPage() {\n const { workflowType } = useParams<{ workflowType: string }>();\n const isNew = !workflowType;\n const navigate = useNavigate();\n const { data: configs, isLoading } = useWorkflowConfigs();\n const upsert = useUpsertWorkflowConfig();\n\n const editing = configs?.find((c) => c.workflow_type === workflowType) ?? null;\n\n // Fetch known workflow types from jobs to build the pick-list.\n // System workflows (triage, query, routing pipelines) are excluded —\n // they serve the discovery/compilation layer, not user-authored flows.\n const SYSTEM_WORKFLOWS = new Set([\n 'mcpQuery',\n 'mcpDeterministic',\n 'mcpQueryRouter',\n 'mcpTriage',\n 'mcpTriageRouter',\n 'mcpTriageDeterministic',\n 'insightQuery',\n ]);\n const { data: jobsData } = useJobs({ limit: 500 });\n const unregisteredTypes = useMemo(() => {\n const registeredSet = new Set((configs ?? []).map((c) => c.workflow_type));\n const allEntities = new Set((jobsData?.jobs ?? []).map((j) => j.entity));\n return [...allEntities]\n .filter((e) => !registeredSet.has(e) && !SYSTEM_WORKFLOWS.has(e))\n .sort();\n }, [configs, jobsData]);\n\n // Step via URL search param for browser history\n const [searchParams, setSearchParams] = useSearchParams();\n\n // Pre-fill from URL search params when creating new\n const prefillForm = useMemo((): ConfigFormState => {\n if (!isNew) return EMPTY_FORM;\n const prefillType = searchParams.get('workflow_type') ?? '';\n const prefillQueue = searchParams.get('task_queue') ?? '';\n if (!prefillType && !prefillQueue) return EMPTY_FORM;\n return { ...EMPTY_FORM, workflow_type: prefillType, task_queue: prefillQueue };\n }, [isNew, searchParams]);\n\n const [form, setForm] = useState<ConfigFormState>(prefillForm);\n const [schemaError, setSchemaError] = useState('');\n const [initialized, setInitialized] = useState(false);\n const step = parseInt(searchParams.get('step') || '1', 10);\n const setStep = useCallback((s: number) => {\n setSearchParams((prev) => {\n const next = new URLSearchParams(prev);\n next.set('step', String(s));\n return next;\n }, { replace: false });\n }, [setSearchParams]);\n\n\n useEffect(() => {\n if (initialized) return;\n if (isNew) {\n setForm(prefillForm);\n setInitialized(true);\n return;\n }\n if (editing) {\n setForm(configToForm(editing));\n setInitialized(true);\n }\n }, [editing, isNew, initialized, prefillForm]);\n\n const set = (field: keyof ConfigFormState, value: string | boolean) =>\n setForm((f) => ({ ...f, [field]: value }));\n\n // ── Save ────────────────────────────────────────────────────────────────\n\n const handleSave = () => {\n if (!form.workflow_type.trim()) return;\n setSchemaError('');\n\n let envelope_schema: Record<string, unknown> | null = null;\n let resolver_schema: Record<string, unknown> | null = null;\n\n try {\n if (form.envelope_schema.trim()) envelope_schema = JSON.parse(form.envelope_schema);\n } catch {\n setSchemaError('Invalid JSON in Envelope Schema');\n return;\n }\n try {\n if (form.resolver_schema.trim()) resolver_schema = JSON.parse(form.resolver_schema);\n } catch {\n setSchemaError('Invalid JSON in Resolver Schema');\n return;\n }\n\n upsert.mutate(\n {\n workflow_type: form.workflow_type.trim(),\n description: form.description.trim() || null,\n task_queue: form.task_queue.trim() || null,\n default_role: form.default_role.trim() || 'reviewer',\n invocable: form.invocable,\n roles: splitCsv(form.roles),\n invocation_roles: splitCsv(form.invocation_roles),\n consumes: splitCsv(form.consumes),\n envelope_schema,\n resolver_schema,\n cron_schedule: form.cron_schedule.trim() || null,\n execute_as: form.execute_as.trim() || null,\n },\n {\n onSuccess: () => {\n navigate('/workflows/registry');\n },\n },\n );\n };\n\n // ── Loading / Not found ──────────────────────────────────────────────────\n\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-surface-sunken rounded w-48\" />\n <div className=\"h-60 bg-surface-sunken rounded\" />\n </div>\n );\n }\n\n if (!isNew && !editing) {\n return <p className=\"text-sm text-text-secondary\">Config not found.</p>;\n }\n\n // ── Render ──────────────────────────────────────────────────────────────\n\n const isLast = step === STEP_LABELS.length;\n return (\n <div>\n <PageHeader title={isNew ? 'Register Workflow' : editing?.workflow_type ?? ''} />\n\n <div className=\"max-w-3xl\">\n <StepIndicator steps={STEP_LABELS} currentStep={step - 1} onStepClick={(i) => setStep(i + 1)} />\n\n <div className=\"min-h-[360px] py-2\">\n {step === 1 && <BasicsStep form={form} set={set} editing={!!editing} durableTypes={unregisteredTypes} />}\n {step === 2 && <InvocationStep form={form} set={set} />}\n {step === 3 && <AdvancedStep form={form} set={set} />}\n </div>\n\n {(schemaError || upsert.error) && (\n <p className=\"text-xs text-status-error mt-4\">\n {schemaError || (upsert.error as Error).message}\n </p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between items-center pt-4 border-t border-surface-border mt-4\">\n <div>\n {step > 1 && (\n <button\n onClick={() => setStep(step - 1)}\n className=\"btn-secondary text-xs\"\n >\n Back\n </button>\n )}\n </div>\n <div className=\"flex gap-3\">\n <button onClick={() => navigate('/workflows/registry')} className=\"btn-ghost text-xs\">\n Cancel\n </button>\n {isLast ? (\n <button\n onClick={handleSave}\n disabled={!isStepValid(step, form) || upsert.isPending}\n className=\"btn-primary text-xs\"\n >\n {upsert.isPending ? 'Saving...' : editing ? 'Save' : 'Create'}\n </button>\n ) : (\n <button\n onClick={() => setStep(step + 1)}\n disabled={!isStepValid(step, form)}\n className=\"btn-primary text-xs\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n"],"names":["matchesSearch","wf","search","q","WorkflowConfigsPage","navigate","useNavigate","data","isLoading","useDiscoveredWorkflows","deleteConfig","useDeleteWorkflowConfig","filters","setFilter","useFilterParams","searchInput","setSearchInput","useState","confirmDelete","setConfirmDelete","useEffect","timer","allWorkflows","queues","useMemo","w","roles","workflows","result","columns","row","jsxs","jsx","WorkflowPill","TaskQueuePill","ShieldCheck","Settings","Wrench","escRoles","invokeRoles","r","RolePill","UserCheck","RowActionGroup","RowAction","Play","ShieldPlus","ShieldOff","handleDelete","handleRowClick","PageHeader","FilterBar","e","FilterSelect","v","DataTable","ConfirmDeleteModal","Fragment","splitCsv","s","EMPTY_FORM","configToForm","c","consumes","STEP_LABELS","jsonValid","isStepValid","step","form","labelCls","hintCls","jsonCls","RolePicker","selected","onChange","single","placeholder","useRoles","allRoles","open","setOpen","ref","useRef","handler","toggle","role","remove","placeholderText","User","X","ChevronDown","isSelected","Check","WorkflowPicker","options","wfType","t","Workflow","csvToArray","csv","arrayToCsv","arr","AdvancedStep","set","configs","useWorkflowConfigs","consumesOptions","BasicsStep","editing","durableTypes","showPickList","type","InvocationStep","BotPicker","botId","WorkflowConfigDetailPage","workflowType","useParams","isNew","upsert","useUpsertWorkflowConfig","SYSTEM_WORKFLOWS","jobsData","useJobs","unregisteredTypes","registeredSet","j","searchParams","setSearchParams","useSearchParams","prefillForm","prefillType","prefillQueue","setForm","schemaError","setSchemaError","initialized","setInitialized","setStep","useCallback","prev","next","field","value","f","handleSave","envelope_schema","resolver_schema","isLast","StepIndicator","i"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{u as n}from"./vendor-query-B2UbickB.js";import{b as u}from"./index-BnB7G5bA.js";function a(t={}){const e=new URLSearchParams;return t.limit&&e.set("limit",String(t.limit)),t.offset!==void 0&&e.set("offset",String(t.offset)),t.entity&&e.set("entity",t.entity),t.search&&e.set("search",t.search),t.status&&e.set("status",t.status),t.sort_by&&e.set("sort_by",t.sort_by),t.order&&e.set("order",t.order),e.set("app_id",t.app_id||"longtail"),n({queryKey:["mcpRuns",t],queryFn:()=>u(`/mcp-runs?${e}`)})}function o(t="longtail"){return n({queryKey:["mcpEntities",t],queryFn:()=>u(`/mcp-runs/entities?app_id=${t}`)})}function r(t,e="longtail"){return n({queryKey:["mcpRunExecution",t,e],queryFn:()=>u(`/mcp-runs/${t}/execution?app_id=${e}`),enabled:!!t})}export{o as a,r as b,a as u};
2
- //# sourceMappingURL=mcp-runs-BN5MrKai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-runs-BN5MrKai.js","sources":["../../src/api/mcp-runs.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { apiFetch } from './client';\nimport type { LTJob, WorkflowExecution } from './types';\n\ninterface McpRunFilters {\n limit?: number;\n offset?: number;\n entity?: string;\n search?: string;\n status?: string;\n app_id?: string;\n sort_by?: string;\n order?: string;\n}\n\nexport function useMcpRuns(filters: McpRunFilters = {}) {\n const params = new URLSearchParams();\n if (filters.limit) params.set('limit', String(filters.limit));\n if (filters.offset !== undefined) params.set('offset', String(filters.offset));\n if (filters.entity) params.set('entity', filters.entity);\n if (filters.search) params.set('search', filters.search);\n if (filters.status) params.set('status', filters.status);\n if (filters.sort_by) params.set('sort_by', filters.sort_by);\n if (filters.order) params.set('order', filters.order);\n params.set('app_id', filters.app_id || 'longtail');\n\n return useQuery<{ jobs: LTJob[]; total: number }>({\n queryKey: ['mcpRuns', filters],\n queryFn: () => apiFetch(`/mcp-runs?${params}`),\n });\n}\n\nexport function useMcpEntities(appId = 'longtail') {\n return useQuery<{ entities: string[] }>({\n queryKey: ['mcpEntities', appId],\n queryFn: () => apiFetch(`/mcp-runs/entities?app_id=${appId}`),\n });\n}\n\nexport function useMcpRunExecution(jobId: string, appId = 'longtail') {\n return useQuery<WorkflowExecution>({\n queryKey: ['mcpRunExecution', jobId, appId],\n queryFn: () => apiFetch(`/mcp-runs/${jobId}/execution?app_id=${appId}`),\n enabled: !!jobId,\n });\n}\n"],"names":["useMcpRuns","filters","params","useQuery","apiFetch","useMcpEntities","appId","useMcpRunExecution","jobId"],"mappings":"uFAeO,SAASA,EAAWC,EAAyB,GAAI,CACtD,MAAMC,EAAS,IAAI,gBACnB,OAAID,EAAQ,OAAOC,EAAO,IAAI,QAAS,OAAOD,EAAQ,KAAK,CAAC,EACxDA,EAAQ,SAAW,QAAWC,EAAO,IAAI,SAAU,OAAOD,EAAQ,MAAM,CAAC,EACzEA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,QAAQC,EAAO,IAAI,SAAUD,EAAQ,MAAM,EACnDA,EAAQ,SAASC,EAAO,IAAI,UAAWD,EAAQ,OAAO,EACtDA,EAAQ,OAAOC,EAAO,IAAI,QAASD,EAAQ,KAAK,EACpDC,EAAO,IAAI,SAAUD,EAAQ,QAAU,UAAU,EAE1CE,EAA2C,CAChD,SAAU,CAAC,UAAWF,CAAO,EAC7B,QAAS,IAAMG,EAAS,aAAaF,CAAM,EAAE,CAAA,CAC9C,CACH,CAEO,SAASG,EAAeC,EAAQ,WAAY,CACjD,OAAOH,EAAiC,CACtC,SAAU,CAAC,cAAeG,CAAK,EAC/B,QAAS,IAAMF,EAAS,6BAA6BE,CAAK,EAAE,CAAA,CAC7D,CACH,CAEO,SAASC,EAAmBC,EAAeF,EAAQ,WAAY,CACpE,OAAOH,EAA4B,CACjC,SAAU,CAAC,kBAAmBK,EAAOF,CAAK,EAC1C,QAAS,IAAMF,EAAS,aAAaI,CAAK,qBAAqBF,CAAK,EAAE,EACtE,QAAS,CAAC,CAACE,CAAA,CACZ,CACH"}